Xén điểm và đoạn thẳng trong đồ họa máy tính

11 2.5K 9
Xén điểm và đoạn thẳng trong đồ họa máy tính

Đ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

Xén điểm và đoạn thẳng trong đồ họa máy tính

ĐỒ HỌA MÁY TÍNH Các thuật toán xén điểm, đoạn thẳng Dẫn nhập • Thao tác loại bỏ phần hình ảnh nằm vùng cho trước gọi xén hình • Vùng dùng để xén hình gọi cửa sổ xén (clip window) • Cho cửa sổ hình chữ nhật có tọa độ điểm bên trái điểm bên phải laø (x , y ) vaø (x max , y max ) • Một điểm P ( x, y ) coi nằm bên cửa soå  x ≤ x ≤ x max thỏa hệ bất phương trình :  y  ≤ y ≤ y max • Bây giờ, ta xét toán xén đoạn thẳng cho hai điểm P1 (x1 , y1 ) P2 ( x , y2 ) vào cửa sổ hình chữ nhật P7 P4 P2 P1 P6 P2 P8 P1 Window P'6 Window P3 P'5 (a) P5 Dương Anh Đức, Lê Đình Duy (b) Các thuật toán xén hình 1/11 ĐỒ HỌA MÁY TÍNH Vấn đề tối ưu hóa tốc độ • Ý tưởng chung : ♦ Đối với đoạn thẳng đặc biệt nằm hoàn toàn hoàn toàn bên cửa sổ (ví dụ đoạn P1P2 P3P4 hình trên) : không cần phải tìm giao điểm ♦ Đối với đoạn thẳng có khả cắt cửa sổ : cần phải đưa cách tìm giao điểm nhanh • Nhận xét ♦ Các đoạn thẳng mà có hai điểm nằm hoàn toàn cửa sổ đoạn thẳng nằm cửa sổ, kết sau xén (ví dụ đoạn thẳng P1P2), mặt khác đoạn thẳng mà có hai điểm nằm phía cửa sổ nằm cửa sổ bị sau xén (ví dụ đoạn thẳng P3P4) ♦ Với đoạn thẳng có khả cắt cửa sổ (ví dụ đoạn thẳng P5P6 P7P8) để việc tìm giao điểm nhanh cần rút gọn việc tìm giao điểm với biên cửa sổ không cần thiết để xác định phần giao có đoạn thẳng cửa sổ • Người ta thường sử dụng phương trình tham số đoạn thẳng việc tìm giao điểm đoạn thẳng với cửa soå x = x1 + t(x − x1 ) = x1 + tDx, Dx = x − x1 y = y1 + t( y2 − y1 ) = y1 + tDy, Dy = y2 − y1 , 0≤t≤1 • Nếu giao điểm ứng với giá trị t nằm đoạn [0,1] giao điểm không thuộc cửa sổ Dương Anh Đức, Lê Đình Duy Các thuật toán xén hình 2/11 ĐỒ HỌA MÁY TÍNH Thuật toán Cohen - Sutherland • Kéo dài biên cửa sổ, ta chia mặt phẳng thành chín vùng gồm cửa sổ tám vùng xung quanh 0101 0100 0110 0001 0000 0010 Window 1001 1000 TOP LEFT LEFT RIGHT TOP 1010 RIGHT BOTTOM BOTTOM • Khái niệm mã vùng (area code) ♦ Một số bit nhị phân gọi mã vùng gán cho vùng để mô tả vị trí tương đối vùng so với cửa sổ ♦ Bằng cách đánh số từ đến theo thứ tự từ phải qua trái, bit mã vùng dùng theo quy ước sau để bốn vị trí tương đối vùng so với cửa sổ bao gồm : trái, phải, trên, Ví dụ : Bit : trái (LEFT) Bit : phải (RIGHT) Bit : (TOP) Bit : (BOTTOM) ♦ Giá trị tương ứng với vị trí bit mã vùng điểm vị trí ương ứng, ngược lại bit đặt ♦ Các giá trị bit mã vùng tính cách xác định tọa độ điểm (x, y) thuộc vùng với biên cửa sổ Bit đặt x < x , bit khác tính tương tự Dương Anh Đức, Lê Đình Duy Các thuật toán xén hình 3/11 ĐỒ HỌA MÁY TÍNH Thuật toán • Gán mã vùng tương ứng cho điểm đầu cuối P1 , P2 đoạn thẳng cần xén c1 , c2 Ta có nhận xét : ♦ Các đoạn thẳng nằm hoàn toàn bên cửa sổ có c1 = c2 = 0000 , ứng với đoạn này, kết sau xén ♦ Nếu tồn k ∈ 1, , cho với bit thứ k c1 , c2 có giá trị 1, lúc đoạn thẳng nằm phía ứng với bit k so với cửa sổ, nằm hoàn toàn cửa sổ Đoạn bị loại bỏ sau xén Để xác định tính chất này, đơn giản cần thực phép toán logic AND c1 , c2 Nếu kết khác 0000, đoạn thẳng nằm hoàn toàn cửa sổ ♦ Nếu c1 , c2 không thuộc hai trường hợp trên, đoạn thẳng không cắt ngang cửa sổ, chắn tồn điểm nằm cửa sổ, không tính tổng quát giả sử điểm P1 Bằng cách xét mã vùng P1 c1 ta xác định biên mà đoạn thẳng cắt để từ chọn biên tiến hành tìm giao điểm P1 ' đoạn thẳng với biên Lúc này, đoạn thẳng ban đầu xén thành P1 P1 ' Sau lại lặp lại thao tác xét cho đoạn thẳng P1 P1 ' xác định phần nằm loại bỏ toàn đoạn thẳng ♦ Các điểm giao với biên cửa sổ đoạn thẳng tính từ phương trình tham số Ví dụ : tung độ y điểm giao đoạn thẳng với biên đứng cửa sổ tính từ công thức y = y1 + m(x − x1 ) , x x hay x max Dương Anh Đức, Lê Đình Duy Các thuật toán xén hình 4/11 ĐỒ HỌA MÁY TÍNH Lưu đồ thuật toán Cohen - Sutherland Begin EnCode(P1,c1); EnCode(P2,c2) (c1!=0000) || (c2!=0000) No Yes (c1&c2 == 0000) No Yes Xác định giao điểm đoạn thẳng với biên cửa sổ cách xét mã vùng điểm nằm cửa sổ End // Đoạn CT tính mã vùng void EnCode(POINT p, CODE &c, RECT rWin) { c = 0; if(p.x < rWin.Left) c |= LEFT; if(p.x > rWin.Right) c |= RIGHT; if(p.y > rWin.Top) c |= TOP; if(p.y < rWin.Bottom) c |= BOTTOM; } Dương Anh Đức, Lê Đình Duy Các thuật toán xén hình 5/11 ĐỒ HỌA MÁY TÍNH Thuật toán Liang - Barsky • Thuật toán Liang-Barsky phát triển dựa vào việc phân tích dạng tham số phương trình đoạn thẳng x = x1 + t(x − x1 ) = x1 + tDx, y = y1 + t( y2 − y1 ) = y1 + tDy, Dx = x − x1 Dy = y2 − y1 , 0≤ t≤1 • Ứng với giá trị t, ta có điểm P tương ứng thuộc đường thẳng ♦ Các điểm ứng với t ≥ thuộc tia P2x ♦ Các điểm ứng với t ≤ thuộc tia P2x’ ♦ Các điểm ứng với ≤ t ≤ thuộc đoạn thẳng P1 P2 x P2(x2, y2) P1(x1, y1) t>1 t=1 t=0 x' t , ta có Các thuật toán xén hình 7/11 ĐỒ HỌA MÁY TÍNH • Vậy nghiệm hệ bất phương trình [t1 , t2 ] với :   qk  , pk < 0 U {0}) t1 = max(   pk    qk   , p k > 0 U {1}) t2 = min(  pk   t ≤ t 1   • Nếu hệ có nghiệm đoạn giao Q1 Q2 Q1 ( x1 + t1 Dx, y1 + t1 Dy), Q2 ( x1 + t2 Dx, y1 + t2 Dy) • Nếu xét thuật toán khía cạnh hình học ta có : ♦ Trường hợp ∃ k ∈ {1,2,3,4} : ( pk = 0) ∧ (qk < 0) tương ứng với trường hợp đoạn thẳng cần xét song song với biên cửa sổ ( p k = ) nằm cửa sổ ( q k < ) nên bị loại bỏ sau xén ♦ Với p k ≠ , giá trị t = rk = q k / p k seõ tương ứng với giao điểm đoạn thẳng với biên k kéo dài cửa sổ Trường hợp p k < , kéo dài biên cửa sổ đoạn thẳng vô cực, ta có đường thẳng xét có hướng từ bên vào bên cửa sổ Nếu pk > , đường thẳng có hướng từ bên cửa sổ Do hai đầu mút đoạn giao ứng với giá trị t1 , t2 tính sau : Giá trị t1 giá trị lớn rk = q k / p k mà p k < (đường thẳng từ vào cửa sổ) 0; giá trị t2 giá trị nhỏ rk = qk / pk mà p k > (đường thẳng từ cửa sổ ra) Dương Anh Đức, Lê Đình Duy Các thuật toán xén hình 8/11 ĐỒ HỌA MÁY TÍNH Thuật toán xén đa giác Sutherland - Hodgemand Dẫn nhập • Chúng ta hiệu chỉnh thuật toán xén đoạn thẳng để xén đa giác cách xem đa giác tập đoạn thẳng liên tiếp nối với Tuy nhiên, kết sau xén nhiều lại tập đoạn thẳng rời • Điều mong muốn kết sau xén phải đa giác để sau chuyển thành vùng tô (a) Dương Anh Đức, Lê Đình Duy (b) (c) Các thuật toán xén hình 9/11 ĐỒ HỌA MÁY TÍNH Thuật toán Sutherland - Hodgeman • Thuật toán tiến hành xén đa giác với biên cửa sổ Đầu tiên, đa giác xén dọc theo biên trái cửa sổ, kết sau bước dùng để xén tiếp biên phải, tương tự cho biên trên, Sau xén hết với bốn biên cửa sổ, ta kết cuối • Với lần xén đa giác dọc theo biên cửa sổ, gọi Vi , Vi+1 hai đỉnh kề cạnh Vi Vi+1 , ta có trường hợp xảy xét cặp đỉnh đa giác ban đầu với biên cửa sổ sau: ♦ Nếu Vi nằm ngoài, Vi +1 nằm trong, ta lưu giao điểm I Vi Vi +1 với biên cửa sổ Vi+1 ♦ Nếu Vi , Vi +1 nằm trong, ta lưu Vi , Vi +1 ♦ Nếu Vi nằm trong, Vi+1 nằm ngoài, ta lưu Vi I ♦ Nếu Vi , Vi +1 nằm ngoài, ta không lưu caû Vi I Vi+1 Vi Vi+1 Vi Vi+1 I Vi+1 (i) Dương Anh Đức, Lê Đình Duy (ii) Vi (iii) (iv) Các thuật toán xén hình 10/11 ĐỒ HỌA MÁY TÍNH Cài đặt hàm xén đa giác theo cạnh cửa sổ void ClipEdge(POINT *pIn, int N, POINT *pOut, int &Cnt, int Edge, RECT rWin) { int FlagPrevPt = FALSE; Cnt = 0; POINT pPrev; pPrev = pIn[0]; if(Inside(pPrev, Edge, rWin)) // Save point { pOut[Cnt] = pPrev; Cnt++; FlagPrevPt = TRUE; } for(int i=1; i

Ngày đăng: 27/08/2012, 09:03

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan