Tải bản đầy đủ (.pptx) (13 trang)

Bài 5 : Slide bài giảng vẽ Elip bressenham

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (509.86 KB, 13 trang )

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!



×