graphics distant4

21 197 0
graphics distant4

Đ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

CHƯƠNG HIỂN THỊ ĐỐI TƯNG HAI CHIỀU Chương đề cập tới kó thuật để hiển thò đối tượng hai chiều thiết bò hình, máy in, … Các hệ đồ họa cho phép người dùng mô tả hình ảnh hệ tọa độ giới thực Nó hệ tọa độ Descartes mà người dùng cảm thấy thuận tiện sử dụng Các hình ảnh mô tả hệ tọa độ thực sau hệ đồ họa ánh xạ vào hệ tọa độ thiết bò Thông thường hệ đồ họa cho phép người dùng xác đònh vùng hình ảnh hiển thò hiển thò đâu hình Ta chọn vùng hay số vùng để hiển thò lúc, vùng đặt nơi khác hình hay lồng vào Quá trình biến đổi đòi hỏi phép biến đổi dòch chuyển, quay, biến đổi tỉ lệ; thao tác loại bỏ vùng hình ảnh nằm vùng đònh nghóa, … QUY TRÌNH HIỂN THỊ ĐỐI TƯNG HAI CHIỀU 1.1 Một số khái niệm Cửa sổ (window) vùng chọn để hiển thò hệ tọa độ giới thực Vùng quan sát (viewport) vùng chọn thiết bò hiển thò để đối tượng cửa sổ ánh xạ vào Cửa sổ xác đònh thấy thiết bò hiển thò, vùng quan sát xác đònh nơi hiển thò Ở nên phân biệt khái niệm cửa sổ dùng phần với khái niệm cửa sổ dùng chương trình ứng dụng hệ điều hành Windows Thông thường cửa sổ vùng quan sát có dạng hình chữ nhật, có cạnh song song với trục tọa độ Tuy nhiên chúng có số dạng khác đa giác, hình tròn, … http://www.ebook.edu.vn Quá trình ánh xạ vùng đònh nghóa hệ tọa độ giới thực vào vùng hệ tọa độ thiết bò gọi phép biến đổi hệ quan sát (viewing transformation) Window Viewport ywmax yvmax yvmin ywmin xwmin xwmax xvmin xvmax Hình 4.1 – Phép biến đổi hệ quan sát với cửa sổ vùng quan sát có dạng hình chữ nhật Quy trình hiển thò đối tượng đồ họa hai chiều mô tả qua sơ đồ sau : Trước tiên, đối tượng mô tả đối tượng đồ họa sở thuộc tính chúng hệ tọa độ cục (modeling coordinates - MC) nhằm đơn giản hóa tận dụng đặc trưng riêng loại Sau đó, dùng phép biến đổi hệ tọa độ để chuyển mô tả từ hệ tọa độ cục sang hệ tọa độ giới thực (world coordinates - WC) chứa toàn đối tượng thành phần Phép chuyển đổi gọi phép chuyển đổi mô hình (modeling coordinates transformation) Tiếp theo, đònh hệ tọa độ quan sát (viewing coordinates VC), hệ tọa độ mô tả vò trí người quan sát đối tượng Nhờ việc sử dụng hệ tọa độ mà mô tả, đối tượng quan sát nhiều góc độ vò trí khác Sau chuyển mô tả đối tượng từ hệ tọa độ giới thực sang hệ tọa độ quan sát, đònh nghóa cửa sổ hệ tọa độ này, đồng thời đònh nghóa vùng quan sát hệ tọa độ thiết bò chuẩn (normalized device coordinates - NDC) có tọa độ chiều thay đổi khoảng từ đến Sau thực phép ánh xạ từ cửa sổ sang vùng quan sát, tất phần đối tượng nằm vùng quan sát bò xén (clip) toàn nằm vùng quan sát ánh xạ sang hệ tọa độ thiết bò (device coordinates - DC) Việc đưa hệ tọa độ thiết bò chuẩn nhằm giúp cho việc tương thích dễ dàng với nhiều loại thiết bò hiển thò khác MC Chuyển đổi từ hệ tọa độ cục sang hệ tọa độ giới thực WC Chuyển đổi từ hệ tọa độ giới thực sang hệ tọa độ quan sát VC Chuyển đổi từ hệ tọa độ quan sát sang hệ tọa độ thiết bò chuẩn NDC Ánh xạ từ hệ tọa độ thiết bò chuẩn sang hệ tọa độ thiết bò DC http://www.ebook.edu.vn Hình 4.2 – Quy trình hiển thò đối tượng hai chiều Bằng cách thay đổi vò trí vùng quan sát quan sát đối tượng vò trí khác hình hiển thò, đồng thời, cách thay đổi kích thước vùng quan sát, thay đổi kích thước tính cân xứng đối tượng hiển thò Chúng ta thực hiệu ứng thu phóng cách ánh xạ cửa sổ có kích thước khác vào vùng quan sát có kích thước cố đònh Khi cửa sổ thu nhỏ, phần nằm cửa sổ phóng to giúp dễ dàng quan sát chi tiết mà thấy cửa sổ lớn 1.2 Hệ tọa độ quan sát hệ tọa độ thiết bò chuẩn 1.2.1 Hệ tọa độ quan sát Để thiết lập hệ tọa độ quan sát, trước tiên ta chọn điểm P0 (x , y0 ) hệ tọa độ giới thực làm gốc tọa độ Sau sử dụng vector V mô tả hướng quan sát để đònh hướng cho trục tung y v hệ tọa độ Vector V gọi view-up vector Từ V tính vector đơn vò v = (vx , v y ) u = (u x , u y ) tương ứng cho trục tung yv trục hoành x v hệ tọa độ Các vector đơn vò dùng để tạo thành hai dòng ma trận quay M R để đưa trục x v yv trùng với trục x w yw hệ trục tọa độ giới thực yworld yworld yview yv iew y0 T xview x0 xworld xv ie xworld R w (a) (b) Hình 4.3 – Phép biến đổi điểm từ hệ tọa độ quan sát sang hệ tọa độ thực Ma trận phép chuyển điểm hệ tọa độ giới thực sang hệ tọa độ quan sát tích hai ma trận phép biến đổi : phép tònh tiến gốc tọa độ hệ quan sát gốc tọa độ hệ tọa độ giới thực, phép http://www.ebook.edu.vn quay đưa trục hệ tọa độ quan sát trùng với trục hệ tọa độ giới thực M WC,VC = M T M R 1.2.2 Hệ tọa độ thiết bò chuẩn Do cách đònh nghóa hệ tọa độ thiết bò khác nên hình ảnh hiển thò thiết bò chưa hiển thò xác thiết bò Chính cần phải xây dựng hệ tọa độ thiết bò chuẩn đại diện chung cho thiết bò để mô tả hình ảnh giới thực mà không phụ thuộc vào thiết bò Trong hệ tọa độ này, tọa độ x, y gán giá trò khoảng từ đến Như vậy, vùng không gian hệ tọa độ thiết bò chuẩn hình vuông đơn vò có góc trái (0,0) góc phải (1,1) y (1,1) 1 x Hình 4.4 – Hệ tọa độ thiết bò chuẩn 1.3 Chuyển đổi từ cửa sổ sang vùng quan sát Phép chuyển đổi từ cửa sổ sang vùng quan sát bao gồm phép biến đổi : phép tònh tiến để dòch chuyển góc trái gốc tọa độ (hình 4.5a), phép biến đổi tỉ lệ để chỉnh kích thước cửa sổ kích thước vùng y y v v (xmax,ymax) (umax,vmax) (xmin,ymin) (umin,vmin) x (a) x (b) u (c) u (d) quan sát (hình 4.5b, hình 4.5c), cuối phép tònh tiến dòch chuyển góc trái vùng quan sát (hình 4.5d) Hình 4.5 – Phép chuyển đổi từ cửa sổ sang vùng quan sát Ta có ma trận phép biến đổi : ⎛u − u vmax − vmin M WV = M TW (− x ,− y )M S ⎜⎜ max , ⎝ x max − x y max − y ⎞ ⎟ M TV (u , vmin ) ⎟ ⎠ http://www.ebook.edu.vn ⎛ ⎜ ⎜ ⎜ =⎜ ⎜ ⎜ ⎜ − x ⎝ u max − u x max − x 0 u max − u + u x max − x − y vmax y max vmax y max − vmin − y − vmin + vmin − y ⎞ 0⎟ ⎟ ⎟ 0⎟ ⎟ ⎟ 1⎟ ⎠ Như P (x, y) điểm cửa sổ có tọa độ vùng quan sát : (sx(x − x ) + u , sy( y − y ) + vmin ) với sx = u max − u v − vmin , sy = max x max − x y max − y sx, sy hệ số tỉ lệ kích thước cửa sổ vùng quan sát Khi sx = sy = , đối tượng qua phép chuyển đổi giữ nguyên hình dáng tính cân xứng 1.4 Các thuật toán xén hình 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) Tùy thuộc vào ứng dụng cụ thể mà cửa sổ xén có dạng đa giác đường cong khép kín Trong phần khảo sát thuật toán xén hình vào cửa sổ xén hình chữ nhật trước, sau khảo sát cửa sổ xén có dạng khác Để đơn giản, thuật toán xén hình, cửa sổ xén gọi cửa sổ CÁC THUẬT TOÁN XÉN ĐIỂM, ĐOẠN THẲNG Giả sử cửa sổ xén cửa sổ hình chữ nhật có tọa độ điểm bên trái điểm bên phải (xmin , ymin ) (xmax , ymax ) Một điểm P(x, y) coi nằm bên cửa sổ thỏa hệ bất phương trình : ⎧ xmin ≤ x ≤ xmax ⎨ ⎩ ymin ≤ y ≤ ymax 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 (b) Hình 4.6 – Minh họa thao tác xén đoạn thẳng vào cửa sổ hình chữ nhật Trước xén (a) Sau xén (b) http://www.ebook.edu.vn Thao tác xén hình thao tác trình hiển thò đối tượng, vấn đề tối ưu tốc độ đích cho thuật toán nhắm đến Ý tưởng chung thuật toán xén đoạn thẳng loại bỏ phép toán tìm giao điểm đoạn thẳng với biên cửa sổ cách nhanh đ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 4.6) Đố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 thật nhanh Nhận xét rằng, đ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 sổ 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ổ 2.1 Thuật toán Cohen-Sutherland Đây thuật toán đời sớm thông dụng http://www.ebook.edu.vn Bằng cách kéo dài biên cửa sổ, người ta chia mặt phẳng thành chín vùng gồm cửa sổ tám vùng xung quanh 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, 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í tương ứng, ngược lại bit đặt Ví dụ vùng có mã 1001, nằm phía (bit 1), bên trái (bit 1) so với cửa sổ, vùng có mã 0000 cửa sổ 0101 0100 0110 0001 0000 0010 Window 1001 TOP LEFT LEFT TOP 1000 1010 RIGHT RIGHT BOTTOM BOTTOM Hình 4.7 – Mã vùng quy đònh vò trí tương đối vùng so với cửa sổ 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ự 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, ,4} , 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 Ví dụ, c1 = 1001, c2 = 0101 , rõ ràng bit chúng (ứng với biên trái), đoạn thẳng nằm hoàn toàn biên trái cửa sổ Để xác http://www.ebook.edu.vn đò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ổ (ví dụ đoạn P5 P6 , P7 P8 hình 4.6) 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 ' Tới 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 Chúng ta minh họa thuật toán hình vẽ 4.8 Với đoạn thẳng P1 P2 , ta kiểm tra P1 với biên trái, phải, dưới, tìm điểm nằm cửa sổ, sau tìm giao điểm P1 ' đoạn thẳng với biên Lúc đoạn thẳng ban đầu xén ngắn lại thành P1 ' P2 Vì P2 nằm cửa sổ nên cách xét tương tự, tiến hành tìm giao điểm P2 ' P1 ' P2 với biên lúc đoạn P1 ' P2 ' , phần nằm hoàn toàn cửa sổ Trong trường hợp đoạn P3 P4 , P3 nằm bên trái cửa sổ nên xác đònh điểm giao P3 ' , từ loại bỏ đoạn thẳng P3 P3 ' Bằng cách kiểm tra mã vùng, dễ dàng xác đònh đoạn thẳng P3 ' P4 nằm hoàn toàn bên cửa sổ nên bỏ toàn P2 P'2 P3 P'1 P'3 P1 P4 Hình 4.8 – Minh họa thuật toán Cohen - Sutherland 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ố đề cập phần 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 Tương tự, hoành độ x điểm giao đoạn thẳng với biên ngang cửa sổ tính từ công thức : x = x1 + ( y − y1 ) / m , y y hay y max http://www.ebook.edu.vn Lưu đồ thuật toán Cohen-Sutherland dùng để xén đoạn thẳng qua hai điểm (x1,y1) (x2,y2) vào cửa sổ hình chữ nhật cho trước 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 Cài đặt minh họa thuật toán Cohen - Sutherland #define TRUE #define FALSE #define LEFT #define RIGHT #define TOP #define BOTTOM typedef struct { int x, y; }POINT; 1 typedef struct { int Left, Top, Right, Bottom; }RECT; typedef int CODE; #define Accept(a,b) #define Reject(a,b) (!(a|b)) (a&b) // Tra ve ma vung cua p la c void EnCode(POINT p, CODE &c, RECT rWin) { c = 0; if(p.x < rWin.Left) http://www.ebook.edu.vn c |= LEFT; if(p.x > rWin.Right) c |= RIGHT; if(p.y > rWin.Top) c |= TOP; if(p.y < rWin.Bottom) c |= BOTTOM; } // Hoan vi hai diem p1 va p2 cho p1 luon nam ngoai cua so void SwapPoint(POINT& p1, POINT &p2, CODE &c1, CODE &c2) { if(!c1) // Neu p1 nam hoan toan cua so { POINT p; p = p1; p1 = p2; p2 = p; CODE c; c = c1; c1 = c2; c2 = c; } } // Tra ve TRUE neu co cat cua so Nguoc lai tra ve FALSE int CohenSutherlandClipping(POINT P1, POINT P2, POINT &Q1, POINT &Q2, RECT rWin) { int fStop = FALSE, fResult = FALSE; CODE c1, c2; while(!fStop) { EnCode(P1, c1, rWin); EnCode(P2, c2, rWin); // Neu duong thang nam hoan toan ben cua so if(Accept(c1, c2)) { fStop = TRUE; // break fResult = TRUE; } // Accept else { // Neu duong thang nam hoan toan ben ngoai cua so if(Reject(c1,c2)) { fStop = TRUE; // break } // Reject else // Xet truong hop duong thang co the cat cua so { SwapPoint(P1, P2, c1, c2); float m; if(P2.x!=P1.x) m = float(P2.y-P1.y)/(P2.x-P1.x); if(c1 & LEFT) { http://www.ebook.edu.vn P1.y += (rWin.Left-P1.x)*m; P1.x = rWin.Left; } // Left else { if(c1 & RIGHT) { P1.y += (rWin.Right-P1.x)*m; P1.x = rWin.Right; } // Right else { if(c1 & TOP) { if(P2.x!=P1.x) P1.x += (rWin.Top - P1.y)/m; P1.y = rWin.Top; } // Top else // Bottom { if(P2.x!=P1.x) += (rWin.Bottom - P1.y)/m; P1.x P1.y = rWin.Bottom; } // Bottom } } } // Xet truong hop duong thang co the cat cua so } } //while Q1 = P1; Q2 = P2; return (fResult); } //CohenSutherlandClipping 2.2 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, Dx = x − x1 y = y1 + t( y2 − y1 ) = y1 + tDy, 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 http://www.ebook.edu.vn x P2(x2, y2) t>1 t=1 P1(x1, y1) t=0 x' t , ta có t ≤ q k / p k Vậy nghiệm hệ bất phương trình [t1 , t2 ] với : http://www.ebook.edu.vn ⎧ ⎧ qk ⎫ , p k < 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 http://www.ebook.edu.vn • Với p k ≠ , giá trò t = rk = q k / p k 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 p k > , đườ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 = q k / p k mà p k > (đường thẳng từ cửa sổ ra) Hình 4.10 – Xét với biên trái đoạn thẳng P1P2 có hướng từ vào trong, so với biên phải đoạn P2 P'2 P1 P'1 thẳng P’1P’2 lại có hướng từ cửa sổ Khi cài đặt thuật toán Liang-Barsky, ban đầu giá trò t1, t2 khởi động t1 = 0, t2 = Với lần xén đoạn thẳng với biên cửa sổ, giá trò p, q truyền cho hàm ClipTest để xác đònh đoạn thẳng có bò loại bỏ hay bò xén bớt đoạn hay không Khi p < , tham số r = q / p xem xét để cập nhật t1 , p > , r dùng để cập nhật t2 Khi cập nhật t1 t2 t1 > t2 , đoạn thẳng bò loại bỏ Ngoài (p=0 qt1) t1 = r; } else { if (p>0) { r = float(q)/p; if (r[...]... ngoài, ta không lưu gì cả Vi+1 Vi Vi+1 Vi Vi+1 I Vi+1 (i) (ii) Vi (iii) Hình 4.13 – Các trường hợp khi xét (iv) Vi , Vi+1 với các biên của cửa sổ Cài đặt minh họa thuật toán Sutherland-Hodgeman #include #include #include #include #include #define TRUE #define FALSE #define LEFT #define RIGHT #define TOP #define BOTTOM 1 0 1 2 4 8 typedef struct { int

Ngày đăng: 22/12/2016, 12:42

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

  • Đang cập nhật ...

Tài liệu liên quan