ĐỒ 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 ( ) y x i , 1 + là điểm thuộc đoạn thẳng. Ta có: ( ) b x m y i + + = 1 . • Đặt ( ) yyd y y d 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 y x 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 d d − : ♦ Nếu 0 21 <− d d , ta sẽ chọn điểm S, tức là ii y y = +1 . ♦ Ngược lại, nếu 0 21 ≥ − d d , ta sẽ chọn điểm P, tức là 1 1 += + ii y y • Xét ( ) ( ) 1 2 2 21 −−=−= ii y y Dx d d Dx p ( ) ( ) [ ] 1 2 1 2 − − + + = ⇒ iii y b x m Dx p (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 : c Dxy Dyx p iii +−= 2 2 , với ( ) Dx b Dy c 1 2 2 − + = . • 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ó : ( ) ( ) c Dxy Dyx c Dxy Dyx p p iiiiii + − − + − = − +++ 2 2 2 2 111 ( ) ( ) iiiiii y y Dx x x Dy p p − − − = − ⇔ +++ 111 2 2 ( ) 1 do , 2 2 111 + = − − = − ⇔ +++ iiiiii x x y y Dx Dy p p • 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ì Dy p p ii 2 1 + = + do ta chọn ii y y = +1 . ♦ Ngược lại, nếu 0 ≥ i p , thì Dx Dy p p ii 2 2 1 − + = + , do ta chọn 1 1 + = + ii y y . • Giá trò 0 p được tính từ điểm vẽ đầu tiên ( ) 00 , y x theo công thức : ( ) Dx b Dy Dxy Dyx c Dxy Dyx p 1 2 2 2 2 2 2 00000 −−+−=+−= • Do ( ) 00 , y x 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 : Dx Dy p −= 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 p p − +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 . 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 •. 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 •. phương trình trên ta suy ra : Dx Dy p −= 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,