0

Line Drawing

22 589 1
  • Line Drawing

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Tài liệu liên quan

Thông tin tài liệu

Ngày đăng: 22/08/2012, 09:25

Line Drawing bài giảng đồ họa ĐỒ 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[...]... 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 ĐỒ HỌA... 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 13/22CCaaââuu . đặ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,. 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
- Xem thêm -

Xem thêm: Line Drawing, Line Drawing, Line Drawing

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 : - Line Drawing

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 : Xem tại trang 1 của tài liệu.
trong hai trường hợp như hình vẽ sau: - Line Drawing

trong.

hai trường hợp như hình vẽ sau: Xem tại trang 2 của tài liệu.
• Dựa vào hình vẽ, nếu (xi, yi) là điểm nguyên đã tìm - Line Drawing

a.

vào hình vẽ, nếu (xi, yi) là điểm nguyên đã tìm Xem tại trang 16 của tài liệu.