Giáo trình kỹ thuật đồ họa - Chương 4

30 14 0
Giáo trình kỹ thuật đồ họa - Chương 4

Đ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

Mục tiêu Học xong chương này, sinh viên cần phải nắm bắt được các vấn đề sau: - Thế nào là window ? - Hiểu rõ các thao tác loại bỏ phần hình ảnh nằm ngoài một vùng cho trước (thao tác này được gọi là xén hình). - Thiết kế và cài đặt được các thuật toán xén hình.

Chương 4: Windowing Clipping Chương TẠO CỬA SỐ VÀ CẮT HÌNH (WINDOWING AND CLIPPING) 4.1 Tổng quan • Mục tiêu Học xong chương này, sinh viên cần phải nắm bắt vấn đề sau: - Thế window ? - Hiểu rõ thao tác loại bỏ phần hình ảnh nằm ngồi vùng cho trước (thao tác gọi xén hình) - Thiết kế cài đặt thuật tốn xén hình • Kiến thức cần thiết Kiến thức tin học bao gồm kỹ thuật lập trình cấu trúc liệu • Tài liệu tham khảo Computer Graphics Donald Hearn, M Pauline Baker Prentice-Hall, Inc., Englewood Cliffs, New Jersey , 1986 (chapters 6, 123-153) • Nội dung cốt lõi - Trình bày khái niệm window - Các thuật toán clipping : Cohen-Sutherland, Liang-Barsky - Phép biến đổi từ cửa sổ 4.2 Các khái niệm Windowing Hệ tọa độ Descartes dễ thích ứng cho chương trình ứng dụng để miêu tả hình ảnh (picture) hệ tọa độ giới thực (world coordinate system) Các hình ảnh định nghĩa hệ tọa độ giới thực sau hệ đồ họa vẽ lên hệ tọa độ thiết bị (device coordinate) Điển hình, vùng đồ họa cho phép người sử dụng xác định vùng hình ảnh hiển thị bạn muốn đặt nơi hệ tọa độ thiết bị Một vùng đơn lẻ vài vùng hình ảnh chọn Những vùng đặt vị trí tách biệt, vùng chèn vào vùng lớn Quá trình biến đổi liên quan đến thao tác Trang 58 Chương 4: Windowing Clipping tịnh tiến, biến đổi tỷ lệ vùng chọn xóa bỏ phần bên vùng chọn Những thao tác gọi windowing clipping (xem hình 4.1) Window ywmax Viewport yvmax ywmin yvmin xwmin xwmax Hệ tọa độ giới thực xvmax xvmin Hệ tọa độ thiết bị Hình 4.1 : Một ánh xạ cửa sổ - đến – vùng quan sát Một vùng có dạng hình chữ nhật xác định hệ tọa độ giới thực gọi cửa sổ (window) Cịn vùng hình chữ nhật thiết bị hiển thị để cửa sổ ánh xạ đến gọi vùng quan sát (viewport) Hình 4.1 minh họa việc ánh xạ phần hình ảnh vào viewport Việc ánh xạ gọi phép biến đổi hệ quan sát (viewing transformation), biến đổi cửa sổ (windowing tranformation), biến đổi chuẩn hóa (normalization transformation) Các lệnh để xây dựng cửa sổ vùng quan sát từ chương trình ứng dụng định nghĩa sau: set_window(xw_min, xw_max, yw_min, yw_max) set_viewport(xv_min, xv_max, yv_min, yv_max) Các tham số hàm dùng để định nghĩa giới hạn tọa độ vùng chữ nhật Các giới hạn cửa sổ xác định hệ tọa độ giới thực Hệ tọa độ thiết bị chuẩn thường dùng cho việc xác định vùng quan sát, hệ tọa độ thiết bị dùng có thiết bị xuất (output device) hệ thống Khi hệ tọa độ thiết bị chuẩn dùng, lập trình viên xem thiết bị xuất có giá trị tọa độ khoảng Một xác định vùng quan sát cho với giá trị khoảng Các việc xác định sau đây, đặt phần Trang 59 Chương 4: Windowing Clipping định nghĩa hệ tọa độ giới thực vào góc bên phải vùng hiển thị, minh họa hình 4-2: set_window(-60.5, 41.25, -20.75, 82.5); set_viewport(0.5, 0.8, 0.7, 1.0); Nếu cửa sổ buộc phải ánh xạ lấp đầy vùng hiển thị, xác định viewport cho là: Set_viewport(0,1, 0, 1) Các vị trí biểu diễn hệ tọa độ thiết bị chuẩn phải biến đổi sang hệ tọa độ thiết bị trước hiển thị thiết bị xuất cụ thể Thông thường thiết bị xác định chứa gói đồ họa cho mục đích Thuận lợi việc dùng hệ tọa độ thiết bị chuẩn để gói đồ họa độc lập với thiết bị Các thiết bị xuất khác dùng nhờ việc cung cấp trình điều khiển thiết bị thích hợp Mọi điểm tham khảo đến gói đồ họa phải xác định tương ứng hệ tọa độ Descartes Bất kỳ định nghĩa hình ảnh dùng hệ tọa độ khác, hệ tọa độ cực, người sử dụng trước tiên phải biến đổi sang hệ tọa độ giới thực Những hệ tọa độ Descart sau dùng lệnh cửa sổ để xác định phần hình ảnh muốn hiển thị (xem hình 4.2) yw (-60.5, 82.5) (-41.25, 82.5) Window Viewport (-60.5, -20.75) xw 0.5 (41.25, -20.75) Hệ tọa độ giới thực Hệ tọa độ thiết bị chuẩn Hình 4-2: Ánh xạ cửa sổ vào vùng quan sát hệ tọa độ thiết bị chuẩn Trang 60 Chương 4: Windowing Clipping Các lệnh cửa sổ vùng quan sát phát biểu trước gọi thủ tục vẽ ảnh Các xác lập cho cửa sổ vùng quan sát ảnh hưởng đến lệnh xuất theo sau có xác lập Bằng việc thay đổi vị trí vùng quan sát, đối tượng hiển thị vị trí thiết bị xuất Cũng vậy, việc thay đổi kích thước vùng quan sát, kích thước phần đối tượng bị thay đổi Khi cửa sổ đặt lại kích thước khác ánh xạ thành cơng vào vùng quan sát, hiệu ứng phóng to (zooming) thực Hình 4-3: Hiển thị đồng thời hai biểu đồ, dùng đa cửa sổ xác định vùng quan sát Khi cửa sổ làm nhỏ hơn, người dùng phóng to vài nơi ảnh để xem chi tiết mà không cần phóng to tồn cửa sổ Các hiệu ứng panning tạo cách di chuyển cửa sổ có kích thước xác định ngang qua hình ảnh lớn Một ví dụ việc dùng đa cửa sổ lệnh vùng quan sát cho thủ tục sau Hai biểu đồ hiển thị hai phần thiết bị hiển thị (xem hình 4-3) type points = array[1 max_points] of real; procedure two_graphs; var x,y : points; k: integer; begin set_window(0, 1, 0, 1); {vẽ đường chia trung tâm} set_viewport(0, 1, 0, 1); x[1]:=0.5; y[1]:=0; x[2]:=0.5; y[2]:=1; polyline(2, x, y); Trang 61 Chương 4: Windowing Clipping for k:=1 to begin x[k]:=k; {đọc liệu cho đồ thị thứ nhất} {các giá trị liệu từ 300 đến 700} readln(y[k]); end; {for k} set_window(1, 9, 300, 700); set_viewport(0.1, 0.4, 0.2, 0.8);{đặt vào phần bên trái hình} polyline(9, x, y); for k:=1 to 13 begin {đọc liệu cho đồ thị thứ hai} x[k]:=k; readln(y[k]); end; set_window(1, 13, 10, 100); {các giá trị liệu từ 10 đến 100} set_viewport(0.6, 0.9, 0.2, 0.8);{đặt liệu vào phần bên phải hình} polyline(13, x, y); end;{two graph} Một phương pháp khác để xây dựng vùng đa cửa sổ vùng quan sát gói đồ họa gán nhãn đến xác định Điều làm việc thêm đối số thứ năm vào lệnh cửa sổ vùng quan sát để xác định vùng định Các tham số số nguyên (0, 1, 2, 3, …) Các lệnh xuất sau dùng số để định chuyển đổi từ cửa sổ đến vùng quan sát Cơ chế đánh số dùng để gắn kết độ ưu tiên với vùng quan sát, sở để cài đặt tính chất nhìn thấy cửa sổ nằm đè lên Các vùng quan sát hiển thị theo độ ưu tiên trình bày hình 4-4: Hình 4-4: Hiển thị vùng quan sát theo thứ tự ưu tiên Các vùng quan sát có số thứ tự nhỏ có quyền ưu tiên cao 01 Trang 62 Chương 4: Windowing Clipping Để cài đặt cách làm việc đa trạm (multiple workstation) , tập bổ sung lệnh cửa sổ vùng quan sát định nghĩa Các lệnh có chứa số trạm, giúp xây dựng cửa sổ vùng quan sát trạm làm việc khác Điều cho phép người dùng hiển thị phần khác ảnh kết lên thiết bị xuất khác Ví dụ, kiến trúc sư hiển thị tổng thể vẽ nhà lên hình, cịn chi tiết tầng hiển thị lên hình thứ hai (xem hình 4.5) Hình 4-5 Quay cửa sổ, xác định góc a Window a Các lệnh cửa sổ vùng quan sát vừa giới thiệu dùng cho vùng hình chữ nhật, đường biên chúng song song với trục tọa độ Vài gói đồ họa cho phép người dùng chọn kiểu cửa sổ vùng quan sát khác Một cửa sổ bị quay, hình 4-5, xác định với tham số góc a lệnh cửa sổ Một khả khác định rõ đa giác cửa sổ việc cho chuỗi đỉnh Chúng ta bắt đầu việc trình bày thuật tốn cài đặt cửa sổ vùng quan sát hình chữ nhật, biên chúng song song với trục x y Các cửa sổ có hình dạng đặc biệt khác thảo luận sau thuật tốn mở rộng (xem hình 4-6) Input hình ảnh hệ tọa độ giới thực nhờ chương trình ứng dụng Thủ tục Clipping Ánh xạ vùng cửa sổ vào vùng quan sát hệ tọa độ thiết bị chuẩn Chuyển đổi vùng vùng quan sát sang hệ tọa độ thiết bị Hiển thị lên thiết bị xuất vật lý Hình 4-6 Quá trình chuyển đổi cửa sổ vào vùng quan sát 4.3 Các thuật toán Clipping Ánh xạ vùng cửa sổ vào vùng quan sát, kết hiển thị phần phạm vi cửa sổ Mọi thứ bên cửa sổ bị loại bỏ Các thủ tục để loại bỏ phần hình ảnh nằm bên ngồi biên cửa sổ xem thuật toán clipping (clipping algorithms) đơn giản gọi clipping Trang 63 Chương 4: Windowing Clipping Việc cài đặt phép biến đổi cửa sổ thường thực việc cắt (clipping) khỏi cửa sổ, sau ánh xạ phần bên cửa sổ vào vùng quan sát (hình 6-6) Như lựa chọn, vài gói đồ họa ánh xạ định nghĩa hệ tọa độ giới thực vào hệ tọa độ thiết bị chuẩn sau cắt khỏi biên vùng quan sát Trong các phần thảo luận sau, giả thiết việc cắt thực dựa vào đường biên cửa sổ hệ tọa độ giới thực Sau cắt xong, điểm bên cửa sổ ánh xạ đến vùng quan sát Việc cắt điểm khỏi cửa sổ hiểu đơn giản kiểm tra giá trị tọa độ để xác định xem chúng có nằm bên biên khơng Một điểm vị trí (x,y) giữ lại để chuyển đổi sang vùng quan sát thỏa bất phương trình sau: xwmin ≤ x ≤ xwmax, ywmin ≤ y ≤ ywmax (4-1) Nếu điểm không thỏa bốn bất phương trình trên, bị cắt bỏ Trong hình 4-7, điểm P1 giữ lại, điểm P2 bị cắt bỏ y ywmax y P4 P3 P7 P5 P2 • Window P6 ywmax P1 • P10 ywmin P’7 P8 xwmax x Trước Clipping (a) P1 • P10 ywmin P9 xwmin P5 Window P6 P’9 xwmin P’8 xwmax x Sau Clipping (b) Hình 4-7 Điểm đoạn thẳng bị cắt khỏi cửa sổ Hình 4-7 minh họa quan hệ có vị trí đoạn thẳng với biên cửa sổ Chúng ta kiểm tra đoạn thẳng xem có bị cắt hay không việc xác định xem hai điểm đầu mút đoạn thẳng nằm hay nằm cửa sổ Một đoạn thẳng với hai đầu nằm cửa sổ giữ lại hết, đoạn từ P5 đến P6 Một đoạn với đầu nằm (P9) đầu nằm (P10) bị cắt bớt giao điểm với biên cửa sổ (P’9) Các đoạn thẳng có hai đầu nằm ngồi cửa sổ, rơi vào hai trường hợp: tồn đoạn thẳng nằm đoạn thẳng cắt hai cạnh cửa sổ Trang 64 Chương 4: Windowing Clipping Đoạn từ P3 đến P4 bị cắt bỏ hoàn toàn Nhưng đoạn từ P7 đến P8 giữ lại phần từ P’7 đến P’8 Thuật toán clipping đường (line-clipping) xác định xem đoạn toàn nằm trong, đoạn bị cắt bỏ hoàn toàn hay bị cắt phần Đối với đoạn bị cắt bỏ phần, giao điểm với biên cửa sổ phải tính Vì hình ảnh chứa hàng ngàn đoạn thẳng, việc xử lý clipping nên thực cho có hiệu Trước tính giao điểm, thuật toán nên xác định rõ tất đoạn thẳng giữ lại hoàn toàn bị cắt bỏ hoàn toàn Với đoạn xem xét bị cắt bỏ, việc xác định giao điểm cho phần giữ lại nên thực với tính tốn Một tiếp cận để cắt đoạn dựa chế đánh mã phát triển Cohen Sutherland Mọi điểm hai đầu mút đoạn thẳng hình ảnh gán mã nhị phân bit, gọi mã vùng (region code), giúp nhận vùng tọa độ điểm Các vùng xây dựng dựa xem xét với biên cửa sổ, hình 6-8 Mỗi vị trí bit mã vùng dùng để bốn vị trí tọa độ tương ứng điểm so với cửa sổ: bên trái (left), phải (right), đỉnh (top), đáy (bottom) Việc đánh số theo vị trí bit mã vùng từ đến cho từ phải sang trái, vùng tọa độ liên quan với vị trí bit sau: Bit – left Bit – right Bit – below Bit – above Giá trị vị trí điểm vị trí tương ứng, ngược lại bit vị trí Nếu điểm nằm cửa sổ, mã vị trí 0000 Một điểm bên bên trái cửa sổ có mã vùng 0101 (xem hình 4-8) Hình 4-8 Các mã vùng nhị phân cho điểm đầu mút đoạn thẳng, dùng để định nghĩa vùng tọa độ liên hệ với cửa sổ 1001 1000 1010 0001 0000 Window 0010 0101 0100 0110 Trang 65 Chương 4: Windowing Clipping Các giá trị bit mã vùng xác định cách so sánh giá trị tọa độ (x,y) điểm đầu mút với biên cửa sổ Bit đặt lên x < xwmin Các giá trị ba bit lại xác định cách so sánh tương tự Trong ngơn ngữ lập trình, làm việc bit thực được, giá trị bit mã vùng xác định theo bước sau: (1) Tìm hiệu tọa độ điểm đầu mút với biên cửa sổ (2) Dùng bit dấu (kết hiệu) để đặt giá trị tương ứng mã vùng Bit bit dấu x - xwmin; bit bit dấu xwmax – x; bit bit dấu y - ywmin; bit bit dấu ywmax – y Khi xây dựng xong mã vùng cho tất điểm đầu mút, xác định nhanh chóng đoạn thẳng hoàn toàn nằm cửa sổ, đoạn hoàn toàn nằm Bất kỳ đoạn có mã vùng đầu mút 0000 nằm cửa sổ chấp nhận đường Bất kỳ đường mà hai mã vùng hai đầu mút có số vị trí bit đoạn hồn tồn nằm cửa sổ, loại bỏ đoạn Ví dụ, vứt bỏ đoạn có mã vùng đầu 1001, đầu 0101 (có bit vị trí nên hai đầu mút đoạn nằm phía bên trái cửa sổ) Một phương pháp dùng để kiểm tra đoạn cho việc cắt toàn thực phép logic and với hai mã vùng Nếu kết 0000 đoạn nằm bên ngồi cửa sổ (xem hình 4-9) P2 Hình 4-9 Các đọan từ điểm đến điểm khác cắt cửa sổ giao điểm với biên nằm cửa sổ P’2 Window P3 P’3 P1 P’1 P4 Các đường không nhận dạng hoàn toàn nằm hay hoàn toàn nằm ngồi cửa sổ thơng qua phép kiểm tra tìm giao điểm với biên cửa sổ Như hình 4-9, đường thuộc nhóm cắt khơng cắt cửa sổ Chúng ta xử lý đoạn cách so sánh điểm đầu mút (cái nằm cửa sổ) với biên cửa sổ để xác định phần đường bị bỏ Sau đó, phần đường giữ lại kiểm tra với biên khác, tiếp tục toàn đường bị bỏ hay đến phần đường xác định Trang 66 Chương 4: Windowing Clipping nằm cửa sổ Chúng ta xây dựng thuật toán để kiểm tra điểm đầu mút tương tác với biên cửa sổ bên trái, bên phải, bên hay đỉnh Để minh họa bước xác định việc cắt đoạn khỏi biên cửa sổ dùng thuật toán Cohen-Sutherland, xem đoạn hình 4-9 xử lý Bắt đầu điểm đầu mút bên từ P1 đến P2, ta kiểm tra P1 với biên trái, phải đáy cửa sổ thấy điểm nằm phía cửa sổ Ta tìm giao điểm P’1 với biên Sau tìm giao điểm P’1, vứt bỏ đoạn từ P1 đến P’1 Tương tự, P2 bên ngồi cửa sổ, kiểm tra thấy điểm nằm phía cửa sổ Giao điểm P’2 tính, đoạn từ P’1 đến P’2 giữ lại Kết thúc trình xử lý đoạn P1P2 Bây xét đoạn kế tiếp, P3P4 Điểm P3 nằm bên trái cửa sổ, ta xác định giao điểm P’3 loại bỏ đoạn từ P’3 đến P3 Bằng cách kiểm tra mã vùng phần đoạn thẳng từ P’3 đến P4, thấy phần cịn lại nằm phía cửa sổ bị vứt bỏ Các giao điểm với biên cửa sổ tính cách dùng tham số phương trình đường thẳng Với đường thẳng qua hai điểm (x1, y1) (x2, y2), tung độ y giao điểm với biên dọc cửa sổ tính theo phép tính: y = y1 + m (x - x1) (4-2) Ở giá trị x đặt xwmin xwmax, độ dốc m tính m = (y2 - y1)/ (x2 - x1) Tương tự, ta tìm giao điểm với biên ngang, hồnh độ x tính sau: x = x1 + (y - y1)/m (4-3) với y ywmin ywmax Thủ tục sau minh họa thuật toán clipping đường (line-clipping) CohenSutherland Các mã cho điểm đầu mút chứa mảng Boolean bốn phần tử var xw_min, xw_max, yw_min, yw_max: real; procedure clip_a_line (x1, y1, x2, y2: real); type Trang 67 Chương 4: Windowing Clipping q vừa kiểm tra xong, điểm đầu mút đoạn bị cắt xác định từ giá trị u1 u2 var xwmin, xwmax, ywmin, ywmax : real; procedure clipper (var x1, y1, x2, y2 : real); var u1, u2, dx, dy : real; function cliptest (p, q : real; var u1, u2 : real); var r : real; result : boolean; begin result := true; if p < then begin {đoạn từ bên vào bên biên } r := q / p; if r > u2 then result := false {huỷ bỏ đoạn cập nhật u1 thích hợp} else if r > u1 then u1 :=r end {if p < 0} else if p > then begin {đoạn từ bên bên biên} r := q / p; if r < u1 then result := false else if r < u2 then u2 := r end {if p > 0} else if q < then result := fasle; cliptest := result end; {cliptest} begin {clipper} u1 := 0; u2 := 1; Trang 73 Chương 4: Windowing Clipping dx := x2 – x1; if cliptest (-dx, x1 – xwmin, u1, u2) then if cliptest (dx, xwmax – x1, u1, u2) then begin dy := y2 - y1; if cliptest (-dy, y1 – ywmin, u1, u2) then if cliptest(dy, ywmax – y1, u1, u2) then begin {nếu u1 u2 nằm đoạn [0,1], dùng để tính điểm đầu mút mới} if u2 < then begin x2 := x1 + u2 * dx; y2 := y1 + u2 * dy end; {if u2 < 1} if u1 > then begin x1 := x1 + u1 * dx; y1 := y1 + u1 * dy end; {if u1 > 0} end {if cliptest} end {if cliptest} end; {clipper} Thuật toán clipping đường Liang Barsky giảm bớt tính tốn cần thiết để cắt đoạn Mỗi lần cập nhật u1 u2 cần phép chia, giao điểm với cửa sổ tính lần, mà giá trị u1 u2 vừa hoàn thành Trái lại, thuật tốn Cohen Sutherland lặp lại việc tính giao điểm đoạn với biên cửa sổ, phép tính giao điểm cần hai phép chia nhân (xem hình 4-11) Hình 4-11 Cửa sổ bị quay bao quanh biên chữ nhật lớn (có cạnh song song với hệ trục tọa độ) Window Hình chữ nhật bao quanh Trang 74 Chương 4: Windowing Clipping Khi cửa sổ bị quay hay đa giác có hình dạng (được dùng làm cửa sổ vùng quan sát), thuật toán clipping thảo luận cần vài thay đổi Nó dùng để che chắn đoạn thẳng Một cửa sổ bị quay, đa giác khác, bị bao quanh hình chữ nhật lớn (hình chữ nhật có trục song song với trục tọa độ) (hình -11) Bất kỳ đoạn thẳng nằm bên ngồi hình chữ nhật bao quanh lớn (bounding rectangle) nằm bên ngồi cửa sổ (window) Các kiểm tra nằm không dễ dàng, giao điểm phải tính dùng phương trình đường thẳng biên cửa sổ đoạn thẳng bị cắt Clipping vùng (Area clipping) Làm đa giác dùng ứng dụng vẽ đường (line-drawing application) bị cắt cách xử lý đoạn thẳng thành phần thông qua thuật toán clipping đường thảo luận Một đa giác xử lý theo cách thu giảm loạt đoạn bị cắt (xem hình 4-12) Hình 4-12: Đa giác bị cắt thuật toán clipping đường Trước clipping Sau clipping Khi một biên đa giác định nghĩa vùng tô, hình 4-13 Một version thay đổi thuật toán clipping đường cần đến Trong trường hợp này, nhiều vùng kép kín phải tạo để định nghĩa biên cho vùng tơ (xem hình 4-13) Trang 75 Chương 4: Windowing Clipping Hình –13: Một vùng có hình dạng, trước sau clipping Trước clipping Sau clipping Một kỹ thuật cho việc clipping đa giác, phát triển Sutherland Hodgman, thực việc clipping cách so sánh đa giác với biên cửa sổ Kết trả thuật toán tập đỉnh định nghĩa vùng bị cắt (vùng tơ với màu hay mẫu tơ đó) Phương pháp thể hình 4-14 Các vùng đa giác định nghĩa việc xác định dãy có thứ tự đỉnh Để cắt đa giác, so sánh đỉnh với biên cửa sổ Các đỉnh nằm bên cạnh cửa sổ giữ lại cho việc clipping với biên cửa sổ (xem hình 4-15) Hình 4-14 Clipping vùng đa giác cách dùng biên cửa sổ Đa giác gốc Cắt bên trái •S Cắt bên phải I S• • •P P• Cắt bên Hình 4-15 clipping •S •P P• Lưu P (a) Cắt bên •I S• Lưu I (b) Không điểm lưu (c) Lưu I, P (d) Trang 76 Chương 4: Windowing Clipping Quá trình xử lí đỉnh dâ giác liên Hình 4-16 Clipping đa giác khỏi cạnh bên trái cửa sổ, bắt đầu với đỉnh Các số có phẩy dùng để đánh nhãn điểm lưu thuật toán clipping Window 2’ 1’ quan đến biên cửa sổ Từ đỉnh S, đỉnh xét (P) sinh điểm, khơng điểm nào, hai điểm lưu thuật toán đỉnh bên cạnh cửa sổ bị vứt bỏ Nếu khởi hành từ điểm bên cạnh cửa sổ đến điểm bên ngoài, lưu lại giao điểm 3’ đoạn thẳng với biên cửa sổ Cả hai giao điểm đỉnh đa giác lưu lại từ cạnh cửa 5’ 4’ sổ vào bên Khả thứ tư xảy xử lí điểm (P) điểm trước (S) với biên cửa sổ minh họa hình 4-15 Một điểm bên biên cửa sổ lưu lại (trường hợp a), điểm bên ngồi khơng (trường hợp c) Nếu điểm P điểm trước S nằm phía đối diện qua biên (P trong, S ngồi ngược lại), giao điểm I tính lưu (trường hợp b d) Trong trường hợp d, điểm P nằm điểm trước S nằm ngồi, hai giao điểm I P lưu Khi tất đỉnh vừa xử lí với biên trái cửa sổ, tập điểm lưu tiếp tục bị cắt xem xét với biên cửa sổ Chúng ta minh họa phương pháp việc xử lí vùng hình 4-16 xem xét với biên bên trái cửa sổ Đỉnh xác định nằm bên biên Đi qua đến đỉnh 3, nằm bên trong, tính giao điểm lưu lại hai giao điểm đỉnh Đỉnh xác định nằm trong, chúng lưu lại Đỉnh thứ sáu đỉnh cuối nằm ngồi, tính lưu giao điểm Dùng năm điểm vừa lưu, lặp lại trình xem xét với biên cửa sổ Cài đặt thuật tốn vừa mơ tả địi hỏi phải dùng khơng gian lưu trữ ngồi để lưu điểm Điều tránh quản lý điểm (điểm sửa lưu nhanh qua để kiểm tra tiếp), với lệnh (instructions) để cắt khỏi biên cửa sổ Chúng ta lưu điểm (dù đỉnh nguyên thuỷ đa giác hay đỉnh có tính giao điểm) sau xử lí xem xét với tất biên Như thể có đường ống chứa Trang 77 Chương 4: Windowing Clipping chuỗi động tác clipping Một điểm nằm bên hay nằm biên cửa sổ giai đoạn qua để đến giai đoạn Thủ tục sau thể tiếp cận Một mảng s, lưu điểm vừa bị cắt cho với biên cửa sổ Q trình qua đỉnh p vào trình clip_this để xem xét việc cắt với cạnh cửa sổ Nếu đoạn thẳng định nghĩa điểm đầu mút p s[edge] cắt cạnh cửa sổ này, giao điểm xác định qua để đến giai đoạn Nếu p nằm bên cửa sổ, bị bỏ qua để đến giai đoạn clipping Bất kì điểm cịn giữ lại sau xem xét với tất cạnh cửa sổ sau gia nhập vào mảng kết kết xuất x_out y_out Mảng first_point lưu giữ cho cạnh cửa sổ điểm bị cắt cạnh Sau tất đỉnh đa giác vừa xem xét xong, trình kết thúc cắt đoạn (đoạn định nghĩa điểm đầu cuối (các điểm bị cắt khỏi mỗi cạnh)) type point = array [1 max_points] of real; procedure polygon_clip (n : integer; x, y : points; var m : integer; var x_out, y_out : points); const boundary_count = 4; type vertex = array [1 2] of real; boundary_range = boundary_count; var k : integer; p : vertex; s, first_point : array [1 boudary_count] of vertex; new_edge : array [1 boundary_count] of boolean; function inside (p : vertex; edge : boundary_range) : boolean; begin {trả true đỉnh p nằm cạnh edge cửa sổ} end; { inside} Trang 78 Chương 4: Windowing Clipping function cross (p, s : vertex; edge : integer) : boolean; begin {trả true cạnh đa giác ps cắt biên cửa sổ} end; {cross} procedure output_vertex (p : vertex); begin m := m +1; x_out[m] := p[1]; y_out[m] := p[2]; end; { output_vertex } procedure find_intersection (p, s : vertex; edge : boundary_range; var i; vertex); begin {trả tham số i giao điểm ps với biên edge cửa sổ } end; { intersection } procedure clip_this (p : vertex; edge : boundary_range); var i : vertex; begin{ clip_this } {lưu điểm cắt biên cửa sổ} if new_edge[edge] then begin first_point[edge] := p; new_edge[edge] := false end {new_edge} else {nếu ps cắt biên cửa sổ, tìm giao điểm, cắt giao điểm khỏi cạnh cửa sổ} if cross (p, s[edge], edge) then begin find_intersection (p, s[edge], edge , i); if edge < boundary_count then clip_this (i, edge +1) else output_vertex (i) Trang 79 Chương 4: Windowing Clipping end; {nếu ps cắt cạnh} {cập nhật đỉnh lưu} s[edge] := p; {nếu p nằm bên cạnh cửa sổ này, cắt khỏi cạnh cửa sổ} if inside (p, edge) then if edge < boundary_count then clip_this (p, edge +1) else output_vertex (p) end; {clip_this} procedure clip_closer; {đóng q trình Đối với cạnh cửa sổ, cắt đường (đang nối với đỉnh lưu sau điểm first_point bị xử lý khỏi cạnh)} var i : vertex; edge : integer; begin for edge := to boundary_count if cross (s[edge], first_point[edge], edge) then begin find_intersection (s[edge], first_point[edge], edge, i); if edge < boundary_count then clip_this (i, edge +1) else output_vertex (i) end {nếu s first_point cắt cạnh} end; {clip_closer} begin {polygon_clip} m :=0; {số đỉnh kết xuất} for k := to boundary_count new_edge[k] := true; for k:= to n begin {đặt đỉnh vào đường ống (pipeline)} p[1] := x[k]; p[2] := y[k]; clip_this (p, 1) {cắt khỏi cạnh cửa sổ} end; {for k} Trang 80 Chương 4: Windowing Clipping clip_closer {đóng đa giác} end; { polygon_clip } Khi đa giác lõm bị cắt cửa sổ hình chữ nhật, vùng bị cắt sau hình thành hai đa giác riêng biệt thật Vì thuật tốn cắt vùng tạo danh sách đỉnh, vùng riêng biệt nối lại đoạn thẳng nối Một ví dụ hiệu ứng thể hình 4-17 Sự xem xét đặt biệt thực trường hợp để gỡ bỏ đoạn nối dư thừa, thuật toán clipping tổng quát phát triển (xem hình 4-17) Hình 4-17: Clipping đa giác lõm hình (a) cửa sổ tạo hai vùng nối hình (b) Window (a) (b) Dù giới hạn việc thảo luận cửa sổ chữ nhật có cạnh song song với trục x trục y., cài đặt thuật tốn với cửa sổ có hình đa giác Chúng ta cần lưu trữ thơng tin biên cửa sổ, cần thay đổi thủ tục inside find_intersection để quản lý thuộc tính biên tuỳ ý Một tiếp cận khác để clipping vùng đa giác dùng phương pháp phương trình tham số Các cửa sổ hình dạng tuỳ ý sau xử lí cách dùng phương trình tham số đường thẳng để mô tả hai: biên cửa sổ biên vùng bị cắt Các vùng bị clipping hình dạng khác đa giác cần thực nhiều cơng việc chút, biên vùng khơng định nghĩa phương trình Trang 81 Chương 4: Windowing Clipping đường thẳng Ví dụ, hình 4-18, phương trình đường trịn cần để tìm hai giao điểm biên cửa sổ Hình 4-18: Clipping vùng có hình dạng trịn Trước clipping Clipping văn (Text Clipping) Có vài kỹ thuật dùng để clipping văn gói đồ họa Việc chọn lựa phương pháp cụ thể để cài đặt phụ thuộc vào phương pháp dùng để sinh kí tự mức độ tinh vi đòi hỏi người dùng việc xử lí văn (xem hình 4-19) Hình 4-19 Clipping văn dùng biên chữ nhật Bất kỳ hình chữ nhật mà nằm đè lên biên cửa sổ bị vứt bỏ hoàn toàn Trước clipping Sau clipping Phương pháp đơn giản để xử lí chuỗi kí tự có liên quan đến biên cửa sổ dùng chiến lượt “clipping tất văn khơng clipping cả” (all-or-none text-clipping), trình bày hình 6-19 Nếu tất chuỗi kí tự nằm bên cửa sổ, giữ lại Ngược lại, chuỗi vứt bỏ Thủ tục cài đặt việc xem xét hình chữ nhật bao quanh mẫu văn Các vị trí biên hình chữ nhật sau so sánh với biên cửa sổ, chuỗi bị huỷ bỏ có nằm đè Phương pháp cho ta clipping nhanh Một chọn lựa để loại bỏ tồn chuỗi kí tự nằm đè lên biên cửa sổ dùng chiến lược “clipping kí tự tồn khơng” (all-or-none characterclipping) Ở vứt bỏ kí tự khơng hồn tồn nằm cửa Trang 82 Chương 4: Windowing Clipping sổ ( xem hình 4-20) Trong trường hợp này, giới hạn biên kí tự đơn lẻ so sánh với cửa sổ Bất kì kí tự nằm đè lên nằm bên ngồi biên cửa sổ bị cắt bỏ Hình 4-20 Các chuỗi kí tự hồn tồn bị cắt kí tự hồn nằm bên cửa sổ giữ lại Trước clipping Sau clipping Phương pháp sau cho việc quản lí việc cắt văn cắt kí tự riêng lẻ Bây xem kí tự tương tự đoạn thẳng Nếu kí tự riêng lẻ nằm đè lên biên cửa sổ, cắt bỏ phần nằm ngồi cửa sổ (xem hình 4-21) Các kí tự hình thành với đoạn thẳng xử lí theo cách này, cách dùng thuật tốn clipping đường Việc xử lí kí tự hình thành đồ bit cần clipping pixel đơn lẻ cách so sánh vị trí liên hệ mẫu lưới (patern grid) với biên cửa sổ Hình 4-21 Clipping kí tự đơn lẻ Trước clipping Sau clipping Tẩy xố (banking) Thay lưu giữ lại thơng tin vùng định nghĩa,, vùng cửa sổ dùng để xóa bỏ thứ bên biên Những nằm bên ngồi giữ lại Việc xoá bỏ tất màu kết xuất vùng định có ý nghĩa thuận lợi cho việc nạp chồng hình ảnh khác Các kỹ thuật thường dùng để thiết kế trang trình bày (layout) quảng cáo ứng dụng xuất (publishing) cho việc thêm nhãn mẫu thiết hình ảnh Kỹ Trang 83 Chương 4: Windowing Clipping thuật dùng để nối kết biểu đồ, đồ, giản đồ Hình 4-22 minh họa vài ứng dụng tẩy xóa Khi hai hiển thị che phủ lên dùng đến phương pháp tẩy xóa, nghĩ đến cận cảnh (ảnh gần-foreground) lại xem ảnh (background) Một cửa sổ xóa, bao quanh vùng hiển thị cận ảnh, đặt lên ảnh nền, phần hình ảnh nằm vùng cửa sổ bị xóa Hai hiển thị nối kết lại, với thông tin cận ảnh đặt vào vùng cửa sổ bị xóa Hình 4-22 Các ví dụ tẩy xóa: (a) Một vùng cung cấp để dán nhãn; (b) Một vùng dùng để xóa phần hiển thị trước để tạo vùng trống cho nạp chồng ảnh lên (a) (b) 4.4 Phép biến đổi từ cửa sổ - đến – vùng quan sát Khi tất điểm, đoạn thẳng, văn vừa bị cắt, chúng ánh xạ lên vùng vùng quan sát để hiển thị Phép biến đổi đến vùng quan sát thực để vị trí tọa độ liên hệ giữ lại Trong hình 4-23, điểm vị trí (xw, yw) cửa sổ ánh xạ vị trí (xv, yv) vùng quan sát Để trì đặt liên hệ tương tự vùng quan sát cửa sổ, cần: xw − xwmin xv − xvmin = xwmax − xwmin xv max − xv (4-10) yw − ywmin yv − yv = ywmax − ywmin yvmax − yvmin (4-11) Ta viết lại phương trình (4-10) (4-11) phép tính biến đổi rõ ràng cho tọa độ xv yv: xv max − xv xv = ( xw − xwmin ) + xv (4-12) xwmax − xwmin yv max − yvmin yv = ( yw − ywmin ) + yv ywmax − ywmin Trang 84 Chương 4: Windowing Clipping Các phép tính biến đổi từ cửa sổ - đến - vùng quan sát viết chặt chẽ sau: xv = sx(xw - xwmin) + xvmin (4-13) yv = sy(yw - ywmin) + yvmin Phép biến đổi bao gồm hai phép biến đổi tỉ lệ tịnh tiến Các hệ số tỉ lệ sx sy phụ thuộc vào kích thước liên hệ cửa sổ vùng quan sát Các hệ số tỉ lệ phải đối tượng muốn bảo tồn cân đối (đồng dạng) chúng ánh xạ đến vùng quan sát Khi cửa sổ vùng quan sát có kích thước (sx = sy = 1), khơng có thay đổi kích thước đối tượng biến đổi Giá trị xvmin yvmin cho biết hệ số tịnh tiến để di chuyển đối tượng vào vùng quan sát Các chuỗi kí tự quản lí theo hai cách chúng ánh xạ đến vùng quan sát Việc ánh xạ đơn giản bảo tồn kích thước kí tự, chí vùng quan sát mở rộng hay thu nhỏ lại so với cửa sổ Phương pháp dùng đến văn tạo với font chuẩn – bị thay đổi Trong hệ thống mà có cho phép thay đổi kích thước kí tự chuẩn, định nghĩa chuỗi đặt cửa sổ tương tự từ gốc Đối với kí tự hình thành đoạn thẳng, việc ánh xạ đến vùng quan sát thực dãy phép biến đổi đường (xem hình 4-23) y y ywmax (xw, yw) • yvmax (xv, yv) • ywmin yvmin xwmin xwmax x xvmin xvmax x Hình 4-23: Một điểm vị trí (xw, yw) cửa sổ ánh xạ đến điểm (xv, yv) vùng quan sát Việc ánh xạ thực cho tỷ lệ tương quan hai vùng tương tự Trang 85 Chương 4: Windowing Clipping 4.5 Tổng kết chương - Cần nắm vững khái niệm Window, cách mã vùng theo giải thuật CohenSutherland Phân biệt điểm thuộc không thuộc window - Lưu ý cách sử dụng phương trình tham số đường thẳng giải thuật Liang-Barsky - Có thể 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 xén tập đoạn thẳng rời - Lưu ý điều mong muốn kết sau xén đa giác phải đa giác để chuyển thành vùng tô 4.6 Bài tập chương Viết chương trình tạo 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) Tiếp tục 1, xét điểm P(x,y) có nằm bên cửa sổ không ? Biết P(x,y) nằm bên cửa sổ P thoả hệ bất phương trình sau : Xmin ≤ x ≤ Xmax Ymin ≤ y ≤ Ymax Tiếp tục tập 2, xét toán xén đoạn thẳng cho điểm P1(x1, y1), P2(x2, y2) Tiếp tục tập 3, sử dụng thuật toán Cohen - Sutherland (phân chia mã vùng) xét toán xén đoạn thẳng cho điểm P1(x1, y1), P2(x2, y2), P3(x3, y3), P4(x4, y4), P5(x5, y5), P6(x6, y6), P7(x7, y7), P8(x8, y8) vào cửa sổ chữ nhật xem hình vẽ (a) (b)) Thảo luận kỹ nhân tố đằng sau kiểm tra phương khác để tính tham số giao u1 u2 thuật toán clipping đường LiangBarsky Trang 86 Chương 4: Windowing Clipping So sánh số lượng phép tính tốn học thực thuật toán clipping đường Cohen-Sutherland Liang-Barsky vài hướng đoạn thẳng khác liên quan đến cửa sổ clipping Cài đặt thuật toán thuật toán clipping đường Liang-Barsky lên hệ thống bạn Hãy nghĩ thuật toán để thực việc clipping đường cách dùng phương pháp phân chia điểm Sự cài đặt phần mềm thuật tốn có thuận lợi hai thuật toán clipping đường thảo luận chương không? Cài đặt thuật toán cắt đoạn thẳng cách dùng cửa sổ bị quay, định nghĩa giá trị tọa độ nhỏ lớn bị quay góc hình 6-5 10 Thay đổi thuật toán clipping đa giác để cắt vùng đa giác lõm cách hợp lý (Một phương pháp để thực điều chia đa giác lõm làm đa giác lồi.) 11 Sửa lại cho hợp lí thuật toán clipping đường Liang-Barsky để clipping đa giác 12 Viết thủ tục để cắt ellipse cách dùng cửa sổ chữ nhật 13 Giả sử kí tự định nghĩa lưới điểm (pixel grid), phát triển thuật toán clipping văn để cắt kí tự đơn lẻ theo chiến lược “tất - 14 không” Hãy phát triển thuật tốn clipping văn để cắt kí tự đơn lẻ, giả sử kí tự định nghĩa lưới điểm (pixel grid) 15 Viết thủ tục thực xóa phần hình ảnh định nghĩa, dùng kích thước cửa sổ xóa xác định 16 Viết thủ tục để cài đặt lệnh cứa sổ vùng quan sát Tức là, thủ tục có chứa tham số hệ tọa độ lệnh để thực biến đổi sang vùng quan sát cho cảnh cụ thể: clipping hệ tọa độ giới thực, chuyển đổi sang hệ tọa độ chuẩn hóa, sau biến đổi đến hệ tọa độ thiết bị Trang 87 ... muốn hiển thị (xem hình 4. 2) yw (-6 0.5, 82.5) ( -4 1.25, 82.5) Window Viewport (-6 0.5, -2 0.75) xw 0.5 (41 .25, -2 0.75) Hệ tọa độ giới thực Hệ tọa độ thiết bị chuẩn Hình 4- 2 : Ánh xạ cửa sổ vào vùng... xwmax ( 4- 6 ) ywmin ≤ y1 + Δy u ≤ ywmax Bốn bất phương trình viết lại theo hình thức sau: pk u ≤ qk, k = 1, 2, 3, ( 4- 7 ) p q định nghĩa sau: p1 = -? ?x, q1 = x1 - xwmin p2 = -? ?x, q2 = xwmax – x1 ( 4- 8 )... ywmax − ywmin Trang 84 Chương 4: Windowing Clipping Các phép tính biến đổi từ cửa sổ - đến - vùng quan sát viết chặt chẽ sau: xv = sx(xw - xwmin) + xvmin ( 4- 1 3) yv = sy(yw - ywmin) + yvmin Phép

Ngày đăng: 11/05/2021, 01:34

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

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

Tài liệu liên quan