Tài liệu Đồ họa máy tính - Các thuật toán vẽ đường pdf

22 1.8K 22
Tài liệu Đồ họa máy tính - Các thuật toán vẽ đường pdf

Đ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

ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 1/22 C C a a ù ù c c t t h h u u a a ä ä t t t t o o a a ù ù n n v v e e õ õ đ đ ư ư ơ ơ ø ø n n g g D D a a ã ã n n n n h h a a ä ä p p • Giả sử tọa độ các điểm nguyên sau khi xấp xỉ đối tượng thực lần lượt là ( ) , .0,, =iyx ii . Đây là các điểm nguyên sẽ được hiển thò trên màn hình. • Bài toán đặt ra là nếu biết được ( ) ii yx , là tọa độ nguyên xác đònh ở bước thứ i, điểm nguyên tiếp theo ( ) 11 , ++ ii yx sẽ được xác đònh như thế nào. • Đối tượng hiển thò trên lưới nguyên được liền nét, các điểm mà ( ) 11 , ++ ii yx có thể chọn chỉ là một trong tám điểm được đánh số từ 1 đến 8 trong hình sau (điểm đen chính là ( ) ii yx , ).Hay nói cách khác : ( ) ( ) 1,1, 11 ±±= ++ iiii yxyx . • Dáng điệu của đường sẽ cho ta gợi ý khi chọn một trong tám điểm trên. Cách chọn các điểm như thế nào sẽ tùy thuộc vào từng thuật toán trên cơ sở xem xét tới vấn đề tối ưu tốc độ. 1 23 876 5 4 ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 2/22 T T h h u u a a ä ä t t t t o o a a ù ù n n v v e e õ õ đ đ ư ư ơ ơ ø ø n n g g t t h h a a ú ú n n g g • Xét đoạn thẳng có hệ số góc 10 << m và 0>Dx . • Với các đoạn thẳng dạng này, nếu ( ) ii yx , là điểm đã xác đònh được ở bước thứ i (điểm màu đen) thì điểm cần chọn ( ) 11 , ++ ii yx ở bước thứ (i+1) sẽ là một trong hai trường hợp như hình vẽ sau : { }    +∈ += + + 1, 1 1 1 iii ii yyy xx • Vấn đề còn lại, là cách chọn một trong hai điểm trên như thế nào để có thể tối ưu về mặt tốc độ. (x i +1, y i +1) 1 2 (x i +1, y i ) x i y i ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 3/22 T T h h u u a a ä ä t t t t o o a a ù ù n n D D D D A A ( ( D D i i g g i i t t a a l l D D i i f f f f e e r r e e n n t t i i a a l l A A n n a a l l y y z z e e r r ) ) • Việc quyết đònh chọn 1+i y là i y hay 1+ i y , dựa vào phương trình của đoạn thẳng bmxy += . Nghóa là, ta sẽ tính tọa độ của điểm ( ) yx i ,1+ thuộc về đoạn thẳng thực. Tiếp đó, 1+i y sẽ là giá trò sau khi làm tròn giá trò tung độ y. • Như vậy : ( ) ( ) yRoundy bxmy i i = ++= +1 1 • Nếu tính trực tiếp giá trò thực y ở mỗi bước từ phương trình bmxy += thì phải cần một phép toán nhân và một phép toán cộng số thực. Để cải thiện tốc độ, người ta tính giá trò thực của y ở mỗi bước theo cách sau để khử phép tính nhân trên số thực : • Nhận xét rằng : ( ) bxmbmxy iisau ++=+= + 1 1 bmxy itrước += myy trướcsau +=⇒ (x i , y i ) (x i +1, y) (x i +1, Round(y)) ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 4/22 Lưu đồ thuật toán DDA Begin m=Dy/Dx; x=x1; y=y1; putpixel(x, Round(y), c); x<x2 Yes No x=x+1; y=y+m; putpixel(x, Round(y),c); End ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 5/22 • Ví dụ : Cho A(12, 20) và B(22, 27), ta có m= 0.7 i i x x i i y y i i y y 0 0 1 1 2 2 2 2 0 0 2 2 0 0 1 1 1 1 3 3 2 2 1 1 2 2 0 0 . . 7 7 2 2 1 1 4 4 2 2 1 1 2 2 1 1 . . 4 4 3 3 1 1 5 5 2 2 2 2 2 2 2 2 . . 1 1 4 4 1 1 6 6 5 5 1 1 7 7 6 6 1 1 8 8 7 7 1 1 9 9 8 8 2 2 0 0 9 9 2 2 1 1 1 1 0 0 2 2 2 2 2 2 7 7 • Cài đặt minh họa thuật toán DDA #define Round(a) int(a+0.5) int Color = GREEN; void LineDDA (int x1, int y1, int x2, int y2) { int x = x1; float y = y1; float m = float(y2-y1)/(x2-x1); putpixel(x, Round(y), Color); for(int i=x1; i<x2; i++) { x++; y +=m; putpixel(x, Round(y), Color); } } // LineDDA ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 6/22 T T h h u u a a ä ä t t t t o o a a ù ù n n B B r r e e s s e e n n h h a a m m • Gọi ( ) yx i ,1+ là điểm thuộc đoạn thẳng. Ta có: ( ) bxmy i ++= 1 . • Đặt ( ) yyd yyd i i −+= −= 1 2 1 • Xét tất cả các vò trí tương đối của y so với i y và 1+ i y , việc chọn điểm ( ) 11 , ++ ii yx là S hay P phụ thuộc vào việc so sánh d 1 và d 2 hay dấu của 21 dd − : ♦ Nếu 0 21 <− dd , ta sẽ chọn điểm S, tức là ii yy = +1 . ♦ Ngược lại, nếu 0 21 ≥− dd , ta sẽ chọn điểm P, tức là 1 1 += + ii yy • Xét ( ) ( ) 122 21 −−=−= ii yyDxddDxp ( )( ) [ ] 1212 −−++=⇒ iii ybxmDxp (x i +1, y) P S x i x i +1 y i y i +1 y d 1 d 2 ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 7/22 • Thay Dx Dy m = vào phương trình trên ta được : cDxyDyxp iii +−= 22 , với ( ) DxbDyc 122 −+= . • Nhận xét rằng nếu tại bước thứ i ta xác đònh được dấu của i p thì xem như ta xác đònh được điểm cần chọn ở bước (i+1). • Ta có : ( ) ( ) cDxyDyxcDxyDyxpp iiiiii +−−+−=− +++ 2222 111 ( ) ( ) iiiiii yyDxxxDypp −−−=−⇔ +++ 111 22 ( ) 1 do ,22 111 +=−−=−⇔ +++ iiiiii xxyyDxDypp • Từ đây ta có thể suy ra cách tính 1+i p từ i p như sau : ♦ Nếu 0< i p thì Dypp ii 2 1 += + do ta chọn ii yy = +1 . ♦ Ngược lại, nếu 0≥ i p , thì DxDypp ii 22 1 −+= + , do ta chọn 1 1 += + ii yy . • Giá trò 0 p được tính từ điểm vẽ đầu tiên ( ) 00 , yx theo công thức : ( ) DxbDyDxyDyxcDxyDyxp 1222222 00000 −−+−=+−= • Do ( ) 00 , yx là điểm nguyên thuộc về đoạn thẳng nên ta có bx Dx Dy bmxy +=+= 000 . Thế vào phương trình trên ta suy ra : DxDyp −= 2 0 . ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 8/22 Lưu đồ thuật toán Bresenham Begin p=2Dy-Dx; Const1=2Dy; Const2=2(Dy-Dx); x=x1; y=y1; putpixel(x, y, c); x<x2 Yes No p<0 Yes p=p+Const1; No p=p+Const2; y=y+1 x=x+1; putpixel(x,y,c); End ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 9/22 • Ví dụ : Cho A(12, 20) và B(22, 27), • Ta có ♦ Dx = 22-12 = 10, Dy=27-20=7 ♦ Const1 = 2Dy = 14, Const2 = 2(Dy – Dx) = -6 ♦ p 0 = 2Dy – Dx = 14-10 = 4 i i x x i i y y i i p p i i 0 0 1 1 2 2 2 2 0 0 4 4 1 1 1 1 3 3 2 2 1 1 - - 2 2 2 2 1 1 4 4 2 2 1 1 1 1 2 2 3 3 1 1 5 5 2 2 2 2 6 6 4 4 1 1 6 6 2 2 3 3 0 0 5 5 1 1 7 7 2 2 4 4 - - 6 6 6 6 1 1 8 8 2 2 4 4 8 8 7 7 1 1 9 9 2 2 5 5 2 2 8 8 2 2 0 0 2 2 6 6 - - 4 4 9 9 2 2 1 1 2 2 6 6 1 1 0 0 1 1 0 0 2 2 2 2 2 2 7 7 4 4 • Nhận xét ♦ Thuật toán Bresenham chỉ làm việc trên số nguyên và các thao tác trên số nguyên chỉ là phép cộng và phép dòch bit (phép nhân 2) điều này là một cải tiến làm tăng tốc độ đáng kể so với thuật toán DDA. Ý tưởng chính của thuật toán nằm ở chỗ xét dấu i p để quyết đònh điểm kế tiếp, và sử dụng công thức truy hồi ii pp − +1 để tính i p bằng các phép toán đơn giản trên số nguyên. ♦ Thuật toán này cho kết quả tương tự như thuật toán DDA. ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 10/22 • Cài đặt minh họa thuật toán Bresenham void LineBres (int x1, int y1, int x2, int y2) { int Dx, Dy, p, Const1, Const2; int x, y; Dx = x2 - x1; Dy = y2 - y1; p = 2*Dy - Dx; // Dy <<1 - Dx Const1 = 2*Dy; // Dy <<1 Const2 = 2*(Dy-Dx); // (Dy-Dx) <<1 x = x1; y = y1; putpixel(x, y, Color); for(i=x1; i<x2; i++) { if (p<0) p += Const1; else { p += Const2; y++; } x++; putpixel(x, y, Color); } } // LineBres [...]... 2 4 2   Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 17/22 ĐỒ HỌA MÁY TÍNH Lưu đồ thuật toán MidPoint vẽ đường tròn Begin p=5/4-R; x=0; y=R; Put8Pixel(x, y, c); x 0, dạng hyperbol  Ta sẽ áp dụng ý tưởng của thuật toán MidPoint để vẽ các đường conics và một số đường cong khác, theo các bước tuần tự sau: • Bước 1 : Dựa vào dáng điệu và phương trình đường cong, để xem thử có thể rút gọn phần đường cong cần vẽ hay không • Bước 2 : Tính đạo hàm để từ đó phân thành các vùng vẽ :  xi + 1 = xi + 1 ♦ Nếu 0 ≤ f ' ( x) ≤ 1 thì  y  i + 1 ∈ {yi . (x,y)(-x,y) (y,x) (-y,x) (x,-y)(-x,-y) (-y,-x) (y,-x) ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 16/22 • Chọn điểm bắt đầu để vẽ. ,1 2 1 ,1 000 ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 18/22 Lưu đồ thuật toán MidPoint vẽ đường tròn Begin p=5/4-R; x=0; y=R;

Ngày đăng: 23/12/2013, 00:15

Từ khóa liên quan

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

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

Tài liệu liên quan