1. Trang chủ
  2. » Công Nghệ Thông Tin

Area Filling

16 490 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Các Thuật Toán Tô Màu
Tác giả Dương Anh Đức, Lê Đình Duy
Trường học Đại Học Bách Khoa Hà Nội
Chuyên ngành Đồ Họa Máy Tính
Thể loại Đồ án
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 16
Dung lượng 194,54 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Area Filling Bài giảng đồ họa

Trang 1

CCCCaaaáùùùcccc tttthhhhuuuuaaaậääätttt ttttooooaaaáùùùnnnn ttttoooôâââ maaaàøøøuuuu

Dẫn nhập

khép kín nào đó gọi là đường biên Dạng đường biên đơn giản thường gặp là đa giác

thuần nhất (solid fill) và tô theo một mẫu tô (fill-pattern) nào đó

♦ Xác định vị trí các điểm cần tô màu.

♦ Quyết định tô các điểm trên bằng màu nào Công đoạn này thực sự phức tạp khi ta cần tô theo một mẫu tô nào đó chứ không phải tô thuần một màu.

và tô màu dựa theo đường biên

♦ Phương pháp tô màu dựa theo dòng quét sẽ xác định phần giao của các dòng quét kế tiếp nhau với đường biên của vùng tô, sau đó sẽ tiến hành tô màu các điểm thuộc phần giao này Cách này thường được dùng để tô màu đa giác, đường tròn, ellipse và một số đường cong đơn giản khác.

♦ Phương pháp tô màu dựa theo đường biên sẽ bắt đầu từ một điểm bên trong vùng tô và từ đó loang dần ra cho đến khi gặp điểm biên Cách này thường được dùng cho

Trang 2

TTTThhhhuuuuaaaậääätttt ttttooooaaaáùùùnnnn ttttoooôâââ tttthhhheeeeoooo ddddoooòøøønnnngggg qqqquuuueeeéùùùtttt

Bài toán đặt ra : Cần tô màu một đa giác cho bởi N đỉnh

(x , y ),i = 0, N −1

giác lõm, và cả đa giác tự cắt, …

Tóm tắt các bước chính của thuật toán

• Tìm y top, ybottom lần lượt là giá trị lớn nhất, nhỏ

nhất của tập các tung độ của các đỉnh của đa giác đã cho: y top = max{y i,(x i,y i)∈ P}, y bottom = min{y i,(x i,y i)∈P}

bottom

♦ Tìm tất cả các hoành độ giao điểm của dòng quét y = k

với các cạnh của đa giác.

♦ Sắp xếp các hoành độ giao điểm theo thứ tự tăng dần :

, , ,

0 x x x

♦ Tô màu các đoạn thẳng trên đường thẳng y = klần lượt

được giới hạn bởi các cặp (x0,x1) (, x1,x2) (, , x2k,x2 +1).

y

ytop

Trang 3

Các vấn đề đặt ra

dòng quét vì ứng với mỗi dòng quét, không phải lúc nào tất cả các cạnh của đa giác cũng tham gia cắt dòng quét

thao tác tìm giao điểm của cạnh đa giác với mỗi dòng quét bằng cách giải hệ phương trình sẽ tốn rất nhiều thời gian

hợp dòng quét đi ngang qua đỉnh : Nếu số giao điểm tìm được giữa các cạnh đa giác và dòng quét là lẻ thì việc nhóm từng cặp giao điểm kế tiếp nhau để hình thành các đoạn tô có thể sẽ không chính xác Điều này chỉ xảy ra khi dòng quét đi ngang qua các đỉnh của đa giác

cạnh nằm ngang là một trường hợp đặc biệt cần phải có cách xử lí thích hợp

y=k1 y=k2

Trang 4

Tổ chức cấu trúc dữ liệu và thuật toán

bộ các cạnh của đa giác (đã loại đi các cạnh nằm

ngang) được sắp theo thứ tự tăng dần của yMin .

AET) : chứa các cạnh của đa giác có thể cắt ứng với dòng quét hiện hành, các cạnh này được sắp theo thứ tự tăng dần của hoành độ giao điểm giữa cạnh và dòng quét

điều kiện sẽ được di chuyển từ ET sang AET:

♦ Khi dòng quét y = k bắt đầu cắt một cạnh, nghĩa là

Min

y

k ≥ , cạnh này sẽ được chuyển từ ET sang AET.

♦ Khi dòng quét không còn cắt cạnh này nữa, nghĩa là

Max

y

k > , cạnh này sẽ bị loại ra khỏi AET.

♦ Khi không còn cạnh nào trong ET hay AET nữa, quá trình tô màu kết thúc.

hiện hành nhanh, ta có nhận xét :

m x

m x

y=k+1 y=k

xk+1

Trang 5

Đề xuất cấu trúc dữ liệu của một cạnh (EDGE)

cạnh

xInter sec t : hoành độ giao điểm của cạnh với dòng

quét hiện hành.

DxPerScan : giá trị 1/m (m là hệ số góc của cạnh)

deltaY : khoảng cách từ dòng quét hiện hành tới đỉnh

Max

0

deltaY

yMin

xIntersect

y=k

deltaY

Trang 6

Giải quyết trường hợp dòng quét đi qua đỉnh

đỉnh đó có xu hướng tăng hay giảm

đỉnh đó có xu hướng thay đổi, nghĩa là tăng-giảm hay giảm-tăng

tạp, khi xây dựng dữ liệu cho mỗi cạnh trước khi đưa vào ET, người ta sẽ xử lí các cạnh có đỉnh tính hai giao điểm bằng cách loại đi một pixel trên cùng của một trong hai cạnh

Pi

Pi-1

Pi+1

Pi

Pi-1

Pi+1

Pi-1

Pi-1

Pi+1

Pi+1

Pi

Pi

y=k

Pi-1

Pi

Pi+1

y=k-1

Pi+1

y=k

Pi+1

Pi

Pi-1

y=k-1

Pi-1

Trang 7

Minh họa thuật toán

ET : AB*, AI, H*G, BC, G*F, DC, EF (loại IH và DE)

AET : NULL.

ET : H*G, BC, G*F, DC, EF (chuyển AB*, AI sang AET)

AET : AB*, AI.

ET : BC, G*F, DC, EF (chuyển H*G sang AET)

AET : AB*, H*G (loại AI vì không còn cắt dòng quét)

Top

F

E D

C

B

G

H I

yB

yG*=yG+1

yB*=yB-1

yG

yH*=yH+1

yH

Trang 8

• Khi dòng quét đạt y=yB

ET : G*F, DC, EF (chuyển BC sang AET)

AET : BC, H*G (loại AB*, sắp xếp lại H*G và BC)

ET : DC, EF (chuyển G*F sang AET)

AET : BC, G*F (loại H*G vì không còn cắt dòng quét)

ET : NULL (chuyển DC, EF sang AET)

AET : BC, DC, EF, G*F (sắp xếp lại BC, GF*, DC, EF)

ET : NULL.

AET : EF, G*F (loại BC, DC vì không còn cắt dòng quét)

ET : NULL.

AET : NULL (loại EF, G*F vì không còn cắt dòng quét).

Trang 9

Lưu đồ thuật toán tô màu theo dòng quét

Begin

Tạo danh sách tất cả các cạnh ET

i<TopScan i=BottomScan

Yes

No

Cập nhật danh sách các cạnh

kích hoạt AET

Tìm hoành độ giao điểm và sắp xếp

theo thứ tự tăng dần

Tô màu các đoạn giao được tạo bởi từng cặp hoành độ kế tiếp nhau

Cập nhật lại thông tin của các cạnh để sử dụng cho dòng quét kế tiếp

i=i+1

End

Trang 10

Một số hướng dẫn cài đặt

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

int DeltaY;

}EDGE;

typedef struct

{

int NumEdge;

EDGE aEdge[MAXEDGE];

}EDGELIST;

Trang 11

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;

Trang 12

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 UpdateActiveEdgeList(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++;

Trang 13

TTTThhhhuuuuaaaậääätttt ttttooooaaaáùùùnnnn ttttoooôâââ maaaàøøøuuuu tttthhhheeeeoooo

đđđđưưưươơơờøøønnnngggg bbbbiiiieeeêââânnnn

màu của đường biên vùng tô và một điểm nằm bên trong vùng tô

kiểm tra các điểm lân cận của nó đã được tô hay có phải là điểm có màu trùng màu biên hay không, nếu không phải thì ta sẽ tô điểm đó Quá trình này được lặp lại cho tới khi không còn tô được nữa thì dừng

Trang 14

• Có hai quan điểm về cách tô này, đó là dùng 4 điểm lân cận (hình a) hay 8 điểm lân cận (hình b)

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

♦ Thuật toán có thể hoạt động không chính xác khi có một số điểm nằm trong vùng tô có màu là màu cần tô của vùng.

♦ Việc thực hiện đệ qui làm thuật toán không thể dùng cho vùng tô lớn.

Trang 15

• Một cải tiến nhỏ : nhận xét rằng việc gọi thực hiện đệ qui thuật toán cho 4 điểm lân cận của điểm hiện hành không quan tâm tới một trong 4 điểm đó đã được xét ở bước trước hay chưa Ví dụ khi ta xét 4 điểm lân cận của (x, y), thì khi gọi thực hiện đệ qui với điểm hiện hành là một trong 4 điểm trên, (x, y) vẫn được xem là điểm lân cận của chúng và được gọi thực hiện lại

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);

}

Trang 16

• Một cải tiến khác : không cài đặt đệ qui mà tô theo từng dòng

Ngày đăng: 22/08/2012, 09:26

Xem thêm

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN