1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Line Clipping in 2D - Xén đường thẳng trong 2D

23 240 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 23
Dung lượng 176,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Các đoạn thẳng có 2 điểm hoàn toàn nằm trong cửa sổ thì cả đoạn thẳng nằm trong cửa sổ nên không cần xén... Với các đoạn thẳng cắt biên cửa sổ xén, chúng ta phải tìm giao điểm của đoạn t

Trang 1

Line Clipping in 2D

Xén đường thẳng trong 2D

Trang 3

Mô hình bài toán xén đường thẳng

• Clipping Window - cửa sổ xén: được định nghĩa bởi 2 điểm

Phía dưới bên trái: (x Phía dưới bên trái: ( x min , y min )

Phía trên bên phải: (x Phía trên bên phải: ( x max , y max )

max min

y y

y

x x

x

Điểm P(x,y) thuộc Clipping Window :

Điểm P(x,y) thuộc Clipping Window :

Trang 5

Yêu cầu của bài toán xén đường thẳng

Loại bỏ phần đường thẳng nằm ngoài cửa sổ xén

Trang 6

Các nhận xét

1 Các đoạn thẳng có 2 điểm hoàn toàn nằm trong cửa sổ thì cả đoạn

thẳng nằm trong cửa sổ nên không cần xén

Trang 8

Các nhận xét (cont.)

3 Với các đoạn thẳng cắt biên cửa sổ xén, chúng ta phải tìm giao điểm của đoạn thẳng với biên cửa sổ để chọn phần nằm bên trong cửa sổ

Trang 9

Thuận toán Cohen – Sutherland

bottom-left

Trang 10

Thuận toán Cohen – Sutherland AREA CODE – Mã vùng (cont.)

• Một số nguyên gồm 4 bit nhị phân gọi là mã vùng sẽ được gán cho

mỗi vùng để mô tả vị trí của vùng so với cửa sổ

• Các vùng nằm ngoài biên trái (LEFT) của cửa sổ xén có bit 1 bằng 1 Các vùng còn lại có bit 1 bằng 0

• Tương tự cho các bit từ 2 đến 4: bit 2: RIGHT; bit 3: TOP; bit 4:

1001

RIGHT TOP

BOTTOM LEFT

Trang 11

Thuận toán Cohen – Sutherland

Mã vùng của điểm

int Encode(Point p)

{

int code = 0;

if (p.x < xmin) code |= LEFT;

if (p.x > xmax) code |= RIGHT;

if (p.y > ymax) code |= TOP;

if (p.y < ymin) code |= BOTTOM;

1 được đặt là 1 nếu x <

xmin, bit 1 được đặt là 0 nếu x >= xmin.

0000 OR 0010

0000

0010 OR 0100

0110

Trang 12

1 Các đoạn thẳng nằm hoàn toàn bên trong cửa sổ sẽ có c 1 == c 2 == 0000, các đoạn thẳng này sau khi xén sẽ là chính nó nên thuật toán dừng tại đây.

0000

Trang 13

Thuật toán (cont.)

2 Các đoạn thẳng nằm ngoài biên cửa sổ sẽ có đặc điểm sau : tồn tại bit thứ k (k=1, ,4) sao cho c 1 và c 2 cùng có giá trị 1 tại bit thứ k Ví dụ, nếu k = 1 thì đoạn thẳng sẽ nằm ngoài biên trái của cửa sổ Đoạn thẳng này sẽ bị loại bỏ sau khi xén, cho nên thuật toán dừng tại đây Khi cài đặt, chúng ta chỉ cần

sử dụng phép toán AND của bit đối với c1 và c2 Nếu kết quả khác 0, đoạn thẳng sẽ nằm ngoài biên cửa sổ.

≠ 0

Trang 14

Thuật toán (cont.)

3 Nếu c 1 và c 2 không thuộc hai trường hợp trên, chắc chắn rằng đoạn thẳng sẽ cắt biên cửa sổ Chúng ta sẽ xác định giao điểm này Trong trường hợp này,

sẽ có ít nhất 1 đầu đoạn thẳng nằm ngoài cửa sổ, không mất tính tổng quát chúng ta giả sử đó là P1

P1

P2P’1

Giả sử P’ 1 là giao điểm của đoạn thẳng

với biên cửa sổ Lúc này, đoạn thẳng

ban đầu sẽ được xén thành P’ 1 P 2

Bây giờ, chúng ta xem P’ 1 P 2 là đoạn

thẳng mới và sẽ áp dụng các thao

tác xén trong các trường hợp trên

để xén đoạn thẳng này cho tới khi

đoạn thẳng được xén nằm hoàn toàn

bên trong cửa sổ hay nằm ngoài

biên cửa sổ

Trang 15

P1

Trang 16

Xác định giao điểm của đoạn thẳng và cửa sổ xén

Bằng cách xét mã vùng c1 của P1 , ta xác định đoạn thẳng cắt biên nào và

tiến hành xác định giao điểm P’1 của đoạn thẳng với biên đó

≠ 0

0110

RIGHT

Trang 17

Xác định giao điểm của đoạn thẳng và cửa sổ xén (cont.)

Giao điểm của đoạn thẳng với biên trái (c1 & LEFT != 0):

Trang 18

Xác định giao điểm của đoạn thẳng và cửa sổ xén (cont.)

Giao điểm của đoạn thẳng với biên phải (c1 & RIGHT != 0):

Trang 19

Xác định giao điểm của đoạn thẳng và cửa sổ xén (cont.)

Giao điểm của đoạn thẳng với biên trên (c1 & TOP != 0):

Trang 20

Xác định giao điểm của đoạn thẳng và cửa sổ xén (cont.)

Giao điểm của đoạn thẳng với biên dưới (c1 & BOTTOM != 0):

Trang 21

Xác định giao điểm với biên cửa sổ

(c1&RIGHT)!=0 Yes P’ 1 y = P 1 y + m (x max – P 1 x)

P’ 1 x = x max

(c1&TOP)!=0 Yes P’ 1 x = P 1 x + m (y max – P 1 y)

P’ 1 y = y max(c1&BOTTOM)!=0 Yes P’ 1 x = P 1 x + m (y min – P 1 y)

P’ 1 y = y min

Trang 22

0101

Trang 23

Câu hỏi & Bài tập

• Khi tính giá trị của m, đối với đường thẳng nằm ngang hay thẳng

đứng, có bị tràn số (/ cho 0) hay không?

• Cài đặt hàm CohenSutherland để xén đường thẳng:

int CohenSutherland(Point &P1, Point &P2);

P 1 P 2 là đoạn thẳng cần xén

return 0 : đoạn thẳng bị xén mất

return 1 : đoạn thẳng được xén; P 1 và P 2 là 2 điểm mới sau khi xénx min , x max , y min , y max là các hằng số xác định cửa sổ xén

• Viết chương trình demo cho thuật toán Cohen-Sutherland:

1 Vẽ cửa sổ xén dựa trên các giá trị x min , x max , y min , y max

2 Gán giá trị cho 2 điểm P 1 và P 2

3 Vẽ đoạn P 1 P 2 với màu RED

4 Chạy thuật toán CohenSutherland cho 2 điểm P 1 , P 2

5 Nếu thuật toán thành công (return 1) thì vẽ đoạn P 1 P 2 với màu BLUE

• Tham khảo thuật toán xén đường thẳng Liang-Barsky

Ngày đăng: 27/08/2017, 00:07

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w