计算机图形学--圆的生成算法的实现

  • 格式:docx
  • 大小:18.38 KB
  • 文档页数:8

计算机图形学--圆的生成算法的实现

实验三 圆的生成算法的实现

班级 信计 学号51姓名 程芳超 分数

一、实验目的和要求:

1、掌握圆的生成算法的基本原理

2、熟悉圆的生成算法,利用Turbor 实现中点画圆算法、圆的Bresenham

算法。

二、实验内容:

1、熟悉圆上的8个对称点的算法,利用中点画圆算法画圆并在屏幕上显示

出来;

2、使用Bresenham 画圆法生成一个圆;

3、利用line()函数画圆:.

圆的参数方程222(0)(0)x x y y r +++=;

圆心为o(x0,y0)。

以下为各程序的实现代码:

1、中点画圆算法:

运行结果为:

#include "Conio.h"

#include "graphics.h"

#include "stdio.h"

#include "math.h"

#define closegr closegraph

#define xo 300

#define yo 250

#define DELTA 1.0

#define max 100

typedef struct {

int x; int y;

}Point;

typedef struct

{

int pointNum;

Point *vertices;

}Polygon;

void initgr(void)

{

int gd = DETECT, gm = 0;

registerbgidriver(EGAVGA_driver);

initgraph(&gd, &gm, "");

}

void putpixels(int x,int y,int color,int n) { int i,j;

for(i=-n/2;i<=n/2;i++)

for(j=-n/2;j<=n/2;j++)

putpixel(x+j,y+i,color);

}

void putpixelt(int x,int y,int color,int i) {int

a[8]={1,1,1,1,0,0,0,0};

if(a[i%8])putpixel(x,y,color);

}

void EllipsePoints(int x,int y,int color) {

putpixel(xo+x,yo+y,color);

putpixel(xo-x,yo+y,color);

putpixel(xo+x,yo-y,color);

putpixel(xo-x,yo-y,color);

}

void CirclePoints(int x,int y,int color) { putpixel(xo+x,yo+y,color);

putpixel(xo+y,yo+x,color);

putpixel(xo-y,yo+x,color);

putpixel(xo-x,yo+y,color);

putpixel(xo+y,yo-x,color);

putpixel(xo+x,yo-y,color);

putpixel(xo-x,yo-y,color);

putpixel(xo-y,yo-x,color);

}

void MidPointCircle1(int radius,int color) {

int x,y;

float d;

x=0; y=radius; d=5.0/4-radius;

CirclePoints(x,y,color);

while(y>x)

{

if(d<=0)

d+=2.0*x+3;

else

{

d+=2.0*(x-y)+5;

y--;

}

x++;

CirclePoints(x,y,color);

}

}

main()

{

initgr(); cleardevice();

MidPointCircle1(150,4);

getch();

closegraph();

}

运行结果为:

2圆的Bresenham算法:

#include

#include

#include

#include

void BresenhamCircle(xc,yc,radius,color)

int xc,yc, radius,color;

{

int x,y,d;

x=0 ;

y=radius ;

d=3-2*radius ;

while(x

{

plot_circle_points(xc,yc,x,y,color) ; if(d<0)

d+=4*x+6;

else

{

d+=4*(x-y)+10;

y--;

}

x++;

}

if(x==y) plot_circle_points(xc,yc,x,y,color) ; }

plot_circle_points(xc,yc,x,y,color)

int xc,yc,x,y,color;

{

putpixel(xc+x,yc+y,color);

putpixel(xc-x,yc+y,color);

putpixel(xc+x,yc-y,color);

putpixel(xc-x,yc-y,color);

putpixel(xc+y,yc+x,color);

putpixel(xc-y,yc+x,color);

putpixel(xc+y,yc-x,color);

putpixel(xc-y,yc-x,color);

}

main()

{

int a,b,c,e ;

int graphdriver=DETECT ;

int graphmode=0;

initgraph(&graphdriver,&graphmode," "); cleardevice();

a=300;

b=300;

c=150;

e=3;

BresenhamCircle(a,b,c,e );

getch();

closegraph();

}

运行结果为:

3、利用line()函数画圆

#include #include

#include

#include

#include

main()

{

int i,r,xx[46],yy[46],x0,y0;

float t=360/45*3.14/180;

int gdriver=DETECT,gmode;

initgraph(&gdriver,&gmode,"");

cleardevice();

setbkcolor(14);

setcolor(4);

x0=300;y0=250;r=200;

for(i=0;i<46;i++)

{

xx[i]=x0+r*cos(i*t);

yy[i]=y0-r*sin(i*t);

}

for(i=0;i<45;i++)

line(xx[i],yy[i],xx[i+1],yy[i+1]);

settextstyle(1,0,5);

outtextxy(300,200,"O");

line(300,250,500,250);

getch();

closegraph();

return 0;

}

运行结果为:

三、实验结果分析 1、显示圆上的8个对称点的算法如下:

void CirclePoints(int x,int y,int color)

{

putpixel(x,y,color);

putpixel(y,x,color);

putpixel(-x,y,color);

putpixel(y,-x,color);

putpixel(x,-y,color);

putpixel(-y,x,color);

putpixel(-x,-y,color);

putpixel(-y,-x,color);

}

若已知圆弧上一点(x,y),可以得到其关于4条对称轴的其他七个点,因此要扫描转换1/8圆弧就可以求出表示整个圆弧的像素集。

2、圆的Bresenham算法:分析出来点(x,y),(x,-y),(-x,y),(-x,-y),(y,x),(y,-x),(-y,x),(-y,-x)的另外7个点。关于中心画圆算法,通过计算x = 0到 x = y的1/8圆的范围,然后通过对称原理得到其他7/8个点的信息。这里和Bresenham算法有很多相似之处,同样有一个决定下一个位置的关键值d来做权衡处理。

在中点画圆算法中,通过平移的方法将假设圆心在坐标原点,然后计算,最后再平移到真实原心位置。

3、在Bresenham算法中,只需做加法和乘4的乘法,因此远的Bresenham算法运行速度很快,适宜在硬件上实现。

4、t的值不同,所画圆的圆滑程度不同,圆心位置可随坐标改变。

每种循环中各种运

算次数总

和画一个八分或

四分圆的总运

算次数

画每一点所需要的平均运算次