当前位置:文档之家› 《计算机图形学》实验报告模板(圆的扫描转换)

《计算机图形学》实验报告模板(圆的扫描转换)

实验报告
课程名称计算机图形学
实验(实训)名称圆的扫描转换
班级信息与计算科学2009级姓名学号
同组者
实验(实训)日期完成日期
本实验(实训)所用学时统计
预习实验(实训)报告总计评阅意见:成绩
实验报告
一、实验目的
1、掌握用中点画圆法进行圆的扫描转换方法;
2、掌握用Bresenham画圆法进行圆的扫描转换方法;
3、理解中点画圆法与Bresenham画圆法的区别;
二、算法原理介绍
1、中点画圆算法
假设x坐标为xp的各像素点中,与该圆弧最近者已确定,为P(xp,yp),那么,下一个与圆弧最近的像素只能是正右方的P1(xp+1,yp),或右下方的P2
(xp+1,yp-1)两者之一。

令M为P1和P2的中点,易知M的坐标为(xp+1,yp-0.5)。

显然,若M在圆内,则P1离圆弧近,应取为下一个像素;否则应取P2。

判别式d:
d = F(M)=F(xp+1,yp-0.5)=(xp+1)^2+(yp-0.5)^2-R^2
d的初始值为:
d0 = F(1,R-0.5)=1+(R-0.5)^2-R^2=1.25-R
在d≥0的情况下,取右下方像素P2,
d = F(xp+2,yp-1.5)=(xp+2)^2+(yp-1.5)^2-R^2=d+2(xp-yp)+5
在d<0的情况下,取正右方像素P1,
d = F(xp+2,yp-0.5)=(xp+2)^2+(yp-0.5)^2-R^2=d+2xp+3
2、 Bresenham画圆算法
假设生成圆心在坐标原点,半径为r,从x=0到x=y的1/8圆弧。

xi+1=xi +1
相应的y则在两种可能中选择:
y=yi,或者y=yi-1
选择的原则是考察理想的y值是靠近yi还是靠近yi-1
判别式:
d i+1=2(xi+1)2+yi2+(yi-1)2-2r2
判断式d的初始值为:
d0= 3-2r。

如果d i+1>=0,则y=yi-1,
di+2 =d i+1 + 4(xi- yi)+10
如果d i+1<0,则y=yi,
d i+2 =d i+1+ 4x i+6
三、程序源代码
1、中点画圆算法
#include"graphics.h"
#include"math.h"
#include"conio.h"
main()
{
void MidPointCircle(int,int);/*定义主函数变量,MidPointCircle中点画圆算法函数*/
int gdriver,gmode; /*gdriver和gmode分别表示图形驱动器和模式*/
gdriver=DETECT; /*DETECT是自动选择显示模式*/
initgraph(&gdriver,&gmode,"c:\\tc3.0\\BGI");/*图形驱动文件的路径*/ MidPointCircle(200,YELLOW); /*定义圆的半径和颜色*/
getch();/*getch();会等待你按下任意键,再继续执行下面的语句*/
closegraph();/*关闭图形系统*/
return(0); /*返回值为0*/
}
void MidPointCircle(int r,int color) /*定义函数变量半径和颜色*/
{ int x,y;
float d; /*float类型中小数位数为7位,即可精确到小数点后7位 */
x=0; y=r; d=1.25-r;
while(x<y) /*满足条件x<y时进入循环,不满足跳出*/
{ if(d<0)
{d+=2*x+3; x++;}
else { d+=2*(x-y)+5; x++; y--;}
putpixel(x+200,y+200,color); putpixel(y+200,x+200,color);
putpixel(200-x,y+200,color); putpixel(y+200,200-x,color);
putpixel(200+x,200-y,color); putpixel(200-y,x+200,color);
putpixel(200-x,200-y,color); putpixel(200-y,200-x,color);
/* putpixel 在指定位置画一像素*/
}
}
2、 Bresenham画圆算法
#include"graphics.h"
#include"math.h"
#include"conio.h"
main()
{
void Bresenham_Circle(int,int);/* Bresenham_Circle为 Bresenham画圆算法函数*/
int gdriver,gmode;
gdriver=DETECT;
initgraph(&gdriver,&gmode,"c:\\tc3.0\\BGI");
Bresenham_Circle(200,YELLOW); /*定义圆的半径和颜色*/
getch();
closegraph();
return(0);
}
void Bresenham_Circle(int R,int color)
{ int x,y,delta,delta1,delta2,direction;
x=0;
y=R;
delta=2*(1-R);
while(y>=0) /*满足条件y>=0时进入循环,不满足跳出*/
{
putpixel(x+200,y+200,color); putpixel(y+200,x+200,color); putpixel(200-x,y+200,color); putpixel(y+200,200-x,color); putpixel(200+x,200-y,color); putpixel(200-y,x+200,color); putpixel(200-x,200-y,color); putpixel(200-y,200-x,color);
if(delta<0)
{
delta1=2*(delta+y)-1;
if(delta1<=0)direction=1;
else direction=2;
}
else if(delta>0)
{
delta2=2*(delta-x)-1;
if(delta2<=0) direction=2;
else direction=3;
}
else
direction=2;
switch (direction)/*switch语句,即“切换”语句;case即“情况*/ {
case 1:x++;
delta+=2*x+1;
break;/*执行 break 语句会退出当前循环或语句*/
case 2:x++;
y--;
delta+=2*(x-y+1);
break;
case 3: y--;
delta+=(-2*y+1);
break;
}
}
四、实验结果
图1中点画圆算法生成的圆半径r=200,颜色为黄色
图2 Bresenham画圆算法生成的圆
半径R=200,颜色为黄色
五、总结与体会
通过运用 C 语言环境下的图像显示设置,本次实验我学会了用中点画圆法、Bresenham 画圆法进行圆的扫描转换,更加深刻的理解了中点画圆法、Bresenham 画圆法进行圆的扫描转换的生成原理。

掌握了中点画圆、Bresenham画圆算法及其特点。

能够应用中点画圆算法、Bresenham画圆算法,编程实现画圆的功能。

六、参考文献
1、计算机图形学
2、C语言。

相关主题