计算机图形学--圆的生成算法的实现
- 格式: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的值不同,所画圆的圆滑程度不同,圆心位置可随坐标改变。
每种循环中各种运
算次数总
和画一个八分或
四分圆的总运
算次数
画每一点所需要的平均运算次