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

实验三:圆的生成算法的实现班级 08信计2 学号 64 姓名刘辉分数一、实验目的和要求1.理解圆生成的基本原理,掌握几种常见的圆生成算法。
2.利用Visual C++ 实现圆生成的中点画圆的算法。
3.利用Visual C++ 实现圆的Bresenham算法。
4.简单了解其他算法。
二、实验内容:1.利用中点画图算法,在屏幕上生成任意一段圆弧。
2.利用图的对称性,将(1)题生成的圆弧扩展为一个整圆。
3.利用bresebham算法设计出一段圆弧。
三、实验步骤:1.预习教材关于圆的生成原理。
2.仿照教材关于圆生成的中点画圆算法和bresenham算法,使用C++实现该算法。
3.调试、编译、运行程序。
利用bresenham算法生成圆的代码:#include<graphics.h>#include<stdio.h>#include<conio.h>void BresenhemCircle(int centerx, int centery, int radius, int color, int type);void main(){int drive=DETECT,mode;int i,j;initgraph(&drive,&mode,"");BresenhemCircle(300,200,100,150,0);getch();closegraph();}void BresenhemCircle(int centerx, int centery, int radius, int color, int type) {int x =type = 0;/*初始横坐标为原点*/int y = radius; /*初始纵坐标远离原点*/int delta = 2*(1-radius);int direction;while (y >= 0){getch();if (!type)/*执行*/{/*在上半圆画两点*/putpixel(centerx+x, centery+y, color);putpixel(centerx-x, centery+y, color);/*在下半圆画两点*/putpixel(centerx-x, centery-y, color);putpixel(centerx+x, centery-y, color);getch();}else{line(centerx+x, centery+y, centerx+x, centery-y); line(centerx-x, centery+y, centerx-x, centery-y); getch();}if (delta < 0){if ((2*(delta+y)-1) < 0)direction = 1;elsedirection = 2;}else if(delta > 0){if ((2*(delta-x)-1) > 0)direction = 3;elsedirection = 2;}elsedirection=2;switch(direction){case 1:x++;delta += (2*x+1); break;case 2:x++;y--;delta += 2*(x-y+1); break;case 3:y--;delta += (-2*y+1); break;}}}实验结果:四、实验结果分析:Bresenham画圆算法是最有效的算法之一,通过画出八分之一的圆周,对称得到整个圆周,第一想先的图形,让X轴量平均增加,通过选择理想的Y轴坐标,确定得到整个图形,算法的实现简单,且时间复杂度较低。
计算机图形学圆的生成

1、当F(M)<0时, M在圆内(圆弧A),说明点E距离圆更近,应取E点; 2、当F(M)>0时, M在圆外(圆弧B),表明SE点离圆更近,应取SE点; 3、当F(M)=0时, 在E点与SE点之中任取一个即可,我们约定取SE点。
2.2.3 中点画圆算法思想
我们用中点M的圆函数作为决策变量di,同时用增量法来迭 代计算下一个中点M的决策变量di+1。
2.2.5 中点画圆程序
F(x,y) <0 点(x,y)位于数学圆内 =0 点(x,y)位于数学圆上 >0 点(x,y)位于数学圆外
, 假定当前取点为Pi(xi,yi),如果顺 时针生成圆,那么下一点只能取正 右方的点E(xi+1,yi)或右下方的点 SE(xi+1,yi-1)两者之一。
(2-8)
生成圆的初始条件和圆的生成方向
2.2.4 中点画圆算法实现
1、输入:圆半径r、圆心(x0,y0); 2、确定初值:x=0,y=r、d=5/4-r; 3、While(x<=y) { circlePoints (x,y,color); if(d≥0) { y--; d=d+2(x-y)+5; } else d=d+2x+3; x++; }
2.2 圆的生成
这里仅讨论圆心位于坐标原点的圆的扫描转 换算法,对于圆心不在原点的圆,可先用平 移变换,将它的圆心平移到原点,然后进行 扫描转换,最后再平移到原来的位置。
2.2.1 圆的八分对称性
八分对称性: 圆心位于原点的圆有四条对称轴x=0、y=0、x=y和x=-y, 若 已知圆弧上一点P(x,y),就可得到其关于四条对称轴的七个对称点。因 此只要能画出八分之一的圆弧,就可以用对称性的原理得到整个圆弧。
计算机图形学-三种直线生成算法及圆的生成算法

计算机科学与技术学院2013-2014学年第一学期《计算机图形学》实验报告班级:110341C学号:110341328姓名:田野教师:惠康华成绩:实验(一):平面图形直线和圆的生成一、实验目的与要求1.在掌握直线和圆的理论基础上,分析和掌握DDA生成直线算法、中点生成直线算法、Bresenham生成直线算法、中点画圆算法、Bresenham圆生成算法。
2.熟悉VC6.0MFC环境,利用C语言编程实现直线和圆的生成。
3.比较直线生成三种算法的异同,明确其优点和不足。
同时了解圆的生成算法适用范围。
二、实验内容1.掌握VC6.0环境中类向导和消息映射函数的概念,并且为本次实验做好编程准备工作。
2. 用C语言进行编程实现上述算法,并且调试顺利通过。
3. 在MFC图形界面中显示不同算法下的图形,并且注意对临界值、特殊值的检验。
完成后保存相关图形。
三、算法分析➢DDA直线生成算法描述:1)给定一直线起始点(x0,y0)和终点(x1,y1)。
分别计算dx=x1-x0,dy=y1-y0。
2)计算直线的斜率k=dy/dx。
当|k|<1时转向3);当|k|<=1时,转向4);3)当x每次增加1时,y增加k。
即(xi,yi)→(xi+1,yi+k)。
直到xi增加到x1。
并且每次把得到的坐标值利用系统函数扫描显示出来。
但要注意对y坐标要进行int(y+0.5)取整运算。
结束。
4)对y每次增加1时,x增加1/k,即(xi,yi)→(xi+1/k,yi+1)。
直到yi增加到y1. 并且每次把得到的坐标值利用系统函数扫描显示出来。
但要注意对x坐标要进行int(x+0.5)取整运算。
结束。
➢中点生成算法描述:算法基本思想:取当前点(xp,yp),那么直线下一点的可能取值只能近的正右方点P1(xp+1,yp)或者P2(xp+1,yp+1)。
为了确定好下一点,引入了这两点中的中点M(xp+1,yp+0.5)。
这时可以把改点带入所在直线方程,可以观察该中点与直线的位置关系。
第二章 二维图形生成技术---直线和圆弧

圆弧扫描算法
• X + Y = R 2 2 Y = ±Sqrt(R - X ) 在一定范围内,每给定一 X值,可得一Y值。 当X取整数时,Y须取整。
为能确定B在A点上面或下面,令
Yi+1,r A Yi,r D B C xi Xi+1 ε(x)的几何意义
ε(xi+1)=yi+1-yir-0.5
(2)
若B在A的下面,则有ε(xi+1)<0,反 之,则ε(xi+1)>0。由图可知 yi+1,r=yir+1,若ε(xi+1)≥0 yi+1,r=yir, 若ε(xi+1)≤0 (3)
逐点比较法 数值微分法(DDA) 中点画线法 Bresenham算法。
一逐点比较法
算法: 1、偏差计算 1)一般公式
αβ
A(xA, xA)
M(xM, xM)
• 偏差 d = tg β − tg α = y M − y A
xM
xA
y M x A − y A xM = xM x A
• 偏差的判断公式为
Bresenham画线算法
程序如下: BresenhamLine(x0,y0,x1,y1,color) int x0,y0,x1,y1,color; { int x,y,dx,dy; float k,e; int e; dx = x1-x0; dy = y1-y0; k = dy/dx; e = -0.5; x=x0; y=y0; e = -dx; for( i=0; i<=dx; i++){ drawpixel(x,y,color); x++; e=e+k; e1=e-0.5; e=e+2*dy; e1= e-dx; if(e1 > 0) e = e - 1; e = e - 2*dx; if(e >=0) y++; } }
圆弧生成算法

图3.9 对圆弧AB
要向下走一步得Pi+1,这是向圆内方 用正负法取点
向走去,取xi+1= xi, yi+1= yi-1
计算F(xi+1,yi+1)
分为两种情况:
F
xi
1
,
yi
1
F F
xi xi
, ,
yi yi
2xi 2 yi
1, 1,
Fxi , yi 0 Fxi , yi 0
➢当xi+1=xi+1,yi+1=yi时, F(xi+1,yi+1)=xi+12+yi2-R2 =xi2+yi2-R2+2xi+ =F(xi,yi)+2xi+1 ➢当xi+1=xi,yi+1=yi-1时, F(xi+,yi+1)=xi2+(yi-1)2-R2 =F(xi,yi)-2yi+1
di+1=(xi+1)2+y2i-R2+(xi+1)2+(yi-1)2-R2
=2x2i+4xi+2y2i-2yi-2R2+3
(3.17)
Di递推公式
di=2x2i+2y 2i-1-2yi-1-2R2+1
(3.16)
di+1=2x2i+4xi+2y2i-2yi-2R2+3 (3.17)
xi= xi-1+1
计算机图形学
1.1 正负法
基本原理:设圆的圆心在 (0,0),半径为R,则圆的方程 为
F(x,y)=x2+y2–R2=0
计算机图形学基础实验指导书

计算机图形学基础实验指导书目录实验一直线的生成 ............................................................... -..2.-实验二圆弧及椭圆弧的生成........................................................ -..3 -实验三多边形的区域填充 ......................................................... - (4)-实验四二维几何变换 ............................................................. -..5.-实验五裁剪算法 ................................................................. -..6.-实验六三维图形变换 ............................................................. -..7.-实验七BEZIER 曲线生成......................................................... -..8.-实验八交互式绘图技术实现........................................................ -..10-实验一直线的生成一、实验目的掌握几种直线生成算法的比较,特别是Bresenham 直线生成算法二、实验环境实验设备:计算机实验使用的语言: C 或Visual C++ 、OpenGL三、实验内容用不同的生成算法在屏幕上绘制出直线的图形,对不同的算法可设置不同的线形或颜色表示区别。
四、实验步骤直线Bresenham 生成算法思想如下1)画点(x i, y i), dx=x2-x i, dy=y2-y i,计算误差初值P i=2dy-dx , i=1;2)求直线下一点位置x i+i=x i+i 如果P i>0,贝U y i+i=y i+i,否则y i+i=y i;3)画点(x i+i ,y i+i );4)求下一个误差P i+i 点,如果P i>0,贝U P i+i=P i+2dy-2dx,否则P i+i=P i+2dy;i=i+i ,如果i<dx+i 则转步骤2,否则结束操作。
计算机图形学--圆的的生成算法的实现

计算机图形学--圆的的生成算法的实现实验三:圆的的生成算法的实现班级08信计2班学号20080502063 姓名李宁分数一、实验目的与要求:1、了解WIN-TC1.72等编程环境中常用控件命令与绘图函数,初步掌握在实验设计集成环境下进行图形处理程序的设计方法。
2、熟练掌握圆的两种换算法:基于正负算法画圆和基于中点算法画圆。
、二、实验内容:1、在WIN-TC1.72环境中设计程序,利用消息处理函数,搭建能运行图形算法程序的平台。
2、根据教材中给定的算法,实现圆的两种生成算法:基于中点算法画圆和基于正负算法三、实验结果分析:1、实验程序(1)基于中点算法画圆程序实现的完整源程序#include <graphics.h>#include <conio.h>// 中点画圆法void Circle_Midpoint(int x, int y, int r, int color){int tx = 0, ty = r, d = 1 - r;while(tx <= ty){// 利用圆的八分对称性画点putpixel(x + tx, y + ty, color);putpixel(x + tx, y - ty, color);putpixel(x - tx, y + ty, color);putpixel(x - tx, y - ty, color);putpixel(x + ty, y + tx, color);putpixel(x + ty, y - tx, color);putpixel(x - ty, y + tx, color);putpixel(x - ty, y - tx, color);if(d < 0)d += 2 * tx + 3;elsed += 2 * (tx - ty) + 5, ty--;tx++;}}// 主函数void main(){initgraph(640, 480);// 测试画圆Circle_Midpoint(320, 240, 200, RED);Circle_Midpoint(320, 240, 101, RED);// 按任意键退出getch();closegraph();}(2)基于正负算法程序实现的完整源程序#include <graphics.h>#include <conio.h>// 正负画圆法void Circle_PN(int x, int y, int r, int color) {int tx = 0, ty = r, f = 0;while(tx <= ty){// 利用圆的八分对称性画点putpixel(x + tx, y + ty, color);putpixel(x + tx, y - ty, color);putpixel(x - tx, y + ty, color);putpixel(x - tx, y - ty, color);putpixel(x + ty, y + tx, color);putpixel(x + ty, y - tx, color);putpixel(x - ty, y + tx, color);putpixel(x - ty, y - tx, color);if(f <= 0)f = f + 2 * tx + 1, tx++;elsef = f - 2 * ty + 1, ty--;}}// 主函数void main(){initgraph(640, 480);// 测试画圆Circle_PN(320, 240, 200, RED); Circle_PN(320, 240, 101, RED);// 按任意键退出getch();closegraph();}2、实验结果中点算法运行结果:基于正负算法结果、四、实验结果分析该实验基于中点算法和正负算法画圆的基本函数,设计出直线的图像的程序。
圆及圆弧生成算法

圆及圆弧生成算法圆及圆弧生成算法是计算机图形学中常用的算法之一,用于生成圆及圆弧的几何形状。
圆是一个闭合曲线,由一系列连续的点组成,其到中心点的距离都相等。
圆弧是圆的一部分,也是由一系列点组成的曲线。
下面将介绍几种常见的圆及圆弧生成算法。
1.中点圆生成算法:中点圆生成算法是一种常用的生成圆形的算法。
该算法从圆心开始,逐步生成圆上其它点的坐标,直到生成整个圆。
算法的基本思想是在每一步中选择一个点,使得该点的距离到圆的实际弧路径最接近满足圆方程的距离。
具体步骤如下:(1)初始化圆心坐标和半径;(2)设置初始点的坐标为(0,r),即圆上的一个点;(3)设置初始参数值d,初始值为1-r;(4)当x小于等于y时,递归生成圆上的其它点的坐标,具体步骤如下:-如果d<0,则令d=d+2x+3,x=x+1,y=y;-如果d>=0,则令d=d+2x-2y+5,x=x+1,y=y-1;(5)重复步骤(4)直到x大于y结束。
2. Bresenham圆生成算法:Bresenham圆生成算法是基于中点圆生成算法的改进。
该算法的主要思想是通过对称性减少计算量,较中点圆生成算法更快速。
具体步骤如下:(1)初始化圆心坐标和半径;(2)设置初始点的坐标为(0,r),即圆上的一个点;(3)设置初始参数值d,初始值为3-2r;(4)当x小于等于y时,递归生成圆上的其它点的坐标,具体步骤如下:-如果d<0,则令d=d+4x+6,x=x+1,y=y;-如果d>=0,则令d=d+4(x-y)+10,x=x+1,y=y-1;(5)重复步骤(4)直到x大于y结束。
3.中点圆弧生成算法:中点圆弧生成算法是用于生成圆弧的算法。
该算法通过给定圆心、弧的起始点和终止点,计算圆弧上的所有点的坐标。
具体步骤如下:(1)初始化圆心、起始点和终止点坐标;(2)计算圆上点的初始参数值d,初始值根据起始点和终止点的位置关系计算得到;(3)按递增顺序计算圆弧上的点的坐标,具体步骤如下:-如果d<0,则令d=d+4x+6,x=x+1,y=y;-如果d>=0,则令d=d+4(x-y)+10,x=x+1,y=y-1;-输出当前点的坐标;(4)重复步骤(3)直到到达终止点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
三、实验内容:
编写图形程序:中点画圆弧算法程序,并调试运行。
圆弧生成算法程序如下:
#include<stdio.h>
#include <conio.h>
#include<graphics.h>
void Mid_Circle(int r)
《计算机图形学》实验报告(二)
班级:
姓名:
学号:
实验成绩:优秀□良好□中□及格□不及格□
实验题目:圆弧生成算法
一、实验目的:
1.掌握圆弧的中点画圆算法。
2.掌握在TC平台上,进行图形程序设计的方法。
3.培养学生利用基本图形生成算法,实验是根据光栅图形生成算法,以实现圆弧图形的绘制。
{
int d,x,y; int color=255;
x=0;
y=r;
d=1.25-r;
while(x<=y)
{
if(d<0)
{
d+=2*x+3;
}
else
{
d+=2*(x-y)+5;
y--;
}
x++;
putpixel(x, y, color);
}
}
void main()
{
int c;
printf("输入半径?:\n");
四、实验总结:
通过本次实验使我掌握了圆弧的中点画圆算法和掌握了在TC平台上,进行图形程序设计的方法。由程序的调试结果可知,我们采用的是1/8画圆法,我们可以用八对称性求出整个圆弧。在做实验之前老师先给我们讲了圆弧的中点画圆算法的知识,然后我们才开始编程、调试、运行、测试,直到做完实验我们才完全掌握圆弧的中点画圆算法,所以只有理论与实践相结合才能完全掌握所学知识。希望自己在以后的课堂上专心听课,为实践打好理论基础。
scanf("%d",&c);
int graphdriver=DETECT;
int graphmode;
initgraph(&graphdriver,&graphmode,"");
Mid_Circle(c);
_getch();
closegraph();
}
程序调试:
输入半径68,“回车”得结果如下图;