Giải thuật sinh đa giỏc (Polygon)

Một phần của tài liệu Ứng dụng các kỹ thuật của đồ họa máy tính vào việc giảng dạy (Trang 27 - 33)

1.4.9.1. Thuật giải vẽ đường bao đa giỏc

Việc biểu diễn đa giỏc thụng qua: - Tập cỏc đoạn thẳng

- Tập cỏc điểm thuộc đa giỏc Cỏc loại đa giỏc:

Hỡnh 1.8. Cỏc loại đa giỏc

Đa giỏc lồi: là đa giỏc cú đƣờng thẳng nối bất ký 2 điểm bờn trong nào của đa giỏc đều nằm trọn trong đa giỏc. Đa giỏc khụng lồi là đa giỏc lừm.

Cỏc đƣờng thẳng bao đa giỏc - cạnh của đa giỏc. Cỏc điểm giao của cạnh - đỉnh của đa giỏc.

Thụng tin cần thiết để xỏc định đa giỏc: - Số cạnh

26

/* Thuat toan ve duong bao da giac */

Polygon (arrayx, arrayy,n)

{ if (n<3//khụng phải đa giỏc

exit;

for (i=1 ; i<= n-1; i++)

line(arrayx[i],arrayy[i], arrayx[i+1], arrayy[i+1]);

line(arrayx[i+1],arrayy[i+1], arrayx[1], arrayy[1]);

}

1.4.9.2. Cỏc thuật toỏn tụ miền kớn đa giỏc

Lợi thế của hiển thị raster là: khả năng lƣu trữ, copy, tụ màu một vựng...Cú hai dạng vựng tụ thƣờng gặp đú là: tụ bằng một màu thuần nhất (solid fill), tụ theo mẫu tụ (fill pattern) nào đú.

Cũn thiết bị vector thỡ hạn chế do cỏc vựng tụ màu tạo ra bởi một tập cỏc đoạn thẳng sỏt nhau làm chậm quỏ trỡnh làm tƣơi.

+ Giải thuật đƣờng biờn (Boundary - fill Algorithm) - Bắt đầu từ 1 điểm (x,y) trong vựng cần đƣợc tụ màu: + Xỏc định màu điểm: getpixel(x,y,c)

+ Tụ màu putpixel(x,y,c)

- Bƣớc tiếp: kiểm tra thuộc tớnh màu cỏc điểm lõn cận + điểm lõn cận đó tụ màu (exit)

+ trựng với màu đƣờng biờn(exit) + Nếu khụng thỡ tụ màu

27 Cỏc phƣơng phỏp xỏc định điểm lõn cận

Hỡnh 1.9. Phương phỏp tịnh tiến giải thuật

+Giải thuật dũng quột (scanline) cho việc tụ màu vựng

Giải thuật dựa trờn ý tƣởng sử dụng một đƣờng quột trờn trục y của màn hỡnh đi từ ymax đến ymincủa vựng cần đƣợc tụ màu.

Với mỗi giỏ trị y = yi đƣờng thẳng quột cắt cỏc đƣờng biờn của vựng cần tụ tạo ra đoạn thẳng y = yi với x [xmin, xmax]. Trờn đoạn thẳng đú chỳng ta tụ màu cỏc điểm tƣơng ứng đi từ xminđến xmax cú cỏc điểm tụ (xi, yi) y = yi.

- Đơn giản nhất vớ dụ tụ màu hỡnh chữ nhật:

void scanline_rectg(x1,y1,x2,y2,c){ int i,j;

for(i=y1; i>=y2; i--)

for(j=x1; j<= x2;j++)

putpixel(i,j,c);

}

- Phộp tụ màu 1 đa giỏc bất kỳ sẽ phức tập hơn rất nhiều so với hỡnh chữ nhật.

Giả sử vựng tụ đƣợc cho bởi 1 đa giỏc n đỉnh: pi (xi,yi), i=0,1,....,n-1. Đa giỏc này cú thể là đa giỏc lồi, đa giỏc lừm hay đa giỏc tự cắt....

28

- Tỡm ytop, 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.

ytop = max{yi,(xi,yi) P}, ybottom = min{yi,(xi,yi) P}.

- Ứng với mỗi dũng quột y=k, với k thay đổi từ ybottom đến ytop lặp:

+ 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: x0, x1,....

+ Tụ màu cỏc đoạn thẳng trờn đƣờng thẳng y=k lần lƣợt đƣợc giới hạn bởi cỏc cặp (x0, x1), (x2, x3), ..., (x2k, x2k+1).

Chỳng ta sẽ gặp 1 số vấn đề sau:

- Ứ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. Do đú để cải thiện tốc độ cần phải cú một cỏch nào đú để hạn chế đƣợc số cạnh cần tỡm giao điểm ứng với mỗi dũng quột.

- 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ẻ (điều này chỉ xảy ra

khi dũng quột sẽ đi qua cỏc đỉnh của đa giỏc) khi đú ta sẽ tớnh số điểm là 2 thỡ cú thể tụ khụng chớnh xỏc. Ngoài ra, việc tỡm giao điểm của dũng quột với cỏc cạnh nằm ngang là trƣờng hợp đặc biệt...

29

Hỡnh 1.10. Giải thuật scanline cho một đa giỏc bất kỳ

Để giải quyết cỏc vấn đề trờn ta cú cỏc phƣơng phỏp sau: + Danh sỏch cỏc cạnh kớch hoạt (AET - Active Edge Table)

Mỗi cạnh của đa giỏc đƣợc xõy dựng từ 2 đỉnh kề nhau Pi(xi,yi) và Pi+1(xi+1,yi+1) gồm cỏc thụng tin sau:

ymin: giỏ trị nhỏ nhất trong 2 đỉnh của cạnh

xIntersect: hoành độ giao điểm của cạnh với dũng quột hiện đang xột 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 ymax

Danh sỏch cỏc cạnh kớch hoạt AET: danh sỏch này dựng để lƣu cỏc tập cạnh của đa giỏc cú thể cắt ứng với dũng quột hiện hành và tập cỏc điểm giao tƣơng ứng. Nú cú một số đặc điểm:

Cỏc cạnh trong danh sỏch đƣợc sắp xếp theo thứ tự tăng dần của cỏc hoành độ giao điểm để cú thể tụ màu cỏc đoạn giao một cỏch dễ dàng.

30

Thay đổi ứng với mỗi dũng quột đang xột, do đú danh sỏch này sẽ đƣợc cập nhật liờn tục trong quỏ trỡnh thực hiện thuật toỏn. Đầu tiờn ta cú danh dỏch chứa toàn bộ cỏc cạnh của đa giỏc gọi là ET (Edge Table) đƣợc sắp xếp theo thứ tự tăng dần của ymin, rồi sau mỗi lần dũng quột thay đổi sẽ di chuyển cỏc cạnh trong ET thoả điều kiện sang AET.

Một dũng quột y=k chỉ cắt 1 cạnh của đa giỏc khi và chỉ khi k>=yminΔy>0. Chớnh vỡ vậy mà với cỏc tổ chức của ET (sắp theo thứ tự tăng dần của ymin) điều kiện để chuyển cỏc cạnh từ ET sang AET sẽ là k>=ymin; và điều kiện để loại một

cạnh ra khỏi AET là Δy<=0.

+ Cụng thức tỡm giao điểm nhanh:

Nếu gọi xk,xk+1 lần lƣợt là cỏc hoành độ giao điểm của một cạnh nào đú với cỏc dũng quột y=ky=k+1 ta cú:

xk+1 - xk = 1/m ((k+1) - k) = 1/m hay xk+1 = xk + 1/m

Nhƣ vậy nếu lƣu hoành độ giao điểm ứng với dũng quột trƣớc lại, cựng với hệ số gúc của cạnh, ta xỏc định đƣợc hoành độ giao điểm ứng với dũng quột kế tiếp theo cụng thức trờn. Nờn thụng tin của cạnh cú 2 biến: DxPerScan , xIntersect.

+ Trƣờng hợp dũng quột đi ngang qua một đỉnh:

Tớnh 1 giao điểm nếu chiều của 2 cạnh kề của đỉnh đú cú xu hƣớng tăng hay giảm

Tớnh 2 giao điểm nếu chiều của 2 cạnh của đỉnh đú cú xu hƣớng thay đổi, nghĩa là tăng - giảm hay giảm - tăng.

31

Hỡnh 1.11. Qui tắc tớnh: một giao điểm (A) và hai giao điểm (B)

Một phần của tài liệu Ứng dụng các kỹ thuật của đồ họa máy tính vào việc giảng dạy (Trang 27 - 33)

Tải bản đầy đủ (PDF)

(84 trang)