Thuật toán tô màu Scanline - Đồ họa Pascal
Chia sẻ bởi Trần Trung |
Ngày 29/04/2019 |
71
Chia sẻ tài liệu: Thuật toán tô màu Scanline - Đồ họa Pascal thuộc Bài giảng khác
Nội dung tài liệu:
Xử lý các trường hợp đặc biệt trong bài toán tô màu đa giác bằng
thuật toán Scanline
Trong đồ họa máy tính có khá nhiều thuật toàn tô màu (Scanline, tô loang...) cho 1 vùng kín (đặc) như các đa giác, các đường tròn... Xong mỗi thuật toán lại tỏ ra có những ưu việt và hạn chế riêng đối với từng bài toán cụ thể. Với thuật toán tô màu theo dòng quét (Scanline), khi tô màu cho một vùng kín đôi khi cần phải xác định cho được các trường hợp đặc biệt của bài toán để sao cho kết quả trả về sẽ tô được những vùng cần thiết như mong muốn.
Song, trong thực tiễn để làm được điều này nhiều lúc cũng gặp phải khá nhiều khó khăn trong việc xử lý các trường hợp đặc biệt đó.Bài viết này nhằm xác định các trường hợp đặc biệt của bài toán tô màu đa giác cũng như cách xử lý chúng để cho kết quả tô chính xác bằng thuật toán Scanline.
I.Ý tưởng.
-Duyệt qua tất cả các đỉnh của đa giác để xác định YMAX,YMIN.
-Xác định các giao điểmcủa từng dòng quét với tất cả các cạnh của đa giác ( đường viền đa giác ) trong phạm vi YMAX, YMIN đó.
-Bật sáng các Pixel bên trong đa giác bằng cách di chuyển con trỏ giữa các giao điểm cho thích hợp.
II.Phân tích.
II.1.Hình minh họa các trường hợp đặc biệt.
II.2.Các trường hợp đặc biệt.
Ta cần xây dựng các thủ tục (TT) mà mỗi TT đó phải xử lý được một trường hợp đặc biệt của bài toán.
TH1: Dòng quét L1cắt đa giác một lần ,tạiđỉnhthấpnhấtcủa đa giác .Taphải xây dựng mộtTT bỏ qua dòng L1 ( còn đỉnh của đa giácnày tất nhiên sẽ được sáng cùng với đường viền của nó).
TH2: DòngL2cắtđa giáctại 2điểm ( trong đó có1 đỉnh) . Mọi Pixel nằm giữa B1, B2 sẽ được sáng lên ; giao điểm với đỉnh nàykhông được bỏ qua. Do đó phải xây dựng mộtTT có khả năng xác định được khi nào 1 giao điểm với đỉnh có thể hoặc không thể bỏ qua.
TH3: Dòng L3 cắt đa giáctại 3 điểm ; mọi Pixelgiữa C1 và C2 sẽ sáng lên nênTT sẽ bỏ qua điểm C’.
TH4: DòngL4trùngvớicạnhnằm ngang S . Mọi pixel giữa D1,D2 sẽ sáng lên .Phải xây dựng mộtTTcoi cạnh S là không tồn tại ( không bật sáng các Pixel nằm trên S) . Đồng thời các pixel giữa D2 và D3 sẽ không sáng lên và các Pixel giữa D3, D4 lại được sáng lên.
II.3.Chi tiết.
Kiểm tra tính chất các giao điểm
Để kiểm tra tính chất của một đường quét có cắt 1 cạnh không? Ta thực hiện việc so sánh tung độ của dòng quét (yscan) với tung độ y của các điểm mút của mỗi cạnh.
II..1.Nếu tung độ của 2 điểm mút đều lớn hơn hay nhỏ hơn YSCAN thì không cógiao điểm nào .
II.3.2.Nếu tung độ y của mỗi điểm mút bằng YSCAN thì giao điểm tại đỉnh đó.
II.3.3.Nếu tung độ của cả 2 điểm mút đều bằng YSCAN thì đó là cạnh nằm ngang.
II.3.4.Cuối cùng , nếu 1 tung độ bé hơn YSCANcòn tung độ kia lớn hơn
YSCANthì dòng quét cắt cạnh đó.
II.4.Xử lý các trường hợp đặc biệt.
II.4.1. Nếu cạnh bị cắt là nằm ngang thì chỉ việc bỏ qua cạnh đó và chuyển sangduyệt cạnh tiếp theo.
II.4.2.Nếu giao điểmtrùng với 1 đỉnh thì kiểm tra các tung độ ngay trước và ngay sau đỉnh đó . Nếu cả 2 tung độ đều lớn hơn/nhỏ hơn YSCAN thì cả 2 cạnh đangxét đều nằm về 1 phía so với dòng quét ( giống đỉnh C’)nên bỏ qua.
còn lại thì không được bỏ qua
II.4.3.Nếu trường hợp dòng quét cắt 1 cạnh thì ta phải xác định tọađộ giao điểm( x =?, yscan)
III. Các thủ tục xử lý các trường hợp đặc biệt.
III.1.Hàm xác định cạnh nằm ngang.
Gía trị trả về của hàm là True khi cạnh đang xét là cạnh nằm ngang , ngược lại giá trị trả về là False.
Function Canhngang(Var ys:Integer; y0,y1:Integer):Boolean;
Begin
If (ys=y0) and (ys=y1 ) Then canhngang:=True
Else canhngang:=False;
End;
III.2.Thủ tục xác định giao điểm tại một đỉnh
Procedure Giao1dinh(Var ys:Integer;y0,y1:Integer;Var i:Integer);
Var pt1,pt2,k:Integer;
Begin
If (ys=y0) or (ys
* Một số tài liệu cũ có thể bị lỗi font khi hiển thị do dùng bộ mã không phải Unikey ...
Người chia sẻ: Trần Trung
Dung lượng: |
Lượt tài: 1
Loại file:
Nguồn : Chưa rõ
(Tài liệu chưa được thẩm định)