You are on page 1of 16

OHOA MAY TNH

Dng Anh c, Lenh Duy Cac thuat toan tomau 1/ 16


C CC C
C CC C
a aa a
a aa a


c cc c
c cc c
t tt t
t tt t
h hh h
h hh h
u uu u
u uu u
a aa a
a aa a


t tt t
t tt t
t tt t
t tt t
o oo o
o oo o
a aa a
a aa a


n nn n
n nn n
t tt t
t tt t
o oo o
o oo o


m mm m
m mm m
a aa a
a aa a


u uu u
u uu u
D Da a n n n nh ha a p p
Mot vung t ot hng c xac nh bi mot ng
khep kn nao ogoi l ang bi en. Dang ng bi en
n gi an t hng gap l aa gi ac.
Cohai dang vung t ot hng gap : t obang mot mau
t huan nhat (sol i d fi l l ) vat ot heo mot mau t o(fi l l -
pat t er n) nao o.
Vi ec t omau t hng c chi a l am hai cong oan :
Xac nh vt r cac i em can t omau.
Quyet nh t ocac i em t r en bang mau nao. Cong oan
nay t hc s phc t ap khi t a can t ot heo mot mau t onao
ochkhong phai t ot huan mot mau.
Cohai cach t i ep can chnh : t omau t heo dong quet
vat omau da t heo ng bi en.
Phng phap t omau da t heo dong quet sexac nh
phan gi ao cua cac dong quet ket i ep nhau vi ng bi en
cua vung t o, sau oset i en hanh t omau cac i em t huoc
phan gi ao nay. Cach nay t hng c dung et omau a
gi ac, ng t r on, el l i pse vamot song cong n gi an
khac.
Phng phap t omau da t heo ng bi en sebat au t
mot i em ben t r ong vung t ovat ol oang dan r a cho
en khi gap i em bi en. Cach nay t hng c dung cho
cac dang ng bi en phc t ap.
OHOA MAY TNH
Dng Anh c, Lenh Duy Cac thuat toan tomau 2/ 16
T TT T
T TT T
h hh h
h hh h
u uu u
u uu u
a aa a
a aa a


t tt t
t tt t
t tt t
t tt t
o oo o
o oo o
a aa a
a aa a


n nn n
n nn n
t tt t
t tt t
o oo o
o oo o


t tt t
t tt t
h hh h
h hh h
e ee e
e ee e
o oo o
o oo o
d dd d
d dd d
o oo o
o oo o


n nn n
n nn n
g gg g
g gg g
q qq q
q qq q
u uu u
u uu u
e ee e
e ee e


t tt t
t tt t
Bai t oan at r a : Can t omau mot a gi ac cho bi N nh
( ) 1 ,... 0 , , = N i y x P
i i i . a gi ac nay cot hel aa gi ac l oi , a
gi ac l om, vacaa gi ac t cat ,
T To o m m t t a a t t c ca a c c b b c c c ch h n nh h c cu u a a t t h hu ua a t t t t o oa a n n
Tm t op
y
, bot t om
y
l an l t l agi at r l n nhat , nho
nhat cua t ap cac t ung ocua cac nh cua a gi ac a
cho:
( ) { } P y x y y
i i i t op
= , , max
,
( ) { } P y x y y
i i i bot t om
= , , mi n
.
ng vi moi dong quet
k y =
, vi
k
t hay oi t
bot t om
y
en t op
y
, l ap :
Tm t at cacac hoanh ogi ao i em cua dong quet
k y =
vi cac canh cua a gi ac.
Sap xep cac hoanh ogi ao i em t heo t ht t ang dan :
,..., , ,
2 1 0
x x x
Tomau cac oan t hang t r en ng t hang
k y =
l an l t
c gi i han bi cac cap
( ) ( ) ( )
1 2 2 2 1 1 0
, ,..., , , ,
+ k k
x x x x x x
.
O
y
0 1 2 3
x
y
bottom
y
top
OHOA MAY TNH
Dng Anh c, Lenh Duy Cac thuat toan tomau 3/ 16
C Ca a c c v va a n n e e a a t t r r a a
Han chec socanh can t m gi ao i em ng vi moi
dong quet v ng vi moi dong quet , khong phai l uc
nao t at cacac canh cua a gi ac cung t ham gi a cat
dong quet .
Xac nh nhanh hoanh ogi ao i em v neu l ap l ai
t hao t ac t m gi ao i em cua canh a gi ac vi moi
dong quet bang cach gi ai hephng t r nh set on r at
nhi eu t hi gi an.
Gi ai quyet t r ng hp sogi ao i em ng vi t r ng
hp dong quet i ngang qua nh : Neu sogi ao i em
t m c gi a cac canh a gi ac vadong quet l al et h
vi ec nhom t ng cap gi ao i em ket i ep nhau ehnh
t hanh cac oan t ocot hesekhong chnh xac. i eu
nay chxay r a khi dong quet i ngang qua cac nh
cua a gi ac.
Ngoai r a, vi ec t m gi ao i em cua dong quet vi cac
canh nam ngang l amot t r ng hp ac bi et can
phai cocach xl t hch hp
y=k
1
y=k
2
0 1,2
3 4
0
1,2 3
OHOA MAY TNH
Dng Anh c, Lenh Duy Cac thuat toan tomau 4/ 16
T To o c ch h c c c ca a u u t t r r u u c c d d l l i i e e u u v va a t t h hu ua a t t t t o oa a n n
Danh sach cac canh (Edge Tabl e ET) : cha t oan
bocac canh cua a gi ac (al oai i cac canh nam
ngang) c sap t heo t ht t ang dan cua Mi n
y
.
Danh sach cac canh kch hoat (Act i ve Edge Tabl e
AET) : cha cac canh cua a gi ac cot hecat ng vi
dong quet hi en hanh, cac canh nay c sap t heo
t ht t ang dan cua hoanh ogi ao i em gi a canh
vadong quet .
Khi dong quet i t bot t om en t op, cac canh t hoa
i eu ki en sec di chuyen t ET sang AET:
Khi dong quet
k y =
bat au cat mot canh, ngha l a
Mi n
y k
, canh nay sec chuyen t ET sang AET.
Khi dong quet khong con cat canh nay na, ngha l a
Max
y k >
, canh nay sebl oai r a khoi AET.
Khi khong con canh nao t r ong ET hay AET na, qua
t r nh t omau ket t huc.
et m gi ao i em gi a canh a gi ac vadong quet
hi en hanh nhanh, t a conhan xet :
( ) ( )
m
k k
m
x x
k k
1
1
1
1
= + =
+
hay
m
x x
k k
1
1
+ =
+
.
y=k+1
y=k
x
k
x
k+1
OHOA MAY TNH
Dng Anh c, Lenh Duy Cac thuat toan tomau 5/ 16
e e x xu ua a t t c ca a u u t t r r u u c c d d l l i i e e u u c cu u a a m mo o t t c ca a n nh h ( (E ED DG GE E) )
Mi n
y
: gi at r t ung onhonhat t r ong 2 nh cua
canh.

t xInter sec
: hoanh ogi ao i em cua canh vi dong
quet hi en hanh.

DxPerScan
: gi at r 1/m (m l ahesogoc cua canh).

deltaY
: khoang cach t dong quet hi en hanh t i nh
Max
y
. Luc nay i eu ki en
Max
y k >
t r t hanh
0 deltaY
.
Gi at r
t xInter sec
c khi gan ban au l ahoanh o
cua nh cot ung ol a Mi n
y
, vagi at r
deltaY
c
khi gan ban au l a
1 +
Min Max
y y
.
yMin
xIntersect
y=k
deltaY
OHOA MAY TNH
Dng Anh c, Lenh Duy Cac thuat toan tomau 6/ 16
G Gi i a a i i q qu uy ye e t t t t r r n ng g h h p p d do o n ng g q qu ue e t t i i q qu ua a n nh h
Tnh mot gi ao i em neu chi eu cua hai canh kecua
nh ocoxu hng t ang hay gi am.
Tnh hai gi ao i em neu chi eu cua hai canh kecua
nh ocoxu hng t hay oi , ngha l at ang-gi am
hay gi am-t ang.
Khi cai at ekhoi phai xet i eu ki en nay cho phc
t ap, khi xay dng dl i eu cho moi canh t r c khi a
vao ET, ngi t a sexl cac canh conh t nh hai
gi ao i em bang cach l oai i mot pi xel t r en cung cua
mot t r ong hai canh.
(a) (b)
P
i
P
i-1
P
i+1
P
i
P
i-1
P
i+1
P
i-1
P
i-1
P
i+1
P
i+1
P
i
P
i
y=k
P
i-1
P
i
P
i+1
y=k-1
P
i+1
y=k
P
i+1
P
i
P
i-1
y=k-1
P
i-1
P
i
*
P
i
*
P
i-1
P
i+1
OHOA MAY TNH
Dng Anh c, Lenh Duy Cac thuat toan tomau 7/ 16
M Mi i n nh h h ho o a a t t h hu ua a t t t t o oa a n n
Ban au :
ET : AB*, AI, H*G, BC, G*F, DC, EF. (loai IH vaDE)
AET : NULL.
Khi dong quet at y=y
A
ET : H*G, BC, G*F, DC, EF. (chuyen AB*, AI sang AET)
AET : AB*, AI.
Khi dong quet at y=y
H*
ET : BC, G*F, DC, EF. (chuyen H*G sang AET)
AET : AB*, H*G. (loai AI v khong con cat dong quet)
Top
F
E D
C
B
G
H I
A
Bottom
y
B
y
G*
=y
G
+1
y
B*
=y
B
-1
y
G
y
H*
=y
H
+1
y
H
OHOA MAY TNH
Dng Anh c, Lenh Duy Cac thuat toan tomau 8/ 16
Khi dong quet at y=y
B
ET : G*F, DC, EF. (chuyen BC sang AET)
AET : BC, H*G. (loai AB*, sap xep lai H*G vaBC)
Khi dong quet at y=y
G*
ET : DC, EF. (chuyen G*F sang AET)
AET : BC, G*F. (loai H*G v khong con cat dong quet)
Khi dong quet at y=y
D
ET : NULL. (chuyen DC, EF sang AET)
AET : BC, DC, EF, G*F. (sap xep lai BC, GF*, DC, EF)
Khi dong quet at y=y
C
+1
ET : NULL.
AET : EF, G*F. (loai BC, DC v khong con cat dong quet)
Khi dong quet at y=y
F
+1
ET : NULL.
AET : NULL. (loai EF, G*F v khong con cat dong quet).
Thuat t oan dng t ai ay.
OHOA MAY TNH
Dng Anh c, Lenh Duy Cac thuat toan tomau 9/ 16
Lu othuat toan tomau theo dong quet
Begin
Tao danh sac h tat c ac ac c anh ET
i<TopScan
i=BottomScan
Yes
No
Cap nhat danh sac h c ac c anh
kc h hoat AET
Tm hoanh ogiao iem vasap xep
theo thttang dan
Tomau c ac oan giao c tao bi
tng c ap hoanh oketiep nhau
Cap nhat lai thong tin c ua c ac c anh
esdung c ho dong quet ketiep
i=i+1
End
OHOA MAY TNH
Dng Anh c, Lenh Duy Cac thuat toan tomau 10/ 16
M Mo o t t s so o h h n ng g d da a n n c ca a i i a a t t
#define MAXVERTEX 20
#define MAXEDGE 20
#define TRUE 1
#define FALSE 0
typedef struct {
int x;
int y;
}POINT;
typedef struct{
int NumVertex;
POINT aVertex[MAXVERTEX];
}POLYGON;
typedef struct {
int NumPt;
float xPt[MAXEDGE];
}XINTERSECT;
typedef struct
{
int yMin; // Gia tri y nho nhat cua 2 dinh
float xIntersect; // Hoanh do giao diem cua canh & dong quet
float dxPerScan; // Gia tri 1/m
int DeltaY;
}EDGE;
typedef struct
{
int NumEdge;
EDGE aEdge[MAXEDGE];
}EDGELIST;
OHOA MAY TNH
Dng Anh c, Lenh Duy Cac thuat toan tomau 11/ 16
void PutEdgeInList(EDGELIST &EdgeList, POINT p1, POINT p2, int NextY)
{
EDGE EdgeTmp;
EdgeTmp.dxPerScan = float(p2.x-p1.x)/(p2.y-p1.y); // 1/m
if(p1.y < p2.y)
{
/*
Truong hop dong quet di ngang qua dinh la giao diem
cua 2 canh co huong y cung tang
*/
if(p2.y < NextY)
{
p2.y--;
p2.x -= EdgeTmp.dxPerScan;
}
EdgeTmp.yMin = p1.y;
EdgeTmp.xIntersect= p1.x;
EdgeTmp.DeltaY = abs(p2.y-p1.y)+1;
} // if
else
{
/*
Truong hop dong quet di ngang qua dinh la giao diem cua 2 canh co
huong y cung giam
*/
if(p2.y > NextY)
{
p2.y++;
p2.x+= EdgeTmp.dxPerScan;
}
EdgeTmp.yMin = p2.y;
EdgeTmp.xIntersect= p2.x;
EdgeTmp.DeltaY = abs(p2.y-p1.y)+1;
}//else
// xac dinh vi tri chen
int j = EdgeList.NumEdge;
while((j>0) && (EdgeList.aEdge[j-1].yMin>EdgeTmp.yMin))
{
EdgeList.aEdge[j] = EdgeList.aEdge[j-1];
j--;
}
// tien hanh chen dinh moi vao canh
EdgeList.NumEdge++;
EdgeList.aEdge[j] = EdgeTmp;
} // PutEdgeInList
OHOA MAY TNH
Dng Anh c, Lenh Duy Cac thuat toan tomau 12/ 16
/*
Tim dinh ke tiep sao cho khong nam tren cung duong thang voi dinh dang
xet
*/
int FindNextY(POLYGON P, int id)
{
int j = (id+1)%P.NumVertex;
while((j<P.NumVertex)&&(P.aVertex[id].y == P.aVertex[j].y))
j++;
if(j<P.NumVertex)
return (P.aVertex[j].y);
return 0;
} // FindNextY
// Tao danh sach cac canh tu polygon da cho
void MakeSortedEdge(POLYGON P, EDGELIST &EdgeList,
int &TopScan, int &BottomScan)
{
TopScan = BottomScan = P.aVertex[0].y;
EdgeList.NumEdge = 0;
for(int i=0; i<P.NumVertex; i++)
{
// Truong hop canh khong phai la canh nam ngang
if(P.aVertex[i].y != P.aVertex[i+1].y)
PutEdgeInList(EdgeList, P.aVertex[i], P.aVertex[i+1], FindNextY(P,
i+1));
// Xu li truong hop canh nam ngang
else
if(P.aVertex[i+1].y > TopScan)
TopScan = P.aVertex[i+1].y;
}
BottomScan = EdgeList.aEdge[0].yMin;
} //MakeSortedEdge
// Cap nhat lai hai con tro FirstId, LastId cho biet danhsach cac canh active
void UpdateActi veEdgeList(EDGELIST EdgeList, int yScan, int &FirstId, int
&LastId)
{
while((FirstId<EdgeList.NumEdge-1) &&(EdgeList.aEdge[FirstId].DeltaY ==
0))
FirstId++;
while((LastId<EdgeList.NumEdge-1)
&&(EdgeList.aEdge[LastId+1].yMin<=yScan))
LastId++;
} // UpdateActiveEdgeList
OHOA MAY TNH
Dng Anh c, Lenh Duy Cac thuat toan tomau 13/ 16
T TT T
T TT T
h hh h
h hh h
u uu u
u uu u
a aa a
a aa a


t tt t
t tt t
t tt t
t tt t
o oo o
o oo o
a aa a
a aa a


n nn n
n nn n
t tt t
t tt t
o oo o
o oo o


m mm m
m mm m
a aa a
a aa a


u uu u
u uu u
t tt t
t tt t
h hh h
h hh h
e ee e
e ee e
o oo o
o oo o








n nn n
n nn n
g gg g
g gg g
b bb b
b bb b
i ii i
i ii i
e ee e
e ee e


n nn n
n nn n
Bai t oan at r a : Can t omau vung t oneu bi et c
mau cua ng bi en vung t ovamot i em nam ben
t r ong vung t o.
Yt ng : Bat au t i em nam ben t r ong vung t o,
ki em t r a cac i em l an can cua noac t ohay co
phai l ai em comau t r ung mau bi en hay khong, neu
khong phai t h t a set oi em o. Quat r nh nay c
l ap l ai cho t i khi khong con t oc na t h dng.
OHOA MAY TNH
Dng Anh c, Lenh Duy Cac thuat toan tomau 14/ 16
Cohai quan i em vecach t onay, ol adung 4 i em
l an can (hnh a) hay 8 i em l an can (hnh b).
Cai at mi nh hoa t huat t oan t omau t heo ng bi en
void BoundaryFill(int x, int y, int FillColor, int BoundaryColor)
{
int CurrenColor;
CurrentColor = getpixel(x,y);
if((CurrentColor!=BoundaryColor)&&CurrentColor!= FillColor))
{
putpixel(x,y,FillColor);
BoundaryFill(x-1, y, FillColor, BoundaryColor);
BoundaryFill(x, y+1, FillColor, BoundaryColor);
BoundaryFill(x+1, y, FillColor, BoundaryColor);
BoundaryFill(x, y-1, FillColor, BoundaryColor);
}
} // Boundary Fill
Mot sonhan xet
Thuat t oan cot hehoat ong khong chnh xac khi comot
soi em nam t r ong vung t ocomau l amau can t ocua
vung.
Vi ec t hc hi en equi l am t huat t oan khong t hedung cho
vung t ol n.
(a) (b)
OHOA MAY TNH
Dng Anh c, Lenh Duy Cac thuat toan tomau 15/ 16
Mot cai t i en nho: nhan xet r ang vi ec goi t hc hi en
equi t huat t oan cho 4 i em l an can cua i em hi en
hanh khong quan t am t i mot t r ong 4 i em oa
c xet bc t r c hay cha. V du khi t a xet 4
i em l an can cua (x, y), t h khi goi t hc hi en equi
vi i em hi en hanh l amot t r ong 4 i em t r en, (x, y)
van c xem l ai em l an can cua chung vac goi
t hc hi en l ai .
void BoundaryFillEnhanced(int x, int y, int F_Color, int B_Color)
{
int CurrenColor;
CurrentColor = getpixel(x,y);
if((CurrentColor!=B_Color)&&CurrentColor!= F_Color))
{
putpixel(x,y,F_Color);
FillLeft(x-1, y, F_Color, B_Color);
FillTop(x, y+1, F_Color, B_Color);
FillRight(x+1, y, F_Color, B_Color);
FillBottom(x, y-1, F_Color, B_Color);
}
} // BoundaryFillEnhanced
void FillLeft(int x, int y, int F_Color, int B_Color)
{
int CurrenColor;
CurrentColor = getpixel(x,y);
if((CurrentColor!=B_Color)&&CurrentColor!= F_Color))
{
putpixel(x,y,F_Color);
FillLeft(x-1, y, F_Color, B_Color);
FillTop(x, y+1, F_Color, B_Color);
FillBottom(x, y-1, F_Color, B_Color);
}
} // FillLeft
OHOA MAY TNH
Dng Anh c, Lenh Duy Cac thuat toan tomau 16/ 16
Mot cai t i en khac : khong cai at equi mat ot heo
t ng dong.

You might also like