- Khi điểm tiếp theo được chọn là D ,M tăng một đơn vị theo hướng x Tọa độ trung điểm mới là (xp+2, yp+1/2) Do đó: d1
dnew =d ol d+ (2xp+ 3)
Hằng số tăng của d là: du=dnew - dold=2xp+3
Nếu dold>0 thì chọn D, xp tăng 1, yp giảm 1.
d new = F ( x p + 2, y p − 3 2) = ( x p + 2) 2 + ( y p − 23 ) 2 − R 2
d new = d old + ( 2x p − 2 y p + 5)Hằng số tăng của D là: dd=dnew-dold=2(xp-yp)+5 Hằng số tăng của D là: dd=dnew-dold=2(xp-yp)+5
• Vòng lặp của thuật toán
Chọn pixel để vẽ dựa trên dấu biến quyết định d của vòng lặp trước
Cập nhật biến quyết định d bởi giá trị du,dd tương ứng với pixel U hay D vừa chọn
• Giá trị khởi đầu của d:
Điểm vẽ đầu tiên có tọa độ (0, R)
Biến quyết định d có giá trị: d = F (1, R − 12 ) = 1 + (R − R + 14 ) − R = 54 − R
2 22 2 2 2
Để tránh phần lẻ khởi tạo của d, lấy h=d-1/4. Do đó giá trị khởi tạo của h là 1-R và việc so sánh d<0 sẽ trở thành so sánh h<-1/4. Tuy nhiên chọn h bắt đầu là một giá trị nguyên và giá trị tăng cũng nguyên (du và d D) nên thay vào đó là việc so sánh h<0. Do đó có thuật toán nguyên theo h.
void Circle(int x, int y, int color){
putpixel(x,y, color); putpixel(y,x, color); putpixel(y,-x, color); putpixel(x,-y, color); putpixel(-x,-y, color); putpixel(-y,-x, color); putpixel(-y,x, color); putpixel(-x,y, color); }
void MidpointCircle(int r, int color){
/*Giả sử tâm đường tròn tại gốc tọa độ*/ int x, y, d; x=0; y= r; d=1-r; Circle(x, y, color); while (y>x){ if (d<0){ 16
d=d+2*x+3; x=x+1; }else{ d=d+2*(x-y)+5; x=x+1; y=y-1; } Circle(x, y, color); } }
2.3.2. Thuật toán Bresenham
1. Chọn vị trí thứ nhất để vẽ có tọa độ (x1, y1)=(0, r) 2. Tính tham số thứ nhất: p1=3-2r
Nếu p1<0: vị trí vẽ tiếp theo là (x1+1, y1). Ngược lại vẽ tại tọa độ (x1-1, y1-1). 3. Tiếp tục tăng x để tính p tiếp theo từ p trước đó
Nếu trước đó có pi<0: pi+1=pi+4xi+6
Ngược lại, ta có: pi+1=pi+4(xi-yi)+10
Nếu kết quả pi+1<0: điểm sẽ chọn tiếp theo là (xi-2, yi+1).
Ngược lại, ta chọn: (xi+2, yi+1-1).
Nếu pi<0 thì yi+1= yi, ngược lại yi+1= yi-1
y i
y
yi-1
4. Lặp lại bước 3 cho đến khi x=y. xi+1
2.4. THUẬT TOÁN VẼ ELIP
• Do Elip chuẩn có bốn phần đối xứng nhau qua hai trục x và y nên chỉ thực hiện vẽ ¼ elip trong ¼ thứ 1.
• Trước hết chia ¼ elip này thành hai vùng. Biên giới giữa hai vùng là điểm tại đó đường cong có độ dốc –1(xem hình 2.7). Độ dốc tiếp tuyến =-1 Thành phần j U D Vùng 1 Vùng 2 L R Thành phần i Hình 2.8. Vector Gradient Hình 2.7. Hai vùng của Elip
Vector Gradient vuông góc với tiếp tuyến của đường cong tại điểm đó được xác định như sau:
gradF ( x, y ) = ∂ ∂F
x i + ∂ ∂F
2 2
a y > b x
vector Gradient có độ dốc là 1. Do đó thành phần i và j của gradient có độ lớn như2 nhau.2 Trong
• Tìm ranh giới hai miền trong ¼ elíp là điểm P mà tiếp tuyến tại đó có hệ số góc là –1. Như vậy
vùng 1, thành phần j lớn hơn thành phần i, tức là:
• Ý tưởng thuật toán: Đánh giá hàm tại điểm giữa hai tọa độ pixel để chọn vị trí tiếp theo để vẽ. Dấu của nó cho biết điểm giữa nằm trong hay ngoài elíp. Từ đó sẽ xác định được điểm ảnh nào gần với elip hơn.
• Với vùng 1:
Giả sử điểm ảnh hiện tại là (xp,yp)
Biến quyết định cho vùng này là d1, là giá trị của F(x,y) xác định tại (xp+1, yp-1/2) và là trung điểm của UD: