计算机图形学-圆的生成算法的实现_第1页
计算机图形学-圆的生成算法的实现_第2页
计算机图形学-圆的生成算法的实现_第3页
计算机图形学-圆的生成算法的实现_第4页
计算机图形学-圆的生成算法的实现_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验三圆的生成算法的实现班级信计学号51姓名程芳超分数一、实验目的和要求:1、掌握圆的生成算法的基本原理2、熟悉圆的生成算法,利用Turbor实现中点画圆算法、圆的Bresenham算法。二、实验内容:1、熟悉圆上的8个对称点的算法,利用中点画圆算法画圆并在屏幕上显示出来;2、使用Bresenham画圆法生成一个圆;3、利用line()函数画圆:.圆的参数方程;圆心为o(x0,y0)。以下为各程序的实现代码:1、中点画圆算法:运行结果为:#include"Conio.h"#include"graphics.h"#include"stdio.h"#include"math.h"#defineclosegrclosegraph#definexo300#defineyo250#defineDELTA1.0#definemax100typedefstruct{intx;inty;}Point;typedefstruct{intpointNum;Point*vertices;}Polygon;voidinitgr(void){intgd=DETECT,gm=0;registerbgidriver(EGAVGA_driver);initgraph(&gd,&gm,"");}voidputpixels(intx,inty,intcolor,intn){inti,j;for(i=-n/2;i<=n/2;i++)for(j=-n/2;j<=n/2;j++)putpixel(x+j,y+i,color);}voidputpixelt(intx,inty,intcolor,inti){inta[8]={1,1,1,1,0,0,0,0};if(a[i%8])putpixel(x,y,color);}voidEllipsePoints(intx,inty,intcolor){putpixel(xo+x,yo+y,color);putpixel(xo-x,yo+y,color);putpixel(xo+x,yo-y,color);putpixel(xo-x,yo-y,color);}voidCirclePoints(intx,inty,intcolor){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);}voidMidPointCircle1(intradius,intcolor){intx,y;floatd;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<graphics.h>#include<stdio.h>#include<conio.h>#include<math.h>voidBresenhamCircle(xc,yc,radius,color)intxc,yc,radius,color;{intx,y,d;x=0;y=radius;d=3-2*radius;while(x<y){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)intxc,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(){inta,b,c,e;intgraphdriver=DETECT;intgraphmode=0;initgraph(&graphdriver,&graphmode,"");cleardevice();a=300;b=300;c=150;e=3;BresenhamCircle(a,b,c,e);getch();closegraph();}运行结果为:3、利用line()函数画圆#include<stdio.h>#include<stdlib.h>#include<math.h>#include<conio.h>#include<graphics.h>main(){inti,r,xx[46],yy[46],x0,y0;floatt=360/45*3.14/180;intgdriver=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();return0;}运行结果为:三、实验结果分析1、显示圆上的8个对称点的算法如下:voidCirclePoints(intx,inty,intcolor){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的值不同,所画圆的圆滑程度不同,圆心位置可随坐标改变。5、两种算法生成一点所需的计算量比较每种循环中各种运算次数总和画一个八分或四分圆的总运算次数画每一点所需要的平均运算次数比较加法移位Bresenham法2(d<0)215(R-R/)6+(1)5=RR2(d>=0)316中点算法2(d<0)215(R-R/)7+(1)5=2R-3R/5(2R-3R/)/(R/)4.82(d>=0)327通过实际的程序运行进行比较,结论是中点画圆法速度比较快,就算法本身而言,该算法仍可以在某些方面进行改进,如

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论