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

上传人:wt****50 文档编号:34025894 上传时间:2018-02-20 格式:DOC 页数:7 大小:56KB
返回 下载 相关 举报
计算机图形学-- 圆的生成算法的实现_第1页
第1页 / 共7页
计算机图形学-- 圆的生成算法的实现_第2页
第2页 / 共7页
计算机图形学-- 圆的生成算法的实现_第3页
第3页 / 共7页
计算机图形学-- 圆的生成算法的实现_第4页
第4页 / 共7页
计算机图形学-- 圆的生成算法的实现_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《计算机图形学-- 圆的生成算法的实现》由会员分享,可在线阅读,更多相关《计算机图形学-- 圆的生成算法的实现(7页珍藏版)》请在金锄头文库上搜索。

1、1实验三 圆的生成算法的实现班级 08 信计 2 班 学号 20080502057 姓名 冯双捷 分数 一、实验目的和要求:1、掌握图形显示基本原理2、掌握使用简单函数实现画圆的方法3、熟悉圆的生成算法,及圆的绘制方法二、实验内容:1、编程实现 line 函数的画圆方法;2、由矩形画出四个圆的算法实现;3、编程实现生成圆弧的中点算法、Bresenham 画圆算法三、实验结果分析. 1、line 函数画圆的实现#include #include #include #include #include #define rad 0.0174532925#define NUMBER 24main()in

2、t i,r,xx41,yy41,x0,y0;float t=360/40*3.14/180;int gdriver=DETECT,gmode;initgraph(cleardevice();setbkcolor(RED);setcolor(YELLOW);x0=300;y0=250;r=200;for(i=0;i #include void main() int gdrver=VGA, gmode=2;int x0=320,y0=240,r=60;initgraph( /* 图形模式驱动函数 */cleardevice();setcolor(2);rectangle(x0-r,y0-r,x0+

3、r,y0+r); /*画矩形 */circle(x0,y0-r,r); /*画圆 */circle(x0,y0+r,r); circle(x0-r,y0,r); circle(x0+r,y0,r); getch(); /*从键盘输入任意字符 */closegraph(); 运行结果见文件夹:HUAYUAN23. 生成圆弧的中点算法3.1 算法思想为了生成圆弧,只需要计算出从 x=0 到 x=y 分段内的像素点即可,其余的像素位置利用圆的八对称性即可得出。设圆的半径是 R,从初始坐标点( 0,R )开始递推,假设已计算出象素 P(x,y) ,那么,下一个与圆弧最近的像素只能是正右方的 P1(x+

4、1,y),或右下方的 P2(x+1,y-1)两者之一。令 M 为 P1 和 P2 的中点,易知 M 的坐标为(x+1,y-1/2) 。显然,若 M 在圆内,则 P1 离圆弧近,应取为下一个像素;否则应取 P2。判断 M 位置的递推公式如下: Rd yxddxiiiiiiiii 45 .5)(2,0;32,011其 中3.2 程序:#include Conio.h3#include graphics.h#include stdio.h#include math.h#define closegr closegraph#define xo 300#define yo 250#define DELTA

5、 1.0#define max 100/*最大顶点数*/typedef structint x; int y;Point;typedef structint pointNum;Point *vertices;Polygon;void initgr(void) /* BGI 初始化 */int gd = DETECT, gm = 0; /* 和 gd = VGA,gm = VGAHI 是同样效果 */registerbgidriver(EGAVGA_driver);/* 注册 BGI 驱动后可以不需要.BGI 文件的支持运行 */initgraph(/*控制线宽*/void putpixels(

6、int x,int y,int color,int n) int i,j;for(i=-n/2;ix)if(d#include #include #includemain()int r,q,w,color;int gdriver=DETECT,gmode; /*设置图形驱动*/int Bresenham_Ciecle(); /*定义子函数*/printf(please input the centre of a circle x0,y0n);scanf(%d,%d,if(q=320|q=250)printf(please input the centre of a circle again x

7、0,y0n);5scanf(%d,%d, /*输入圆心位置越界输出信息*/printf(please input the numble of radius r=);scanf(%d,if(r=500)printf(r is error,r0,please input the numble of r=);scanf(%d,/*输入半径*/printf(please input the numble of color=);scanf(%d,initgraph(setcolor(color);/*设置图形颜色*/Bresenham_Ciecle(q,w,r,color); /*绘图*/getch()

8、; Bresenham_Ciecle(int q,int w,int r,int color)int x,y,t,v,delta,delta1,delta2,direction;char buffera20;char bufferb20;t=getmaxx()/2;v=getmaxy()/2; /*选定圆心*/sprintf(buffera, (%d,%d), q,w); /*打印圆心坐标*/sprintf(bufferb, (0,0) R=%d,r); /*打印原点坐标及半径*/moveto(t,v+4);outtext(bufferb); /*圆点坐标定位输出*/q=q+t;w=v-w;m

9、oveto(q,w);outtext(buffera); /*原点坐标定位输出*/line(1,v,2*t,v);line(t,2*v,t,1); /*画坐标 */x=q; y=r+w;line(q, w, x, y); /*画半径*/delta=2*(1-r);while(y-w=0)putpixel(x,y,color); /*右下方 1/4 个圆*/putpixel(2*q-x,y,color); /*右上方 1/4 个圆(从右下方 1/4 个圆对称复制)*/putpixel(x,2*w-y,color); /*左下方 1/4 个圆(从右下方 1/4 个圆对称复制)*/putpixel(

10、2*q-x,2*w-y,color); /*左上方 1/4 个圆(从右下方 1/4 个圆对称复制)*/if(delta0)delta2=2*(delta-x+q)-1;if(delta2=0) direction=2;else direction=3;elsedirection=2;switch(direction)case 1: x+;delta+=2*(x-q)+1;break;case 2: x+;y-;delta+=2*(1+x-y-q+w);break;case 3: y-;delta+=-2*(y-w)+1;break;输入圆心、半径,图形颜色数据如:运行结果见文件夹:BRESSA5.中点法与 Bresenham 算法的比较中点法与 Bresenham 算法都方便编程实现,但运行速度上 Bresenham 算法较快些,更适于用硬件实现。在运行程序时方便数据变换时的程序调试。在中点算法中若将浮点数改写成整数,将乘法运算改成加法运算,即禁用整数实现中点7画圆算法,可以进一步提高算法的效率。Bresenham 画圆算法是生成圆弧算法中最有效算法之一,在本实验中,Bresenham 画圆算法可以对圆心,圆的半径和园颜色进行简便的调试,运行速度也更快一些。重点生成圆弧短发虽然也很容易实现,但在调试上需对程序进行调试,没有 Bresenham 方便。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号