计算机图形学实验报告模板圆的扫描转换
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
北京联合大学应用文理学院
实验报告
课程名称计算机图形学
实验(实训)名称圆的扫描转换
班级信息与计算科学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 { 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);