Bresenham算法画圆并填充实验报告09009202陶园.docx

上传人:b****2 文档编号:1902694 上传时间:2022-10-25 格式:DOCX 页数:8 大小:74KB
下载 相关 举报
Bresenham算法画圆并填充实验报告09009202陶园.docx_第1页
第1页 / 共8页
Bresenham算法画圆并填充实验报告09009202陶园.docx_第2页
第2页 / 共8页
Bresenham算法画圆并填充实验报告09009202陶园.docx_第3页
第3页 / 共8页
Bresenham算法画圆并填充实验报告09009202陶园.docx_第4页
第4页 / 共8页
Bresenham算法画圆并填充实验报告09009202陶园.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

Bresenham算法画圆并填充实验报告09009202陶园.docx

《Bresenham算法画圆并填充实验报告09009202陶园.docx》由会员分享,可在线阅读,更多相关《Bresenham算法画圆并填充实验报告09009202陶园.docx(8页珍藏版)》请在冰豆网上搜索。

Bresenham算法画圆并填充实验报告09009202陶园.docx

Bresenham算法画圆并填充实验报告09009202陶园

Bresenham算法画圆并填充实验报告09009202陶园

计算机图形学实验报告——Bresenham算法画圆并填充09009202陶园

计算机图形学实验报告

实验二

Bresenham算法画圆并填充

学号:

09009202姓名:

陶园成绩:

东南大学计算机科学与工程学院

二〇一一年十一月

计算机图形学实验报告——Bresenham算法画圆并填充09009202陶园一(实验题目

Bresenham算法画圆并填充

二(算法思想

1.首先,真实的线条是连续的,但是计算机中的线条是离

散的,是由很多点组成的,那么画线的重点就是如何高效地

找到这些离散的点来更好地画出想要的图形。

2.实验要求用Bresenham算法实现画圆。

那么首先先要了

解Bresenham算法是一种什么算法。

经过查阅,我找到

Bresenham直线算法和画圆算法。

直线是圆的基础。

Bresenham直线算法是用来描绘由两点所决定的直线的算

法,它会算出一条线段在n维光栅上最接近的点。

这个算法

只会用到较为快速的整数加法、减法和位元移位,常用于绘

制电脑画面中的直线。

是计算机图形学中最先发展出来的算

法。

Bresenham画圆算法又称中点画圆算法,与Bresenham直

线算法一样,其基本的方法是利用判别变量来判断选择最近

的像素点,判别变量的数值仅仅用一些加、减和移位运算就

可以计算出来。

为了简便起见,考虑一个圆心在坐标原点

的圆,而且只计算八分圆周上的点,其余圆周上的点利用对

称性就可得到。

计算机图形学实验报告——Bresenham算法画圆并填充09009202陶园

Bresenham直线算法流程图

圆的八对称性

计算机图形学实验报告——Bresenham算法画圆并填充09009202陶园

所以,只需要知道圆上的一个点的坐标(x,y),利用八对称性,就能得到另外七个对称点的坐标。

和直线算法类似,Bresenham画圆算法也是用一系列离散的点来近似描述一个圆。

Bresenham画圆算法的流程图

计算机图形学实验报告——Bresenham算法画圆并填充09009202陶园

三(源代码

#include"stdlib.h"

#include"math.h"

#include

//按坐标画点

voiddraw(GLintxCoord,GLintyCoord)

{

glBegin(GL_POINTS);//以点的形式

glVertex2i(xCoord,yCoord);//在,xCoord,yCoord,坐标下画点

glEnd();

glFlush();//强制刷新

}

voidCircle(GLintx,GLinty){

inta=abs(x);//将x的绝对值赋给a

intb=abs(y);//将y的绝对值赋给b

intc=a*-1;//使c=a的相反数

intd=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(inti=c;i<=a;i++)

{

for(intj=d;j<=b;j++)

{

draw(i,j);

}

}//以a,b,c,d为边界用点填充该圆

}

//主函数

voidBresenhamCircle(GLintr){

intd,d1,d2,direct;

GLintx,y;

x=0;

y=r;

d=2*(1-r);

计算机图形学实验报告——Bresenham算法画圆并填充09009202陶园

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)

{

case1:

x++;

d+=2*x+1;

break;

case2:

x++;y--;

d+=2*(x-y+1)+1;

break;

case3:

y--;

d+=-2*y+1;

break;

}

}

}

voidRenderScene(void){

计算机图形学实验报告——Bresenham算法画圆并填充09009202陶园

BresenhamCircle(50);//主函数调用

}

//当窗口大小改变时由GLUT函数调用

voidChangeSize(GLsizeiwidth,GLsizeiHeight){

GLfloataspectRatio;

if(Height==0)

{

Height=1;

}

glViewport(0,0,width,Height);//指定视口矩形左下角

glMatrixMode(GL_PROJECTION);//指定当前矩阵,对投影矩阵应用随后的矩阵操

glLoadIdentity();//装载单位矩阵

aspectRatio=(GLfloat)width/(GLfloat)Height;

if(width<=Height)

{

glOrtho(-100.0,100.0,-100.0/aspectRatio,100.0/aspectRatio,1.0,-1.0);

}

else

{

glOrtho(-100.0*aspectRatio,100.0*aspectRatio,-100.0,100.0,1.0,-1.0);

}

glMatrixMode(GL_MODELVIEW);//指定当前矩阵,对模型视景矩阵堆栈应用随后的矩阵操作

glLoadIdentity();//装载单位矩阵

}

//主程序入口

voidmain(void)

{

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//设置初始显示模式,指定单缓存窗口,指定RGB颜色模式的窗口

glutCreateWindow("圆");//创建窗口,窗口名称为“圆”

glutDisplayFunc(RenderScene);//进行画图

glutReshapeFunc(ChangeSize);//重画回调函数

glutMainLoop();//进入GLUT事件处理循环,让所有的与“事件”有关的函数调用无限循环}

计算机图形学实验报告——Bresenham算法画圆并填充09009202陶园四(结果截屏

五(出现问题及解决方案

1.对于如何填充整个圆一开始没有好的方法,后来决定每画一个点,就将该横坐标的所有纵坐标点画出,从下到上,整个填充圆从中间到两边形成。

2,一开始画圆时出现的都是白色,没有圆,后来发现是因为没有在glEnd()之后加glFlush()这个函数。

加上之后就可以显示出圆了。

3.对于如何将这个圆显示出来,还参考了其他画图用的函数,但是每项功能都标注出来了。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 育儿知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1