Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 13 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
13
Dung lượng
1,02 MB
Nội dung
4/4/2011 1 Tr ương Văn Quốc Nhật 1 CH 2. XÉN HÌNH, TÔ MÀU Nội dung 2 Xén hình 1. Xén đoạn thẳng vào hình chữ nhật Cohen–Sutherland, Thuật toán Chia nhị phân, Liang–Barsky 2. Xén đoạn thẳng vào hình tròn 3. Xén đường tròn vào hình chữ nhật 4. Xén đa giác vào hình chữ nhật 5. Xén đa giác vào đa giác Tô màu 1. Thuật toán Loang 2. Thuật toán Dòng quét (Scan-line) Bài tập 4/4/2011 2 Xén (clipping) 3 1. Xén đoạn thẳng vào hình chữ nhật 4 1 2 4 3 5 6 • Thuật toán Chia nhị phân • Cohen–Sutherland • Liang–Barsky 4/4/2011 3 Thuật toán Cohen–Sutherland 5 1 2 4 3 5 6 • A = B = 0000 AB D B A ABFClip D • A & B ≠ 0000 AB D D FClip D • A & B = 0000 và A | B ≠ 0000: Xét A (giả sử A nằm ngoài): Thay A bởi giao của AB với cạnh trái nối dài Thay A bởi giao của AB với cạnh phải nối dài Thay A bởi giao của AB với cạnh dưới nối dài Thay A bởi giao của AB với cạnh trên nối dài Bit: 3 2 1 0 Thuật toán Chia nhị phân 6 2 4 3 6 D 1 5 Bit: 3 2 1 0 4/4/2011 4 Thuật toán Liang-Barsky 7 D ABA ABA yytyy xxtxx Ptrình tham số: Thứ tự cắt: tráiphảitrêndưới 1 3 2 4 1 3 2 1 1 2 Cohen- : Cập nhật y Liang- : Cập nhật t Bit: 3 2 1 0 AB xxx AB yyy, xp 1 xp 2 yp 3 yp 4 min1 , xxq A A xxq max2 , min3 , yyq A A yyq max4 , 10 4,1, t kqtp kk 10 maxmin maxmin t yyytyy xxxtxx ABA ABA Đặt: CÝ: 0 k p 0 k p 0 k p : AB // 1 cạnh : ngoài trong (trái) (phải) (dưới) (trên) : trong ngoài Kiểm tra… 8 D AB xxx AB yyy, xp 1 xp 2 yp 3 yp 4 min1 , xxq A A xxq max2 , min3 , yyq A A yyq max4 , Đặt: 0 k p 0 k p 0 k p : AB // 1 cạnh : ngoài trong (trái) (phải) (dưới) (trên) : trong ngoài x min y max x max y min Cạnh trái Cạnh phải Cạnh dưới Cạnh trên BA xxp 1 AB xxp 2 BA yyp 3 AB yyp 4 - + - + + - + - - ++ - + + 4/4/2011 5 11 Thuật toán Liang-Barsky t 0 =0; dx=x B -x A ; t 1 =1; dy=y B -y B ; for (canh=14){ //duyệt lần lượt các cạnh //0.tính p,q,r //1.cạnh song song ko vẽ //2.ngoài trong //nằm ngoài ko vẽ //xén được 1 tí //3.trong ngoài //nằm ngoài ko vẽ //xén được 1 tí switch (canh){ 1: p=-dx; q=x A -x min ; 2: p=dx; q=x A -x min ; 3: p=-dy; q=x A -x min ; 4: p=dy; q=x A -x min ; } r=q/p; } if (p<0){ } else if (p>0) { } x 0 =x A +t 0 *dx; y 0 =y A +t 0 *dy; x 1 =x A +t 1 *dx; y 1 =y A +t 1 *dy; return đoạn:(x0,y0)(x1,y1); if (p=0 && q<0) return ; if (r>t 1 ) return ; if (r>t 0 ) t 0 =r; if (r<t 0 ) return ; if (r>t 1 ) t 1 =r; Xén đoạn thẳng vào HCN xiên 12 α α xoay -α cắt xoay α 4/4/2011 6 Xén đa giác vào hình chữ nhật 13 Ý tưởng Sutherland-Hodgeman 14 trên dưới phải trái 4/4/2011 7 Cắt dọc theo cạnh trên 15 1 2 3 4 5 6 7 8 9 10 A=10; for (B=110){ if (B trong){ } else { } } d A=B; if (A ngoài) Thêm(AB∩d); Thêm(B); if (A trong) Thêm(AB∩d); A B C D A 1 B C 4 5 6 7 8 9 D U U 1 U n Thuật toán Sutherland-Hodgeman 17 VU; A=V n ; for (B = V 1 V n ){ } if (B trong){ } else { } if (A ngoài) ném(AB∩cạnh); ném(B); if (A trong) ném(AB∩cạnh); A=B; for (cạnh = trênphảidướitrái){ } U = danh_sách_đỉnh_đa_giác; //cý: sau mỗi lần cắt, n có thể thay đổi //lúc này: V đầy, U rỗng VU V 1 V n 4/4/2011 8 Cắt đôi? 18 12 3 4 6 5 Cắt thành 2 cái luôn à? Xén đa giác vào đa giác 19 4/4/2011 9 Ui chao, dễ òm! Xác định “trong”, “ngoài”? 20 A (2,3) B(7,9) 1 n 2 n ABAB ABAB xxyyn xxyyn , , 2 1 P (5,3) α cosnAPnAP n + - 0 ABAB xxyyyxnAP AP yxAP , Giả sử: :0cos :0cos :0cos trong ngoài trên ngoài trong trên Xác định mã 21 D Bit: 3 2 1 0 x min y max x max y min P = 0; if (x P < x min ) P = P|1; //trái P if (x P > x max ) P = P|2; //phải if (y P < y min ) P = P|4; //dưới if (y P > y max ) P = P|8; //trên x P y P x min x max y min y max P Tính mã 4/4/2011 10 Nội dung 22 Xén hình 1. Xén đoạn thẳng vào hình chữ nhật Cohen–Sutherland, Thuật toán Chia nhị phân, Liang–Barsky 2. Xén đoạn thẳng vào hình tròn 3. Xén đường tròn vào hình chữ nhật 4. Xén đa giác vào hình chữ nhật 5. Xén đa giác vào đa giác Tô màu 1. Thuật toán Scanline 2. Thuật toán Loang Bài tập Thuật toán Loang – Ý tưởng 23 5 1 3 9 12 4 10 19 22 11 20 33 36 21 34 39 25 13 38 24 37 26 28 14 27 16 6 15 29 8 2 7 17 41 40 23 18 31 32 30 35 x x42 • Đệ quy • Khử đệ quy 4 p 2 3 1 [...]... (Scan-line) x1 x1 x2 x2 x1 x3 x3 x4 x3 x4 x4 x2 x3 x2 x1 x2 x1 x1,x2,x3,x4,x5,x6 28 xi xi+1 (x1,x2), (x3,x4 ), ( x5,x6) - Dòng quét cắt đứt 2 cạnh liên tiếp bỏ xi+1 - Dòng quét xẹt qua 2 cạnh liên tiếp giữ xi+1 Bài tập 1 Bắt buộc (2 tuần): Xây dựng (nếu có) & Cài đặt các thuật toán : Xén đoạn thẳng vào hình chữ nhật (Cohen–Sutherland, Liang-Barsky) Xén đa giác vào hình chữ nhật (Sutherland-Hodgeman)... Liang-Barsky) Xén đa giác vào hình chữ nhật (Sutherland-Hodgeman) Tô màu Loang (đệ quy, khử đệ quy) Mỗi thuật toán vẽ là 1 phương thức, gộp vào 1 file mã nguồn (đuôi là cs) 29 2 Không bắt buộc (thoải mái): Xây dựng (nếu có) & Cài đặt các thuật toán: Xén đoạn thẳng vào HCN xiên Xén đa giác vào đa giác (Sutherland-Hodgeman) Tô màu dòng quét 13 ... toán Loang – Khử đệ quy Vào: x0,y0,mau Tô( x0,y0); Q = {(x0,y0)}; Tô( x0,y0); dau=cuoi=0; Qx[0]=x0; Qy[0]= y0; while (Q ≠ Ф) { while (dau ≤ cuoi) { Px=Qx[dau]; Py=Qy[dau]; dau++; //lấy p từ Q for ( (vx,vy) Kề(px,py)) if [(vx,vy) S && ChưaTô(vx,vy)] { Tô( vx,vy); cuoi++; Qx[cuoi]=vx; Qy[cuoi]=vy;//đưa v vào Q } } Pop(p);//lấy p từ Q for ( v if [v { Kề(p)) S && ChưaTô(v)] Tô( v); Push(v);//đưa v vào Q } } 26...4/4/2011 Stack Thuật toán Loang – Đệ quy x 0 5 6 3 x x S && ChưaTô(x,y)] 4 6 5 x 5 7 4 17 6 8 3 16 7 9 2 15 8 10 1 14 9 11 12 13 Loang(x,y,mau) { if [(x,y) { Tô( x,y); Loang(x,y-1,mau); Loang(x+1,y,mau); Loang(x,y+1,mau); Loang(x-1,y,mau); } } Gọi: Loang(6,8,đỏ) 7 y 24 Loang(4,4) Loang(5,5) Loang(6,4) Loang(5,3) Loang(5,4) Loang(6,5) Loang(7,4) Loang(6,3)... Loang(5,7) Loang(6,8) Loang(7,7) Loang(6,6) Loang(5,8) Loang(7,9) Loang(7,8) Loang(6,7) Loang(6,8) Queue Thuật toán Loang – Khử đệ quy Vào: x0,y0,mau Tô( x0,y0); Q = {(x0,y0)}; while (Q ≠ Ф) { Pop(p);//lấy p từ Q for ( v = Kề(p)) if [v S && ChưaTô(v)] { Tô( v); Push(v);//đưa v vào Q } } 0 3 4 5 6 7 8 x 1 x 14 x x 16 6 15 x 18 8 2 7 17 x 25 13 5 1 3 9 19 24 12 4 10 20 x 2 3 x 4 5 6 8 9 25 2 0 7 Ví dụ: . trên BA xxp 1 AB xxp 2 BA yyp 3 AB yyp 4 - + - + + - + - - ++ - + + 4/4/2011 5 11 Thuật toán Liang-Barsky t 0 =0; dx=x B -x A ; t 1 =1; dy=y B -y B ; for (canh=14){ //duyệt lần lượt các cạnh //0 .tính p,q,r //1.cạnh. Nhật 1 CH 2. XÉN HÌNH, TÔ MÀU Nội dung 2 Xén hình 1. Xén đoạn thẳng vào hình chữ nhật Cohen–Sutherland, Thuật toán Chia nhị phân, Liang–Barsky 2. Xén đoạn thẳng vào hình tròn 3. Xén đường tròn. ngoài ko vẽ / /xén được 1 tí //3.trong ngoài //nằm ngoài ko vẽ / /xén được 1 tí switch (canh){ 1: p=-dx; q=x A -x min ; 2: p=dx; q=x A -x min ; 3: p=-dy; q=x A -x min ; 4: p=dy; q=x A -x min ; } r=q/p; } if