- 1、本文档共17页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
椭圆中点Bresenham算法
目录
一、设计题目……………………………………………………………2
二、设计要求……………………………………………………………2
三、设计方案……………………………………………………………2
四、程序流程图…………………………………………………………6
五、程序清单…………………………………………………………7
六、程序运行结果分析………………………………………………15
七、系统不足及改进方案……………………………………………15
八、设计总结…………………………………………………………16
一、设计题目:椭圆中点Bresenham算法
二、设计要求:
1、要求有两种输入方式:
(1)输入椭圆的长短轴来生成椭圆;
(2)根据输入点来生成椭圆并输出椭圆的长短轴;
2、椭圆的颜色为红色;
三、设计方案:
1、椭圆对称性质:椭圆分别关于X轴、Y轴对称。因此在计算椭圆生成的时候,只需要计算1/4个椭圆,经过对称原理就可以实现其他3/4个椭圆的生成了,即:计算出目标点(x,y)的坐标,必然存在(x,-y)、(-x,y)(-x,-y)。此方案中采用计算第一象限中椭圆的生成,即:计算x=0到y=0的1/4的椭圆。先通过平移的方法将假设心在坐标原点,然后计算,最后再平移到真实心位置。
令F(x,y)=b*b*x*x+a*a*y*y- a*a* b*b=0
(1)对于第一区域,如图1所示,P点坐标为(,)、P1(+1, )为P点正右边的点、P2(+1, -1)为P点右下方的点,M(+1,-0.5)为P1、P2的中点。
令d=F(M)=F(+1,-0.5)=b*b+a*a*(b-0.5)*(b-0.5)-a*a*b*b
当=0、=bd=0时,应取P2作为下一个像素点,则其正右方的点的坐标为(+2,-1),右下方的点的坐标为(+2,-2),中点坐标为(+2,-1.5)。
此时,d=F(M)=F(+2,-1.5)=d+b*b*(2*+3)-2a*a*(-1)
d0时,应取P1作为下一个像素点,则其正右方的点的坐标为(+2,),右下方的点的坐标为(+2,-1),中点坐标为(+2,-0.5)。
此时,d=F(M)=F(+2,-0.5)=d+2* b*b* +3* b*b
(2)对于第二区域,如图2所示,P点坐标为(,),P1(, -1)为P点正下方的点、P2(+1, -1)为P点右下方的点,M(+0.5,-1)为P1、P2的中点。
令d=F(M)=F(+0.5,-1)=b*b*(+0.5)*(+0.5)+a*a*(-1)*(-1)-a*a*b*b
设P坐标的初始值为= ,=,=
d的初始值为:
d= F(+0.5, -1)= b*b*(+0.5)*(+0.5)+a*a*(-1)*(-1)-a*a*b*b
d=0时,应取P1作为下一个像素点,则其正下方的点的坐标为(,-2),右下方的点的坐标为(+1,-2),中点坐标为(+0.5,-2)。
此时,d=F(M)=F(+0.5,-2)=d+ a*a*(3-2 *)
d0时,应取P2作为下一个像素点,则其正下方的点的坐标为(+1,-2),右下方的点的坐标为(+2,-2),中点坐标为(+1.5,-2)。
此时,d=F(M)=F(+1.5,-2)=d+2*b*b*(+1)+ a*a*(3-2*)
(3)根据对称性原理计算其他3个象限的坐标。,)、(,)
设椭圆的方程为:
将两点坐标(,)、(,)代人椭圆方程中,得出a、b的值分别为:
=(*-*)/(-)
=(*-*)/(-)
然后按照方式一生成所求椭圆。
四、程序流程图
输入方式一的流程图如图3所示:
输入方式二的流程图如图4所示:
五、程序清单
// zhongdiansuanfa.cpp : Defines the entry point for the console application.
#include stdafx.h
#include stdlib.h
#include vector
#include GL/glut.h
#include math.h
int a;
int b;
/*定义长短半轴分别为a、b*/
void GetValue()
{
int input=0;
int x1,x2,y1,y2;
printf(请输入中点算法产生的方式:\n);
printf(1.输入椭圆长短半径\n);
printf(2.输入椭圆坐标\n);
/*输出两种输入方式*/
scanf(%d,input);
if(input==1)
{
printf(请输入a的值:\n);
scanf(%d,a);
printf(请输入b的值:\n);
scanf(%d,b);
}
if(input==2)
文档评论(0)