Thuật toán Bresenham

Một phần của tài liệu bài giảng Đồ họa máy tính (Trang 38 - 44)

Thuật toán Bresenham đưa ra cách chọn yi +1là yi hay y, + 1 theo một hướng khác, sao cho có thế tối ưu hoá về mặt tốc độ so với thuật toán DDA. vấn đề ở đây là làm thế nào để hạn chế tối đa các phép toán trên số thực trong thuật toán bằng cách chuyển sang các phép toán trên số nguyên.

ĐÔ HOẠ MÁY TÍNH

Gọi (x, + 1,y)là điểm thuộc đoạn thẳng. Ta có y = m ( X j + 1)+ b; Đặt dị = y - yi và d2 = (yi + 1 ) - y. Xét tất cả các vị trí tương đối cùa y so với yi và y; + 1 ,việc chọn điểm (Xị + 1, yi + i)là s hay p phụ thuộc vào việc so sánh d| và d2 hay dấu của d| - d2:

- Nếu d| - d2 < 0, ta sẽ chọn điểm s, tức là yj + I = yj.

- Ngược lại, nếu dị - d2 > 0, ta sẽ chọn điểm p, tức là yj +1= yj + 1. Xét Pi = Dx(di - d2) = Dx(2y - 2yj - 1 )

=> Pi = Dx[2(m(Xj+ 1)+ b) - 2yi - 1 ] Thay m = Dy/Dx vào phương trình trên ta được

Pi = 2DyXj - 2Dxyj + c, với c = 2Dy + (2b - 1 )Dx.

Nhận xét:

Do Dx > 0 nên dấu của biểu thức d| - d2 cùng chính là dấu của Pi; nói cách khác, nếu tại bước thứ i ta xác định được dấu cùa p, thì xem như xác định được điểm cần chọn ở bước (i + 1 ).vấn đề còn lại là làm thế nào để tính được Pi tại mồi bước thật nhanh.

Ta có:

p, + I - p, = (2Dyx, + I - 2Dxyi + I + c) - (2Dyx, - 2Dxyị + c) - 2Dy(Xi + I - Xi) - 2Dx(yj +, - y.)

= 2Dy — 2Dx(yi + 1 — yj), do Xị + 1 = Xi + 1 Từ đây có thể suy ra cách tính Pi +1 từ p, như sau: - Nếu Pi < 0 ta chọn Ỵị + I = Ỵị thì: Pi + 1 = Pi + 2Dy;

- Nếu Pi > 0 ta chọn y, +1= yi + 1 thì: Pi + 1 =: Pi + 2Dy - 2Dx. Giá trị Po được tính từ điểm vẽ đầu tiên (x〇, y〇) theo công thức:

Po = 2Dyx〇 - 2Dxy〇 + c = 2Dyx〇 - 2Dxy〇 + 2Dy - (2b - 1 )Dx Do (x〇, y〇)là điểm nguyên thuộc về đoạn thẳng nên ta có

y〇 = mx〇 + b = — .x〇 + b. Dx

被んか,グ 2 - CÁC ĐÔI TƯỢNG ĐÒ HẠ c ơ SỞ

> Lưu đồ thuật toán Bresenham

ĐỒ HOẠ MÁY TÌNH

> Cai đặt minh hoạ thuật toán Bresenham

v o i d Li n e B r e s (int x l , i n t y l , i n t x 2 , int y2)

{

int Dx, Dy, p, Constl, C o n s t 2

int X, y

Dx = x2 - x l

D y = y2 - y l

p = 2 * Dy - D x ; I I Dy < < 1 Dx C o n s t 1 = 2 * D yI I Dy << 1

Const2 = 2 * (Dy - D x ) ; // (Dy - Dx) << 1 X = x ly = yl; p u t p i x e l( x , y , C o l o r )for (i = x l ; i < x 2 i + + ) { if (p < 0) p + = C o n s t lelse { p + = C o n s t 2; y ++; } X + + ; putpixel(x, y, C o l o r) ; } } // L i n e B r e s > Chưong trình 0202 # i n c l u d e < c s t d l i b > # incl u d e < i o s t r e a m > u s i n g n a m e s p a c e s t d^ i n c l u d e < q r a p h i c s .h>

^ A . ^ „ a CÁC ĐỒI TƯỢNG ĐỒ HOẠ c ơ SỞ

# i n c l u d e < c o n i o .h>

v o i d B r e s e n h a mC i r c l e (int xc, int yc, int Radius, int color) { i n t X, y , dX = 0 y = R a d i u sd = 3 - 2 * R a d i u s ; w h i l e (x <= y) { p u t p i x e l ( x c + X, yc + y, c o l o r )p u t p i x e l ( x c - X, yc + y, c o l o r) ; p u t p i x e l ( x c + X, yc - y, c o l o r )p u t p i x e l ( x c — X, yc - y, c o l o r )p u t p i x e l ( x c + Yi yc + X, c o l o r )p u t p i x e l ( x c - y, yc + X, c o l o r )p u t p i x e l ( x c + y, yc - X, c o l o r )p u t p i x e l ( x c - y , yc - X, c o l o r) ; if (d < 0) d + = 4 * x + 6 ; else { d + = 4 * (X — y) + 10; y ----; } X + + ; } }

int m a i n (int argc, c h a r * a rqv [])

{

int gr d r i v e = DETECT, gr m o d e

i n i t g r a p h ( & g r — drive, &gr mode, " " 〉 ;

B r e s e n h a m C i r c l e ( g e t m a x x () / 2,

E3 Đ ồ HOẠ MÁY TÌNH B r e s e n h a m _ C i r c l e ( g e t m a x x () / 2, g e t m a x y () / 2, 150, 5) B r e s e n h a m _ C i r c l e ( g e t m a x x () / 2, g e t m a x y () / 2, 200, 6) g e t c h O c l o s e g r a p h( ) ; s y s t e m (" P A U S E " )r e t u r n E X I T S U C C E S S

Hình 2.18. Két qua • chương trình thuật toán Bresenham

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ỗ là xét dấu pi để quyết định điểm kế tiếp, và sử dụng công thức truy hồi p, + 1 - Pjđể tính pi bàng các phép toán đơn giàn trên số nguyên.

^Aư<fna CÁC ĐÔI TƯỢNG Đô HOẠ c ơ SỞ

Một phần của tài liệu bài giảng Đồ họa máy tính (Trang 38 - 44)

Tải bản đầy đủ (PDF)

(183 trang)