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

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

  • Upload
    penha

  • View
    51

  • Download
    3

Embed Size (px)

DESCRIPTION

Line Clipping in 2D Xén đường thẳng trong 2D. Giới thiệu. Thao tác loại bỏ các phần hình ảnh nằm ngoài một vùng cho trước được gọi là xén hình. Chúng ta xén hình trước khi vẽ hay tính toán: không cần thiết tính toán cho các vùng nằm ngoài. Mô hình bài toán xén đường thẳng. - PowerPoint PPT Presentation

Citation preview

Page 1: Line Clipping in 2D Xén đường thẳng trong 2D

11

Line Clipping in 2DLine Clipping in 2DXén đường thẳng trong 2DXén đường thẳng trong 2D

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

22

Giới thiệuGiới thiệu

Thao tác loại bỏ các phần hình ảnh nằm ngoài một vùng cho trước Thao tác loại bỏ các phần hình ảnh nằm ngoài một vùng cho trước được gọi là xén hình. được gọi là xén hình.

Chúng ta xén hình trước khi vẽ hay tính toán: Chúng ta xén hình trước khi vẽ hay tính toán: không cần thiết tính không cần thiết tính toán cho các vùng nằm ngoàitoán cho các vùng nằm ngoài

Page 3: Line Clipping in 2D Xén đường thẳng trong 2D

33

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

• Clipping WindowClipping Window - cửa sổ xén: được định nghĩa bởi 2 điểm - cửa sổ xén: được định nghĩa bởi 2 điểm– Phía dưới bên trái: (Phía dưới bên trái: (xxminmin, y, yminmin))

– Phía trên bên phải: (Phía trên bên phải: (xxmaxmax, y, ymaxmax))

(x(xminmin, y, yminmin))

(x(xmaxmax, y, ymaxmax))

maxmin

maxmin

yyy

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

Page 4: Line Clipping in 2D Xén đường thẳng trong 2D

44

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

• Đường thẳng bị xén PĐường thẳng bị xén P11PP22 có tọa độ P có tọa độ P11(x(x11,y,y11) và P) và P22(x(x22,y,y22))

P1

P2

Page 5: Line Clipping in 2D Xén đường thẳng trong 2D

55

Yêu cầu của bài toán xén đường thẳngYê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 Loại bỏ phần đường thẳng nằm ngoài cửa sổ xén

Page 6: Line Clipping in 2D Xén đường thẳng trong 2D

66

Các nhận xétCá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 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 thẳng nằm trong cửa sổ nên không cần xénkhông cần xén..

Page 7: Line Clipping in 2D Xén đường thẳng trong 2D

77

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

2. Các đoạn thẳng có 2 điểm cùng nằm ngoài về một phía của cửa sổ 2. Các đoạn thẳng có 2 điểm cùng nằm ngoài về một phía của cửa sổ xén thì cả đoạn thẳng sẽ nằm ngoài cửa sổ và sẽ bị xén mất. xén thì cả đoạn thẳng sẽ nằm ngoài cửa sổ và sẽ bị xén mất.

LEFT RIGHT

TOP

BOTTOM

Page 8: Line Clipping in 2D Xén đường thẳng trong 2D

88

Các nhận xét (cont.)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 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 đ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ổ.cửa sổ.

Page 9: Line Clipping in 2D Xén đường thẳng trong 2D

99

Thuận toán Cohen – SutherlandThuận toán Cohen – SutherlandAREA CODE – Mã vùngAREA CODE – Mã vùng

Kéo dài biên của cửa sổ, ta chia mặt phẳng thành chín vùng gồm cửa Kéo dài biên của cửa sổ, ta chia mặt phẳng thành chín vùng gồm cửa sổ xén và tám vùng xung quanhsổ xén và tám vùng xung quanh

insideinside

bottombottom

toptop

leftleft rightright

bottom-rightbottom-right

top-righttop-righttop-lefttop-left

bottom-leftbottom-left

Page 10: Line Clipping in 2D Xén đường thẳng trong 2D

1010

Thuận toán Cohen – SutherlandThuận toán Cohen – SutherlandAREA CODE – Mã vùng (cont.)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ộ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ổ.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 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 bằng 11. Các vùng còn lại có bit 1 bằng . Các vùng còn lại có bit 1 bằng 00..

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

00000000

10001000

01000100

00010001 00100010

10101010

0110011001010101

10011001

RIGHTRIGHT

TOPTOP

BOTTOMBOTTOM

LEFTLEFT

B T R L

4 3 2 1

Page 11: Line Clipping in 2D Xén đường thẳng trong 2D

1111

Thuận toán Cohen – SutherlandThuận toán Cohen – SutherlandMã vùng của điểmMã vùng của điểm

int Encode(Point p)int Encode(Point p)

{{

int code = 0;int code = 0;

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

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

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

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

return code;return code;

}}

0 0 0 1

0 0 1 0

0 1 0 0

1 0 0 0

LEFTLEFT

RIGHTRIGHT

TOPTOP

BOTTOMBOTTOM

= 1= 1

= 2= 2

= 4= 4

= 8= 8

P(x,y)P(x,y)

Các giá trị của bit trong Các giá trị của bit trong mã vùng được tính bằng mã vùng được tính bằng cách so sánh giá trị tọa độ cách so sánh giá trị tọa độ của điểm P(x,y) với các của điểm P(x,y) với các biên của cửa sổ. biên của cửa sổ. Ví dụ, bit Ví dụ, bit 1 được đặt là 1 nếu x < 1 được đặt là 1 nếu x < xmin, bit 1 được đặt là 0 xmin, bit 1 được đặt là 0 nếu x >= xmin.nếu x >= xmin.

00000000OROR00100010

0000000000100010

00100010OROR01000100

01100110

Page 12: Line Clipping in 2D Xén đường thẳng trong 2D

1212

00000000

Thuật toánThuật toán

Tính mã vùng tương ứng cho các điểm đầu cuối của đoạn thẳng PTính mã vùng tương ứng cho các điểm đầu cuối của đoạn thẳng P11 và P và P22 của của

đoạn thẳng cần xén là cđoạn thẳng cần xén là c11 và c và c22. Dựa vào giá trị của c. Dựa vào giá trị của c11 và c và c22, ta có các trường , ta có các trường

hợp sau:hợp sau:

1. Các đoạn thẳng nằm hoàn toàn bên trong cửa sổ sẽ có c1. Các đoạn thẳng nằm hoàn toàn bên trong cửa sổ sẽ có c11 == c == c22 == 0000, các == 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.đ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.

00000000

Page 13: Line Clipping in 2D Xén đường thẳng trong 2D

1313

Thuật toán (cont.)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 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(k=1,..,4) sao cho c11 và c và c22 cùng có giá trị 1 tại bit thứ k. Ví dụ, nếu k = 1 thì 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ỏ đ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 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 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ổ.thẳng sẽ nằm ngoài biên cửa sổ.

01010101

00010001

01010101ANDAND00010001------------00010001≠ ≠ 00

01100110

10101010

01100110ANDAND10101010------------00100010≠ ≠ 00

Page 14: Line Clipping in 2D Xén đường thẳng trong 2D

1414

Thuật toán (cont.)Thuật toán (cont.)

3. Nếu c3. Nếu c11 và c và c22 không thuộc hai trường hợp trên, chắc chắn rằng đoạn thẳng sẽ 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, 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 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. chúng ta giả sử đó là P1.

PP11

PP22

P’P’11

Giả sử P’Giả sử P’11 là giao điểm của đoạn thẳng 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 với biên cửa sổ. Lúc này, đoạn thẳng ban đầu sẽ được xén thành P’ban đầu sẽ được xén thành P’11PP22. .

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

thẳng mới và sẽ áp dụng các thao 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 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 để 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 đoạn thẳng được xén nằm hoàn toàn bên trong cửa sổ hay nằm ngoài bên trong cửa sổ hay nằm ngoài biên cửa sổ. biên cửa sổ.

Page 15: Line Clipping in 2D Xén đường thẳng trong 2D

1515

Lưu đồLưu đồ

BeginBegin

cc11=Encode(P=Encode(P11))

cc22=Encode(P=Encode(P22))

cc11==0 && c==0 && c22==0==0

(c(c11&c&c22)!=0)!=0

GGọi ọi P’P’11 l là giao điểm của Pà giao điểm của P11PP22 và biên cửa sổ và biên cửa sổPP11 = P’ = P’11

EndEnd

YesYes

YesYes

PP22

P’P’11PP11

Page 16: Line Clipping in 2D Xén đường thẳng trong 2D

1616

Xác định giao điểm của đoạn thẳng và cửa sổ xénXá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 cBằng cách xét mã vùng c11 của P của P1 1 , ta xác định đoạn thẳng cắt biên nào , 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’và tiến hành xác định giao điểm P’11 của đoạn thẳng với biên đó. của đoạn thẳng với biên đó.

PP11 P’P’11

PP22

00010001ANDAND00010001------------00010001≠ ≠ 00

00010001

LEFTLEFT

PP22

P’P’11 PP11

01100110ANDAND00100010------------00100010≠ ≠ 00

01100110

RIGHTRIGHT

Page 17: Line Clipping in 2D Xén đường thẳng trong 2D

1717

Xác định giao điểm của đoạn thẳng và cửa sổ xén (cont.)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 (cGiao điểm của đoạn thẳng với biên trái (c11 & LEFT != 0): & LEFT != 0):

• m = (Pm = (P22.y – P.y – P11.y) / (P.y) / (P22.x – P.x – P11.x).x)

• P’P’11.y = P.y = P11.y + m (x.y + m (xminmin – P – P11.x).x)

• P’P’11.x = x.x = xminmin

PP11 P’P’11

PP22

LEFTLEFT

xxminmin

Page 18: Line Clipping in 2D Xén đường thẳng trong 2D

1818

Xác định giao điểm của đoạn thẳng và cửa sổ xén (cont.)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 (cGiao điểm của đoạn thẳng với biên phải (c11 & RIGHT != 0): & RIGHT != 0):

• m = (Pm = (P22.y – P.y – P11.y) / (P.y) / (P22.x – P.x – P11.x).x)

• P’P’11.y = P.y = P11.y + m (x.y + m (xmaxmax – P – P11.x).x)

• P’P’11.x = x.x = xmaxmax

PP22

P’P’11

RIGHTRIGHT

PP11

xxmaxmax

Page 19: Line Clipping in 2D Xén đường thẳng trong 2D

1919

Xác định giao điểm của đoạn thẳng và cửa sổ xén (cont.)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 (cGiao điểm của đoạn thẳng với biên trên (c11 & TOP != 0): & TOP != 0):

• m = (Pm = (P22.x – P.x – P11.x) / (P.x) / (P22.y – P.y – P11.y).y)

• P’P’11.x = P.x = P11.x + m (y.x + m (ymaxmax – P – P11.y).y)

• P’P’11.y = y.y = ymaxmax

PP22

P’P’11

TOPTOP

PP11

yymaxmax

Page 20: Line Clipping in 2D Xén đường thẳng trong 2D

2020

Xác định giao điểm của đoạn thẳng và cửa sổ xén (cont.)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 (cGiao điểm của đoạn thẳng với biên dưới (c11 & BOTTOM != 0): & BOTTOM != 0):

• m = (Pm = (P22.x – P.x – P11.x) / (P.x) / (P22.y – P.y – P11.y).y)

• P’P’11.x = P.x = P11.x + m (y.x + m (yminmin – P – P11.y).y)

• P’P’11.y = y.y = yminmin

PP22 P’P’11

BOTTOMBOTTOM

PP11

yyminmin

Page 21: Line Clipping in 2D Xén đường thẳng trong 2D

2121

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

(c(c11&&LEFTLEFT)!=0)!=0

YesYes

YesYes

cc11==0==0 SwapPoint(SwapPoint(PP11, P, P22))SwapInt(cSwapInt(c11, c, c22))

P’P’11.y = P.y = P11.y + m (x.y + m (xminmin – P – P11.x).x)

P’P’11.x = x.x = xminmin

Kết thúc xác định giao điểmKết thúc xác định giao điểm

(c(c11&&RIGHTRIGHT)!=0)!=0 YesYes P’P’11.y = P.y = P11.y + m (x.y + m (xmaxmax – P – P11.x).x)

P’P’11.x = x.x = xmaxmax

(c(c11&&TOPTOP)!=0)!=0 YesYes P’P’11.x = P.x = P11.x + m (y.x + m (ymaxmax – P – P11.y).y)

P’P’11.y = y.y = ymaxmax

(c(c11&&BOTTOMBOTTOM)!=0)!=0 YesYes P’P’11.x = P.x = P11.x + m (y.x + m (yminmin – P – P11.y).y)

P’P’11.y = y.y = yminmin

Page 22: Line Clipping in 2D Xén đường thẳng trong 2D

2222

Ví dụVí dụ

00000000

01000100

10001000

00010001 00100010

01100110

1010101010011001

01010101

Page 23: Line Clipping in 2D Xén đường thẳng trong 2D

2323

Câu hỏi & Bài tậpCâ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 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?đứng, có bị tràn số (/ cho 0) hay không?

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

int CohenSutherland(Point &Pint CohenSutherland(Point &P11, Point &P, Point &P22););

– PP11PP22 là đoạn thẳng cần xén là đoạn thẳng cần xén

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

– return 1return 1: đoạn thẳng được xén; P: đoạn thẳng được xén; P11 và P và P22 là 2 điểm mới sau khi xén là 2 điểm mới sau khi xén

– xxminmin, x, xmaxmax, y, yminmin, y, ymaxmax là các hằng số xác định cửa sổ xén 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:Viết chương trình demo cho thuật toán Cohen-Sutherland:1.1. Vẽ cửa sổ xén dựa trên các giá trị xVẽ cửa sổ xén dựa trên các giá trị xminmin, x, xmaxmax, y, yminmin, y, ymaxmax

2.2. Gán giá trị cho 2 điểm PGán giá trị cho 2 điểm P11 và P và P22

3.3. Vẽ đoạn PVẽ đoạn P11PP22 với màu RED với màu RED

4.4. Chạy thuật toán CohenSutherland cho 2 điểm PChạy thuật toán CohenSutherland cho 2 điểm P11, P, P22

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

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