1. Trang chủ
  2. » Công Nghệ Thông Tin

Các thuật toán vẽ đường

22 3,9K 13
Tài liệu đã được kiểm tra trùng lặp

Đ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 22
Dung lượng 160,77 KB

Nội dung

Các thuật toán vẽ đường

ĐỒ HỌA MÁY TÍNHDương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 1/22CCaáùcc tthhuuaậätt ttooaáùnn vveẽõ đđưươờønnggDDaẫãnn nnhhaậäpp• Giả sử tọa độ các điểm nguyên sau khi xấp xỉ đốitượng thực lần lượt là ( ), .0,, =iyxii. Đây là các điểmnguyên sẽ được hiển thò trên màn hình.• Bài toán đặt ra là nếu biết được ( )iiyx , là tọa độnguyên xác đònh ở bước thứ i, điểm nguyên tiếp theo( )11,++ iiyxsẽ đượ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,++ iiyx có thể chọn chỉ là một trongtám điểm được đánh số từ 1 đến 8 trong hình sau(điểm đen chính là( )iiyx ,).Hay nói cách khác :( ) ( )1,1,11±±=++ iiiiyxyx.• Dáng điệu của đường sẽ cho ta gợi ý khi chọn mộttrong 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ở xemxét tới vấn đề tối ưu tốc độ.12387654 ĐỒ HỌA MÁY TÍNHDương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 2/22TThhuuaậätt ttooaáùnn vveẽõ đđưươờønngg tthhaẳúnngg• Xét đoạn thẳng có hệ số góc 10 << mvà 0>Dx.• Với các đoạn thẳng dạng này, nếu ( )iiyx , là điểmđã xác đònh được ở bước thứ i (điểm màu đen) thìđiểm cần chọn ( )11,++ iiyx ở bước thứ (i+1) sẽ là mộttrong hai trường hợp như hình vẽ sau :{ }+∈+=++1,111iiiiiyyyxx• Vấn đề còn lại, là cách chọn một trong hai điểm trênnhư thế nào để có thể tối ưu về mặt tốc độ.(xi+1, yi+1)12(xi+1, yi)xiyi ĐỒ HỌA MÁY TÍNHDương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 3/22TThhuuaậätt ttooaáùnn DDDDAA ((DDiiggiittaall DDiiffffeerreennttiiaall AAnnaallyyzzeerr))• Việc quyết đònh chọn 1+iy là iy hay 1+iy, dựa vàophương trình của đoạn thẳng bmxy +=. Nghóa là,ta sẽ tính tọa độ của điểm ( )yxi,1+ thuộc về đoạnthẳng thực. Tiếp đó, 1+iy sẽ là giá trò sau khi làmtròn giá trò tung độ y.• Như vậy : ( )( )yRoundybxmyii=++=+11• 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ánnhân và một phép toán cộng số thực. Để cải thiệntốc độ, người ta tính giá trò thực của y ở mỗi bướctheo cách sau để khử phép tính nhân trên số thực :• Nhận xét rằng : ( )bxmbmxyiisau++=+=+11bmxyitrước+=myytrướcsau+=⇒(xi, yi)(xi+1, y)(xi+1, Round(y)) ĐỒ HỌA MÁY TÍNHDương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 4/22Lưu đồ thuật toán DDABeginm=Dy/Dx;x=x1;y=y1;putpixel(x, Round(y), c);x<x2YesNox=x+1;y=y+m;putpixel(x, Round(y),c);End ĐỒ HỌA MÁY TÍNHDươ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.7iixxiiyyiiyy0011222200220011113322112200 7722114422112211 4433115522222222 11441166551177661188771199882200992211110022222277• 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ÍNHDương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 6/22TThhuuaậätt ttooaáùnn BBrreesseennhhaamm• Gọi ( )yxi,1+ là điểm thuộc đoạn thẳng. Ta có:( )bxmyi++= 1.• Đặt ( )yydyydii−+=−=121• Xét tất cả các vò trí tương đối của y so với iy và1+iy, việc chọn điểm ( )11,++ iiyx là S hay P phụ thuộcvào việc so sánh d1 và d2 hay dấu của 21dd − :♦ Nếu 021<− dd, ta sẽ chọn điểm S, tức là iiyy =+1.♦ Ngược lại, nếu 021≥− dd, ta sẽ chọn điểm P, tức là11+=+ iiyy• Xét ( ) ( )12221−−=−=iiyyDxddDxp( )( )[ ]1212 −−++=⇒iiiybxmDxp(xi+1, y)PSxixi+1yiyi+1yd1d2 ĐỒ HỌA MÁY TÍNHDương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 7/22• Thay DxDym = vào phương trình trên ta được :cDxyDyxpiii+−= 22, với ( )DxbDyc 122 −+=.• Nhận xét rằng nếu tại bước thứ i ta xác đònh đượcdấu của ip thì xem như ta xác đònh được điểm cầnchọn ở bước (i+1).• Ta có :( ) ( )cDxyDyxcDxyDyxppiiiiii+−−+−=−+++2222111( ) ( )iiiiiiyyDxxxDypp −−−=−⇔+++ 11122( )1 do ,22111+=−−=−⇔+++ iiiiiixxyyDxDypp• Từ đây ta có thể suy ra cách tính 1+ip từ ip như sau :♦ Nếu 0<ip thì Dyppii21+=+ do ta chọn iiyy =+1.♦ Ngược lại, nếu 0≥ip, thì DxDyppii221−+=+, dota chọn 11+=+ iiyy.• Giá trò 0p được tính từ điểm vẽ đầu tiên ( )00, yxtheo công thức :( )DxbDyDxyDyxcDxyDyxp 122222200000−−+−=+−=• Do ( )00, yx là điểm nguyên thuộc về đoạn thẳngnên ta có bxDxDybmxy +=+=000. Thế vào phươngtrình trên ta suy ra : DxDyp −= 20. ĐỒ HỌA MÁY TÍNHDương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 8/22Lưu đồ thuật toán BresenhamBeginp=2Dy-Dx;Const1=2Dy;Const2=2(Dy-Dx);x=x1;y=y1;putpixel(x, y, c);x<x2YesNop<0Yesp=p+Const1;Nop=p+Const2;y=y+1x=x+1;putpixel(x,y,c);End ĐỒ HỌA MÁY TÍNHDươ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♦ p0 = 2Dy – Dx = 14-10 = 4iixxiiyyiippii0011222200441111332211--22221144221111223311552222664411662233005511772244--666611882244887711992255228822002266--449922112266110011002222227744• 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épdòch bit (phép nhân 2) điều này là một cải tiến làm tăngtốc độ đáng kể so với thuật toán DDA. Ý tưởng chính củathuật toán nằm ở chỗ xét dấu ip để quyết đònh điểm kếtiếp, và sử dụng công thức truy hồi iipp −+1 để tính ipbằ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ánDDA. ĐỒ HỌA MÁY TÍNHDươ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 Bresenhamvoid 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 - DxConst1 = 2*Dy; // Dy <<1Const2 = 2*(Dy-Dx); // (Dy-Dx) <<1x = 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 [...]... p 0 =1-R khi cài đặt. • Hãy trình bày thuật toán MidPoint vẽ cung 1/8 đường tròn sau :        ≤≤ ≤≤ 2 2 0 2 2 Ry RxR • p dụng các bước trên để vẽ đoạn thẳng trong trường hợp tổng quát. • Hãy trình bày khung chính của thuật toán vẽ ellipse, parabol, hyperbol dựa vào các bước trên. ĐỒ 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,... FEyDxCyBxyAx . Giá trị của các hằng số A, B, C, D, E, F sẽ quyết định dạng của đường conics, cụ thể là nếu:      > = ==< − hyperbol. dạng ,0 parabol dạng ,0 ellipse hay ) 0B và C A(nếu tròn đường dạng ,0 4 2 ACB 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... 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... thôi. • Hãy tối ưu hóa cài đặt thuật toán MidPoint vẽ đường tròn từ nhận xét trên. ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 21/22 V V e e õ õ đ đ ư ư ơ ơ ø ø n n g g c c o o n n i i c c s s v v a a ø ø m m o o ä ä t t s s o o á á đ đ ư ư ơ ơ ø ø n n g g c c o o n n g g k k h h a a ù ù c c Phương trình tổng quát của các đường conics có dạng : 0 22 =+++++... 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 20/22 • Ví dụ : Vẽ đường tròn tâm I(0,0),... Đình Duy Các thuật toán vẽ đường 15/22 V V e e õ õ đ đ ư ư ơ ơ ø ø n n g g t t r r o o ø ø n n b b a a è è n n g g t t h h u u a a ä ä t t t t o o a a ù ù n n M M i i d d P P o o i i n n t t • Do tính đối xứng của đường tròn (C) nên ta chỉ cần vẽ cung (C 1/8 ) là cung 1/8 đường tròn, sau đó lấy đối xứng. Cung (C 1/8 ) được mô tả như sau (cung của phần tô xám trong hình vẽ) :        ≤≤ ≤≤ RyR Rx 2 2 2 2 0 •... Duy Các thuật toán vẽ đường 16/22 • Chọn điểm bắt đầu để vẽ là điểm (0,R). • Dựa vào hình vẽ, nếu ( ) ii yx , là điểm nguyên đã tìm được ở bước thứ i, thì điểm ( ) 11 , ++ ii yx ở bước thứ (i+1) là sự lựa chọn giữa S và P. • Như vậy : { }    −∈ += + + 1, 1 1 1 iii ii yyy xx • Đặt ( ) 222 , RyxyxF −+= , ta có : ( ) ( ) ( ) ( )      > = < tròn. đường ngoài nằm yx, nếu,0 tròn đường. .. phương trình đường cong để cho 0= i p nếu ( ) ii yx , thuộc về đường cong. Việc chọn i p cần phải chú ý sao cho thao tác tính i p sau này hạn chế phép toán trên số thực. • Bước 4 : Tìm mối liên quan của 1+i p và i p bằng cách xét hiệu ii pp − +1 . • Bước 5 : Tính 0 p và hoàn chỉnh thuật toán. B B a a ø ø i i t t a a ä ä p p • Giải thích tại sao chỉ chọn cung 1/8 đường tròn để vẽ rồi lấy... đị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 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 •... 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 17/22 • Xét ( )       −+== 2 1 ,1MidPoint iii yxFFp . Ta có : ♦ Nếu 0< i p , điểm MidPoint nằm trong đường tròn. Lúc này điểm thực Q gần S hơn nên ta chọn S, tức là ii yy = +1 . ♦ Ngược lại, nếu 0≥ i p , điểm MidPoint nằm ngoài đường tròn. Lúc này điểm thực Q gần P hơn nên ta chọn P, tức là 1 1 −= + . 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ánDDA. ĐỒ HỌA MÁY TÍNHDương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường. Đình Duy Các thuật toán vẽ đường 11/22TThhuuaậätt ttooaáùnn MMiiddPPooiinntt• Thuật toán MidPoint đưa ra cách chọn 1+iy là iyhay 1+iy bằng cách so sánh

Ngày đăng: 27/08/2012, 09:54

HÌNH ẢNH LIÊN QUAN

tám điểm được đánh số từ 1 đến 8 trong hình sau (điểm đen chính là(xi,yi)).Hay nói cách khác : - Các thuật toán vẽ đường
t ám điểm được đánh số từ 1 đến 8 trong hình sau (điểm đen chính là(xi,yi)).Hay nói cách khác : (Trang 1)
trong hai trường hợp như hình vẽ sau: - Các thuật toán vẽ đường
trong hai trường hợp như hình vẽ sau: (Trang 2)
• Dựa vào hình vẽ, nếu (xi, yi) là điểm nguyên đã tìm - Các thuật toán vẽ đường
a vào hình vẽ, nếu (xi, yi) là điểm nguyên đã tìm (Trang 16)

TỪ KHÓA LIÊN QUAN

w