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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档