Bài Thuyết Trình
ĐỀ TÀI: THUẬT TOÁN BRESENNHAM VẼ ĐƯỜNG ELLIPSE
NHÓM 5
NỘI DUNG
I
II
III
GIẢI THUẬT
CODE MINH HỌA
HÌNH ẢNH MINH HỌA
I. GIẢI THUẬT
1.
Ý tưởng:Ta sử dụng thuật toán Bresenham để vẽ,ta chỉ cần vẽ ¼ elip ,sau đó lấy đối xứng qua các trục tọa độ sẽ vẽ được toàn bô elip
2.
Phân tích:
Phương trình của Ellipse có dạng:
Trong đó: a là độ dài trục chính, b là độ dài trục phụ
Phương trình tiếp tuyến với Ellipse tại điểm (, ) (E):
.+ . = 1
Suy ra hệ số góc của tiếp tuyến tại điểm đó là:
Đầu tiên, theo ý tưởng bài toán, chúng ta sẽ đi tính khoảng cách từ điểm thực đến 2 điểm vẽ được, xem khoảng cách nào ngắn hơn, sau đó ¼ cung
Tiếp tuyến với ellipse có hệ số góc bằng -1
elip. Chúng ta lại phải vẽ theo hai nhánh khác nhau. Đó là một nhánh từ trên xuống, và một nhánh
từ dưới lên. Hai nhánh này cắt nhau tại giao điểm
mà ở đó hệ số góc của tiếp tuyến với Elip bằng -1 (như hình trên)
(, )
I. GIẢI THUẬT
Thực chất của việc tính khoảng cách và chia hai nhánh vẽ elip là chúng ta đi tìm các điểm kế tiếp theo hướng tính y theo x (hay tính x
theo y) cho trước. Nhìn vào hình dưới đây, với giao điểm màu đỏ làm ranh giới, chúng ta dễ dàng thấy được nhánh vẽ từ trên xuống :
khi x tăng lên 1 đơn vị thì y chỉ tăng lên rất ít ; và ngược lại với nhánh vẽ từ dưới lên: khi y tăng lên 1 đơn vị thì x chỉ tăng lên rất ít. Nếu
như chúng ta chọn cách vẽ liền một mạch thì việc tăng lên không đồng đều của tọa độ x và y sẽ khiến đường elip không min, đứt gãy, rất
xấu. Do đó, muốn vẽ được đường elip mịn nét, chúng ta sẽ phải chia elip thành 2 nhánh để vẽ.
I. GIẢI THUẬT
Ta có phương trình Ellipse có tâm tại gốc tọa độ là:
Ta có thể viết lại: = +
(*)
Xét nhánh vẽ từ trên xuống. Giả sử điểm( ,) đã được vẽ. Điểm tiếp theo cần chọn sẽ là (+1,) hoặc (+1,-1)
Thay (+1) vào (*): = +
Đặt:
== +
= =+
⇒
⇒
= = 2.[ ] + 2.( ) +1
= 2.[ .()+1
Suy ra:
= 2.
)
(**)
I. GIẢI THUẬT
*Nhận xét:
•
<0: Chọn =, (**) => =.(2x+3)
•
0: Chọn =, (**) => = .(2x+3)
•
Với điểm đầu tiên (0,b), ta có: = 2b+1
I. GIẢI THUẬT
•
Tương tự như ta có nhánh hai từ trên lên :
•
<0: chọn xi+1 = xi => =.(2x+3)
•
0: chọn xi+1 = xi – 1
•
Với điểm đầu tiên (a,0) ta có: = 2a+1
=> = .(2x+3)
Begin
d1 = =
=
False
2 2
b /a *x <= y
False
2 2
a /b *y<=x
True
True
False
True
False
<0
<0
True
=.(2x+3)
=.(2x+3)
= .(2x+3)
= .(2x+3)
x ++
y++
Putpixel
Putpixel
End
II. CODE MINH HỌA
#include<stdio.h>
#include<conio.h>
#include<math.h> //thu vien toan hoc
#include<graphics.h> //thu vien do hoa
void Ve4diem(int xc,int yc,int x, int y,int color)
{
putpixel(xc+x,yc+y,color); //diem goc phan tu 1
putpixel(xc-x,yc+y,color); //diem goc phan tu 2
putpixel(xc-x,yc-y,color); //diem goc phan tu 3
putpixel(xc+x,yc-y,color); //diem goc phan tu 4
delay(10);
//là ham tre thoi gian
}
void Elip(int x_center,int y_center,int a,int b,int color)// ve elip
{
float p,a2,b2;
int x,y;
a2=pow(a,2);
b2=pow(b,2);
x=0;
y=b;
p=2*((float)b2/a2)-(2*b)+1;
//ve 4 diem doi xung
II. CODE MINH HỌA
//ve nhanh thu 1(tu tren xuong )
while(((float)b2/a2)*x<=y)
{
Ve4diem(y_center,y_center,x,y,color);
if(p<0)
{
p=p+2*((float)b2/a2)*(2*x+3);
}
else{
p= p- 4*y + 2*((float)b2/a2)*(2*x+3);
y--;
}
x++;
}
//ve nhanh thu 2(tu duoi len )
y=0;
x=a;
p=2*((float)a2/b2)-2*a+1;
while(((float)a2/b2)*y<=x)
{
Ve4diem(y_center,y_center,x,y,color);
if(p<0)
II. CODE MINH HỌA
{
p=p +2*((float)a2/b2)*(2*y+3);
}
else
{
p=p- 4*x + 2*((float)a2/b2)*(2*y+3);
x=x-1;
}
y=y+1;
}
}
int main (){
int x,y;
int color =4;
printf("nhap toa do tam elip =");
scanf("%d%d",&x,&y);
initwindow(600,600);
Elip(x,y,300,150,color);
getch();
}
III. HÌNH ẢNH MINH HỌA
THANKS FOR WATCHING!