- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Bresenham算法画圆并填充实验报告 09009202 陶园
计算机图形学实验报告
实验二
Bresenham算法画圆并填充
学号: 姓名:陶园 成绩:
东南大学计算机科学与工程学院
二〇一一年十一月
实验题目
Bresenham算法画圆并填充
算法思想
首先,真实的线条是连续的,但是计算机中的线条是离散的,是由很多点组成的,那么画线的重点就是如何高效地找到这些离散的点来更好地画出想要的图形。
实验要求用Bresenham算法实现画圆。那么首先先要了解Bresenham算法是一种什么算法。经过查阅,我找到Bresenham直线算法和画圆算法。直线是圆的基础。
Bresenham直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在 n 维光栅上最接近的点。这个算法只会用到较为快速的整数加法、减法和位元移位,常用于绘制电脑画面中的直线。是计算机图形学中最先发展出来的算法。 Bresenham画圆算法又称中点画圆算法,与Bresenham 直线算法一样,其基本的方法是利用判别变量来判断选择最近的像素点,判别变量的数值仅仅用一些加、减和移位运算就可以计算出来。为了简便起见,考虑一个圆 心在坐标原点的圆,而且只计算八分圆周上的点,其余圆周上的点利用对称性就可得到。 Bresenham直线算法流程图
圆的八对称性
所以,只需要知道圆上的一个点的坐标 (x, y) ,利用八对称性,就能得到另外七个对称点的坐标。和直线算法类似,Bresenham画圆算法也是用一系列离散的点来近似描述一个圆
Bresenham画圆算法的流程图#include stdlib.h
#include math.h
#include gl/glut.h
//按坐标画点
void draw(GLint xCoord, GLint yCoord)
{
glBegin(GL_POINTS);//以点的形式
glVertex2i(xCoord, yCoord);//在(xCoord, yCoord)坐标下画点
glEnd();
glFlush();//强制刷新
}
void Circle(GLint x,GLint y)
{
int a=abs(x);//将x的绝对值赋给a
int b=abs(y);//将y的绝对值赋给b
int c=a*-1;//使c=a的相反数
int d=b*-1;//使d=b的相反数
draw(x, y); draw(y, x);
draw(-x, y); draw(y, -x);
draw(x, -y); draw(-y, x);
draw (-x, -y); draw(-y, -x);//按照圆的对称性以圆心为对称点将四个象限的圆周画出
for(int i=c;i=a;i++)
{
for(int j=d;j=b;j++)
{
draw(i,j);
}
}//以a,b,c,d为边界用点填充该圆
}
//主函数
void BresenhamCircle(GLint r)
{
int d, d1, d2, direct;
GLint x,y;
x=0;
y=r;
d = 2*(1-r);
while(y=0)
{
Circle(x,y);
if(d 0)
{
d1 = 2* (d+ y) -1;
if(d1 =0)
direct = 1;
else
direct = 2;
}
else
{
if( d 0)
{
d2 = 2*(d-x)-1;
if(d2 = 0)
direct = 2;
else
direct = 3;
}
else
direct = 2;
}
switch(direct)
{
case 1:
x++;
d+=2*x + 1;
break;
case 2:
x++; y--;
d+=2*(x-y+1) + 1;
break;
case 3:
y--;
d+=-2*y + 1;
break;
}
}
}
void RenderScene(void)
{
BresenhamCircle(50);//主函数调用
}
//当窗口大小改变时由
文档评论(0)