3种画圆算法的优劣分析
- 格式:doc
- 大小:73.50 KB
- 文档页数:12
逆时针画圆和顺时针画圆的思维模式一、逆时针画圆的思维模式逆时针画圆是一种常见的思维模式,它在许多领域都有应用。
首先,我们可以从几何学的角度来看。
在几何学中,逆时针画圆是以一个固定点为圆心,逆时针方向为正向,以一定的半径画出一条圆弧的过程。
这种思维模式在解决几何定理证明、图形构造等问题时非常有用。
逆时针画圆的思维模式在数学中也有应用。
例如,对于复数的幅角表示,逆时针方向被定义为正方向。
在复数平面中,逆时针画圆可以用来表示复数的辐角,从而进行各种复数运算和分析。
逆时针画圆的思维模式在物理学中也有重要的应用。
例如,在电磁学中,逆时针画圆可以表示电流的方向,根据安培定律可以确定磁场的方向。
逆时针画圆还可以用来描述力的方向,根据左手定则可以判断力矩的方向等。
逆时针画圆的思维模式在几何学、数学和物理学中都有广泛的应用。
它可以帮助我们理解和解决各种问题,从而提高我们的思维能力和解决问题的能力。
二、顺时针画圆的思维模式与逆时针画圆相对应的是顺时针画圆的思维模式。
它在某些情况下也是非常有用的。
首先,顺时针画圆可以用来表示某些旋转运动的方向。
例如,在机械工程中,当一个物体以顺时针方向旋转时,我们可以用顺时针画圆的思维模式来描述其运动方向和速度。
顺时针画圆的思维模式在某些数学问题中也有应用。
例如,在解析几何中,我们可以用顺时针画圆的思维模式来描述某个点在坐标平面上的运动方向和速度。
类似地,在数学分析中,顺时针画圆可以用来表示某个函数的递减性质,从而帮助我们进行函数的运算和分析。
顺时针画圆的思维模式在心理学和认知科学中也有应用。
研究发现,顺时针画圆比逆时针画圆更符合人们的直觉和认知习惯。
这种思维模式的应用可以帮助我们更好地理解和解决与旋转、转动相关的问题。
逆时针画圆和顺时针画圆的思维模式在不同领域中都有重要的应用。
它们可以帮助我们理解和解决各种问题,从而提高我们的思维能力和解决问题的能力。
无论是逆时针画圆还是顺时针画圆,都是我们在学习和应用中需要掌握和运用的重要思维工具。
像素画圆算法范文一、引言像素画圆算法是一种用于计算机图形学中绘制圆的常用算法。
在计算机图形学中,圆是一个非常基本的图形元素,无论是在2D还是3D图形中,圆都是最直观的图形之一、因此,能够高效绘制圆形对于计算机图形学来说是非常重要的。
在本篇文章中,我们将介绍两种常用的像素画圆算法:Bresenham算法和中点画圆算法。
这两种算法都是基于直线绘制算法的思想发展而来,通过巧妙的数学推导,将直线绘制算法应用到圆形的绘制过程中。
二、Bresenham算法Bresenham算法是一种经典的像素画圆算法,它是由Jack E. Bresenham于1962年发明的。
该算法通过计算以像素为单位的数学判定来绘制圆形。
该算法的基本思想是,对于给定的圆心坐标和半径长度,我们从一个点开始,根据圆的对称性,计算出其他8个对称特殊点的坐标,并选择最接近圆的边缘的点绘制。
接着,根据选择的点计算下一个边缘点,并反复迭代这一过程,直到找到了整个圆的边缘点。
具体的Bresenham算法如下:1.初始化半径r和圆心坐标(x,y);2.设置两个变量x1和y1分别为0和r;3.计算判别式d=3-2*r;4.在每次迭代中,绘制八个对称点中最接近圆边缘的点,并更新判别式d和坐标x和y的值:-如果d<0,选择右偏移的点(x+1,y),d的值不变;-如果d>=0,选择右上偏移的点(x+1,y+1),d的值减去Δd;-更新判别式d=d+4*x+6;5.重复步骤4,直到x>y。
这里的Δd是一个关于x和y的常数,它的值预先计算得出,使得可以在循环中快速计算判别式d的变化。
通过这种方式,Bresenham算法能够高效地计算出整个圆的边缘点,从而实现圆形的绘制。
三、中点画圆算法中点画圆算法(Midpoint Circle Drawing Algorithm)是另一种常用的像素画圆算法,它是由Jack E. Bresenham于1977年发展而来的。
画圆抗锯齿算法主要应用于计算机图形渲染过程中的抗锯齿技术。
锯齿现象是光栅化过程中由于像素精度不够导致的,为了解决这个问题,可以使用抗锯齿算法在绘制圆形时提高像素精度,使圆形边缘更加平滑。
常见的画圆抗锯齿算法有以下几种:
1. 超级采样抗锯齿(SSAA,Super-Sampling Anti-Aliasing):这种算法的原理很简单,就是直接放大屏幕分辨率。
比如屏幕分辨率为800x600,那么4xSSAA会将屏幕渲染到1600x1200的缓冲区上,然后在下采样到800x600。
SSAA可以得到非常好的抗锯齿效果,但计算量非常大,光栅化和片段着色器都是原来的4倍,渲染缓存的大小也是原来的4倍。
2. 几何抗锯齿(GAA,Geometry Anti-Aliasing):这种算法通过计算圆形边缘的像素点来提高锯齿抗性。
它通过估计圆形边缘上每个像素点的法线和视线,然后使用透视投影将其投影到圆形上,从而提高锯齿抗性。
3. 滤波抗锯齿(FAA,Filtering Anti-Aliasing):这种算法通过在圆形边缘的像素点之间进行插值来提高锯齿抗性。
它使用一种称为双线性插值的方法,在圆形边缘的像素点之间进行插值,从而实现锯齿抗性的提高。
4. 像素级抗锯齿(PAA,Pixel-Level Anti-Aliasing):这种算法通过在圆形边缘的像素点上增加额外的像素来提高锯齿抗性。
它使用一种称为超采样抗锯齿的方法,在圆形边缘的像素点上增加额外的像素,然后使用亚像素渲染技术将其显示出来,从而提高锯齿抗性。
一、实验背景圆是几何图形中最基本的图形之一,在计算机图形学中,绘制圆是图形处理的基础。
本实验旨在通过实现圆的绘制算法,加深对计算机图形学基本概念和方法的理解,提高编程能力。
二、实验目的1. 掌握圆的基本绘制方法;2. 熟悉Bresenham算法和中点算法的原理;3. 理解并实现圆的绘制算法;4. 分析不同算法的优缺点,提高算法选择能力。
三、实验内容1. Bresenham算法画圆2. 中点算法画圆四、实验原理1. Bresenham算法画圆Bresenham算法是一种光栅扫描算法,用于绘制圆、椭圆、直线等图形。
该算法的基本思想是:根据圆的几何特性,计算出每个像素点是否应该被绘制。
对于圆的绘制,我们可以利用以下公式:\[ x^2 + y^2 = r^2 \]其中,\( x \) 和 \( y \) 分别表示圆上一点的横纵坐标,\( r \) 表示圆的半径。
Bresenham算法的步骤如下:(1)初始化参数:设置起始点(0, r),终止点(r, 0),步长 \( p \);(2)计算判别式 \( p = 2x - y \);(3)根据判别式的值,更新 \( x \) 和 \( y \) 的值;(4)重复步骤(2)和(3),直到 \( x = y \);(5)绘制圆。
2. 中点算法画圆中点算法是一种基于Bresenham算法的改进算法,它利用圆的对称性,减少了计算量。
中点算法的步骤如下:(1)初始化参数:设置起始点(0, r),终止点(r, 0),步长 \( p \);(2)计算判别式 \( p = 1 - 2x \);(3)根据判别式的值,更新 \( x \) 和 \( y \) 的值;(4)重复步骤(2)和(3),直到 \( x = y \);(5)绘制圆。
五、实验步骤1. 创建一个OpenGL窗口,用于显示绘制的圆;2. 使用Bresenham算法绘制圆;3. 使用中点算法绘制圆;4. 比较两种算法的绘制效果,分析优缺点;5. 编写代码实现两种算法,并进行测试。
圆及圆弧生成算法圆及圆弧生成算法是计算机图形学中常用的算法之一,用于生成圆及圆弧的几何形状。
圆是一个闭合曲线,由一系列连续的点组成,其到中心点的距离都相等。
圆弧是圆的一部分,也是由一系列点组成的曲线。
下面将介绍几种常见的圆及圆弧生成算法。
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.画圆抗锯齿算法实现步骤4.画圆抗锯齿算法应用场景5.画圆抗锯齿算法优缺点分析6.总结正文:一、画圆抗锯齿算法简介画圆抗锯齿算法(Circle Antialiasing,简称CA)是一种针对图像边缘锯齿问题的处理方法。
在计算机图形学和数字绘画领域,抗锯齿技术是提高图像质量的重要手段。
画圆抗锯齿算法通过在图像边缘添加圆形边界,实现对锯齿的平滑处理,使得图像更加细腻、自然。
二、画圆抗锯齿算法原理画圆抗锯齿算法主要基于图像边缘的圆形边界进行锯齿处理。
其核心思想是在原始图像的边缘像素周围绘制一系列同心圆,并根据边缘像素与同心圆的距离,对图像边缘进行平滑处理。
通过这种方法,可以在一定程度上消除锯齿现象,提高图像质量。
三、画圆抗锯齿算法实现步骤1.确定图像边缘:首先,需要对输入图像进行边缘检测,以确定需要进行抗锯齿处理的边缘区域。
2.计算边缘像素与同心圆距离:根据边缘检测结果,计算边缘像素与同心圆的距离。
3.绘制圆形边界:根据计算得到的距离,在边缘像素周围绘制一系列同心圆。
4.平滑处理:根据同心圆的半径和边缘像素的权重,对图像边缘进行平滑处理。
5.融合圆形边界与原始图像:将平滑处理后的图像与原始图像进行融合,得到最终输出图像。
四、画圆抗锯齿算法应用场景画圆抗锯齿算法广泛应用于计算机图形学、数字绘画、游戏开发等领域。
通过使用画圆抗锯齿算法,可以有效提高图像质量,使图像更加细腻、自然,提升视觉效果。
五、画圆抗锯齿算法优缺点分析优点:1.算法简单,易于实现。
2.对锯齿消除效果较好,适用于多种图像场景。
缺点:1.计算量较大,对实时应用有一定局限性。
2.可能导致图像边缘失真,尤其在边缘复杂的情况下。
六、总结画圆抗锯齿算法是一种有效的图像抗锯齿方法,通过在图像边缘添加圆形边界实现锯齿消除。
虽然在实时应用方面存在局限性,但在一定程度上提高了图像质量。
3种画圆算法的优劣分析画圆是计算机图形学中的基本操作之一,常用于绘制图形、实现图形的填充和边界等。
为了实现画圆操作,人们提出了许多不同的圆算法。
本文将对三种常见的画圆算法进行优劣分析,包括中点圆算法、Bresenham圆算法和数值微分圆算法。
1.中点圆算法:中点圆算法是一种基本的画圆算法,它使用了圆的对称性质来减少计算量。
该算法的基本思想是从圆心开始逐渐向外扩展,每次判断一个点是否在圆上。
相比于其他算法,它的计算量相对较小,适用于处理小半径的圆。
优点如下:-算法简单易懂,实现简单,代码量少,计算效率较高。
-由于利用了圆的对称性,算法中的计算量较小,能够实现实时绘制。
-可以实现反锯齿效果。
然而,中点圆算法也存在一些不足之处:-由于该算法是基于对圆的对称性的判断,对于较大的圆,计算量会变大,绘制速度较慢。
-由于绘制的是离散像素,所以在绘制大半径圆时,圆的边缘可能会出现锯齿现象。
-在绘制一些不对称的图形时,需要进行额外的计算,而计算效率相对较低。
2. Bresenham圆算法:Bresenham圆算法是一种以Bresenham直线算法为基础的算法,它克服了中点圆算法的对称性引起的效率问题。
该算法的核心思想是利用差分思想求解圆上的点。
优点如下:-算法简单易懂,实现简单,代码量少。
-算法的计算量与圆的大小无关,适用于绘制任意半径的圆。
-能够减少计算量和内存开销,提高绘制速度。
然而,相较于中点圆算法,Bresenham圆算法也存在一些不足之处:-该算法对于像素大小的选择要求较高,需要将圆心和半径放置在像素上才能绘制出良好的效果。
-在绘制一些复杂的图形时,需要进行额外的计算,计算的复杂性相对较高。
-在绘制大半径圆时,圆的边缘可能会出现锯齿现象。
3.数值微分圆算法:数值微分圆算法是基于微分思想的一种算法,其核心思想是通过计算圆上两个相邻像素之间的差分来绘制圆。
优点如下:-该算法计算精确,绘制出的圆形较为平滑。
-在绘制一些不规则图形时,该算法具有较高的适应性和灵活性。
三种画圆算法的优劣分析学生姓名:杨晓瑜指导教师:张俊花摘要通过对Bresenham画圆法、正负画圆法、中点画圆法的算法分析,以及实现算法的程序运行速度和程序存储空间分析的比较。
对此3种算法进行综合的优劣分析。
关键词Bresenham 画圆法;正负画圆法;中点画圆法AbstractBy analysing the algorithms of Bresenham drawcirclc right-and-lose drawcircle and midpoint drawcircle,comparing their proceduze,run speeds and the small circle radiuses they display,the virtues and defects of the three algorithms are analysed synthetically.Key wordsBresenham drawcircle;right—and—lose drawcircle,o midpoint drawcircle1、引言图形通常是由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成.直线与曲线是组成图形的基本元素.其生成算法的优劣对整个图形系统的效率是至关重要的,因为在产生一幅图形的过程中要反复多次调用这些算法程序.曲线的生成算法可分为线生成和像素级(或称点)生成两类.所谓线生成就是以小的直线段来逼近和代替实际曲线而显示之;而点生成则是逐个像素地选择距离实际曲线最近的点而显示之.圆是一种基本的、常用的元素,其生成算法也有很多,围绕这些算法人们进行了讨论和探索,其核心无非是为了节省时间和空间。
本文仅以Bresenham画圆、正负画圆、中点画圆3种方法讨论圆的点生成算法,并对此3种算法进行优劣分析.2、3种圆的点生成算法2.1 Bresenham画圆法(1)只要画出圆上的1/8弧AB(设圆心在原点,A点是y轴正向与圆弧的交点,B点在第一限的圆弧上),根据圆的对称性,即可画出整个圆.(2)在AB弧上取任一点。
中国计量学院实验报告实验课程:计算机图形学实验名称:圆弧生成算法班级:学号:姓名:实验日期: 3.21 一.实验题目:实现三角函数逐点画圆,二次曲线函数逐点画圆,中点画圆,并比较、分析各个算法的精度和性能,给出自己的结论。
比较精度时,请列出各个算法得到的圆弧坐标的差别。
实验成绩:指导教师:二.算法说明这里画圆用了三种方法,共同点都是八分圆,不同之处就是算法不一样,下面我详细介绍一下:1、八分画圆,个人理解为有一个点通过X、Y轴和坐标轴对称形成八个独立的点,由此我们画圆只需要找出圆的八分之一内的连续点,就可以通过八分把点遍布到圆上,函数定义为:void Girclepoints(int x,int y);// 八分画圆2、中点画圆算法是画圆的方法之一,在一个方向上取单位间隔,在另一个方向的取值由两种可能值的中点离圆的远近而定,其函数定义为:void MindPoi ntCircle(int r);//中点画圆法3、三角函数画圆算法是画圆的方法之一,其是利用的是数学“math.h”函数库中sin()和cos()函数,利用连续的45度角内点的三角函数,形成圆,其函数定义为:void B ysinPointCircle(int r);//三角函数画圆法4、开方画圆算法也是画圆的方法之一,其利用的是X2+Y2=R2公式,再用数学函数库里sqrt()开平方函数实现,其函数定义:void EvolutionPointCircle( double r);//开方画圆法5、此函数是画图必修的函数,主要用于画图,函数定义为:void myDi splay(void);//画圆6、画圆流程图:三.测试结果四.分析与探讨1、画圆算法有很多,我们所学的只是常见算法;2、对于不同画圆的方法对于数据类型不一样,我们应该适当的选择画圆方法;3、我们要合理利用函数库,这样对于编程会方便很多,比如:数学函数库等。
五.附录:源代码-------------------------------------------------------------stdafx.h------------------------------------------------------------ #include"targetver.h"#include<stdlib.h>#include<stdio.h>#include<math.h>#include<glut.h>#define a 100#define b 160#define c 200#define PI 3.14void Girclepoints(int x,int y);// 八分画圆void MindPoi ntCircle(int r);//中点画圆法void B ysinPointCircle(int r);//三角函数画圆法void EvolutionPointCircle( double r);//开方画圆法void myDi splay(void);//画圆----------------------------------------------------------stdafx.cpp------------------------------------------------------------ #include"stdafx.h"void Girclepoints(int x,int y)/八分画圆{glBegin(GL_POINTS);//一系列独立的点glVertex2f(x,y);glVertex2f(x,-y);glVertex2f(-x,y);glVertex2f(-x,-y);glVertex2f(y,x);glVertex2f(y,-x);glVertex2f(-y,x);glVertex2f(-y,-x);glEnd();}void MindPoi ntCircle(int r)//中点画圆法{int x,y;float d;x=0;y=r;d=1.25-r;Girclepoints( x, y);while(x<=y){if(d<0)d+=2*x+3;else{d+=2*(x-y)+5;y--;}x++;Girclepoints( x, y);}}void B ysinPointCircle(int r)//三角函数画圆法{int x,y;float d;x=r;y=0;Girclepoints( x, y);for(d=0;d<(20*PI);d+=0.25){y=r*sin(d);x=r*cos(d);Girclepoints( x, y);}}void EvolutionPointCircle( double r)//开方画圆法{double x,y;double d;//r =200;x=r;y=0;glBegin(GL_POINTS);for(d=0.1;y<x;y+=d){x=sqrt((r*r)-(y*y));glVertex2f(x,y);glVertex2f(x,-y);glVertex2f(-x,y);glVertex2f(-x,-y);glVertex2f(y,x);glVertex2f(y,-x);glVertex2f(-y,x);glVertex2f(-y,-x);}glEnd();}void myDi splay(void){glClear(GL_COLOR_BUFFER_BIT); //清屏gluOrtho2D(-500,500,-500,500); //设置正投影ãvoid gluOrtho2D(GLdouble left,GLdoubleright,GLdouble bottom,GLdouble top)glPointSize(2); //定义像素点的大小MindPointCircle(a);//中点画-圆法¤glPointSize(4);// 定义像素点的大小BysinPointCircle(b);//三角函数画圆法glPointSize(6); //定义像素点的大小EvolutionPointCircle(c);//开方画圆法glEnd();glFlush();}-------------------------------------------------------------main.cpp----------------------------------------------------------- #include"stdafx.h"int main(int argc, char *argv[]){glutInit(&argc, argv); //固定格式glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWi ndowSize(500, 500); //示框的大小glutInitWi ndowPosition(400,200); //确定显示框左上角的位置glutCreateWindow("10计算机2 1000303234 张强");glutDisplayFunc(myDisplay);glutMainLoop();return 0;}。
画圆形(Bresenham算法)下⾯先简要介绍常⽤的画圆算法(Bresenham算法),然后再具体阐述笔者对该算法的改进。
⼀个圆,如果画出了圆上的某⼀点,那么可以利⽤对称性计算余下的七段圆弧:Plot(x,y),Plot(y,x),Plot(y,-x),Plot(x,-y),Plot(-x,-y),Plot(-y,-x),Plot(-y,x),Plot(-x,y)。
1、Bresenham 画圆算法。
Bresenham算法的主要思想是:以坐标原点(0,0)为圆⼼的圆可以通过0度到45°的弧计算得到,即x从0增加到半径,然后利⽤对称性计算余下的七段圆弧。
当x从0增加到时,y从R递减到。
设圆的半径为R,则圆的⽅程为:f(x,y)=(x+1)2+y2-R2=0 (1)假设当前列(x=xi列)中最接近圆弧的像素已经取为P(xi,yi),根据第⼆卦限1/8圆的⾛向,下⼀列(x=xi+1列)中最接近圆弧的像素只能在P的正右⽅点H(xi+1,yi)或右下⽅点L(xi+1,yi-1)中选择,如图1所⽰。
Bresenham画圆算法采⽤点T(x,y)到圆⼼的距离平⽅与半径平⽅之差D(T)作为选择标准,即D(T)=(x+1)2+y2-R2 (2)通过⽐较H、L两点各⾃对实圆弧上点的距离⼤⼩,即根据误差⼤⼩来选取,具有最⼩误差的点为绘制点。
根据公式(2)得:对H(xi+1,yi)点有:D(H)=(xi+1)2+yi2-R2;对L(xi+1,yi-1)点有:D(L)=(xi+1)2+(yi-1)2-R2;根据Bresenham画圆算法,则选择的标准是:如果|D(H)|<|D(L)|,那么下⼀点选取H(xi+1,yi);如果|D(H)|>|D(L)|,那么下⼀点选取L(xi+1,yi-1);如果|D(H)|=|D(L)|,那么下⼀点可以取L(xi+1,yi-1),也可以选取H(xi+1,yi),我们约定选取H(xi+1,yi)。
三种画圆算法的优劣分析学生姓名:杨晓瑜指导教师:张俊花摘要通过对Bresenham画圆法、正负画圆法、中点画圆法的算法分析,以及实现算法的程序运行速度和程序存储空间分析的比较。
对此3种算法进行综合的优劣分析。
关键词Bresenham 画圆法;正负画圆法;中点画圆法AbstractBy analysing the algorithms of Bresenham drawcirclc right-and-lose drawcircle and midpoint drawcircle,comparing their proceduze,run speeds and the small circle radiuses they display,the virtues and defects of the three algorithms are analysed synthetically.Key wordsBresenham drawcircle;right—and—lose drawcircle,o midpoint drawcircle1、引言图形通常是由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成.直线与曲线是组成图形的基本元素.其生成算法的优劣对整个图形系统的效率是至关重要的,因为在产生一幅图形的过程中要反复多次调用这些算法程序.曲线的生成算法可分为线生成和像素级(或称点)生成两类.所谓线生成就是以小的直线段来逼近和代替实际曲线而显示之;而点生成则是逐个像素地选择距离实际曲线最近的点而显示之.圆是一种基本的、常用的元素,其生成算法也有很多,围绕这些算法人们进行了讨论和探索,其核心无非是为了节省时间和空间。
本文仅以Bresenham画圆、正负画圆、中点画圆3种方法讨论圆的点生成算法,并对此3种算法进行优劣分析.2、3种圆的点生成算法2.1 Bresenham画圆法(1)只要画出圆上的1/8弧AB(设圆心在原点,A点是y轴正向与圆弧的交点,B点在第一限的圆弧上),根据圆的对称性,即可画出整个圆.(2)在AB弧上取任一点。
像素为p i-1=(x i-1,y i-1),按顺时针方向生成圆时,为了最佳逼近该圆,根据圆弧的走向,下一点像素的取法只有两种可能的选择:正右方像素和右下方像素,分别记为H i和L i,H i点特征:( X hi=x i,Y hi=y i-1),L i点特征:(X li=x i,Y Li=y i-1-1)(3)判断选择点由圆的方程标准形式(x-x c) ²+(y-y c) ² =R²可知,圆周上的实际位置的y值可由y²=R²-(x i-1+1)²=R²-x i²得到,这个y值和整数坐标值y i –1之间的关系,用下式d h和d l表示。
d h=y i-1²-y²=y i-1²-R²+x i²,d l=y²-(y i-1-1)²=R²-x i²-(y i-1-1)²d h和d l的差用一个参数d i来表示:d i=d h-d l=2 x i²+y i-1²+(y i-1-1)²-2R²。
故构造函数如下:D(p)=(x2+y2)-R2d i=D(H i)+D(L i)=(x hi2+y hi2-R2)+ (x li2+y li2-R2)如果d i为负,选择H i点;若d i=0,则选择H i或L i均可;否则,选择L i 点,再考虑H i与L i全在圆内的情况,实际是沿H i上方通过,则有d h<0,d l>0,且d i<0,故选择H i点,对H i与L i全在圆外情况,有d h>0,d l<0,且d i>0,故选择L i点。
各点坐标:P i-1(x i-1,y i-1) , H i(x i,y i-1), L i(x i,y i-1-1), H i+1(x i+1,y i),L i+1(x i+1,y i-1-1);起点坐标:A(x0,y0),其中x0=0,y0=R,x1=x0+1=1。
(4)构造d i与d i+1的关系,不断选择点,直到生成第一个8分圆。
d1=D(H1)+D(L1)=(x12+y02-R2)+[x12+(y0-1)2-R2]=1+1+R2-2R+1-R=3-2Rdi=D(H i)+D(L i)=(x i2+y i-12-R2)+[x i2+(y i-1-1)2-R2]= 2x i2+2y i-12-2y i-1-2R2+1d i+1=D(H i+1)+D(L i+1)= (x i+12+y i2-R2)+[x i+12+(y i-1)2-R2]=( 2x i2+2y i-12-2y i-1-2R2+1)+4x i-1+6,(d i<0,取H i,y i=y i-1),( 2x i2+2y i-12-2y i-1-2R2+1)+4(x i-1+y i-1)+10,(d i≥0,取L i,y i=yi-1-1)。
2.2正负画圆法(1)画出圆的1/4圆弧AB(第一象限,A点在Y轴上),利用对称性画出整个圆,在此仅考虑圆心在原点,半径为R的第一个4分圆。
(2)在AB上,设当前点像素为P(x p,y p),按顺时针方向生成圆弧式,为了最佳逼近圆弧,下一个像素只能是正右方的P1或正下方的P2两者之一,且P1(x p+1,y p),p2(x p,y p-1)。
如果当前点P在圆内,则下一点选择正右方的P1;否则,选择正下方的P 2.。
(3)为判别P1或P2,构造函数:F( x,y)=x2+y2-R2。
理论上F( x,y)=0(点在圆上)。
又知F(x ,y)>0,点(x,y)在圆外;F(x,y)<0,点( x,y)在圆内。
结合(2)、(3)且将等号合并有F( x,y)>0,下一点选P2,F( x,y)≤0,下一点选P1。
(4)确定再下一个像素.为减少计算量,构造F(x ,y)的递推公式:各点坐标:P(x i,y i),P1(x i+1,y i),P2(x i,y i-1),起点坐标:A(x1,y1)=A(0,R),x i+1=x i+1,F(x1,y1)=x12+y12-R2=0,F(x i,y i)=x i2+y i2-R2,F(x i-1,y i-1)=x i-12+y i-12-R2,若F(x i,y i) ≤0,x i+1=x i+1,y i+1=y i,故F(x i+1,y i+1)=(x i+1)2+y i2-R2=x i2+y i2-R2+2x i+1=F(x i,y i)+2x i+1,若F(x i,y i)>0时,x i+1=x i,y i+1=y i-1,故F(x i+1,y i+1)=x i2+(y i-1)2-R2=x i2+y i2-R2-2y i+1=F(x i,y i)-2y i+1,再判断F(x i+1,y i+1)的符号,就可以确定其后续选择点。
2.3中点画圆法(1)与Bresenham类似,只要画出圆上的1/8弧AB,根据圆的对称性画出整个圆.仍考虑圆心在原点,半径为的第一个8分圆.(2)在弧AB上设当前点像素为P( X p,Y p),按顺时针方向生成圆弧时,为了最佳逼近圆弧,下一个像素只能是正右方的P1,或右下方的P2两者之一。
如图1所示。
图1 中点画圆示意图(3)为判别P1或P2,构造函数F(X,Y)=X2+Y2-R2。
对于圆上的点,F(X,Y)=0;对于圆外的点F(X,Y)>0;而对于圆内的点,F(X,Y)<0。
假设M是P1和P2的中点,及M=(X p+1,Y p-0.5),那么,当F(M)<0时,M在圆内,这说明P1距离圆弧更近,应取P1作为下一个像素,而当F(M)>0时,P2离圆弧更近,应取P2,当F(M)=0时,在P1与P2之中随便取一个即可,我们约定取P2,即F(M)<0,应取P1,F(M)≧0,应取P2(4)为继续确定下一个像素,构造判别式:d=F(M)=F(X p+1,Y p-0.5)=(X p+1)2+(Y p-0.5)2-R2当d<0时,P1成为确定的当前像素,而且P1的下一个像素只能是A’或B’,如图1所示,判别式为:d=F(M1)=F(X p+2,Y p-0.5)=(X p+2)2+(Y p-0.5)2-R2=(X p+1)2+2(X p+1)+1+(Y p-0.5)2-R2=d+2X p+3,所以沿正方向,d的增量为2X p+3。
而当d≧0时,P2成为当前像素,而且P2的下一个像素只能是B’huoC’,如图1所示,其判别式为:d=F(M2)=F(X p+2,Y p-1.5)=(X p+2)2+(Y p-1.5)2-R2=(X p+1)2+2(X p+1)+1+(Y p-0.5)2-2(Y p-0.5)2+1-R2=d+2(X p- Y p)+5,所以沿着右下方向,d的增量为2(X p- Y p)+5。
3、3种算法的分析比较对于一个算法来说,其所用的空间和时间有时是两个对立的因素。
那么,空间和时间哪一个更重要呢?本文的观点是:对于图形学的基础算法来说,时间比空间更重要。
那么,如何比较图形学基础算法的速度呢?本文对算法速度比较的观点是:对图形学基础算法的比较应以分析算法的计算量为尺度。
该计算量应以算数运算及计算机操作的次数为单位。
Bresenham算法每生成一点的计算量为:循环语句的一次比较操作;d与0的一次比较操作;更新d值的一次移位操作和2次加法及每当y减1时增加的一次减法.这个减法在8分圆中共出现R-R/2次,而8分圆共有R/2个点,因此平均到每点的减法为2-1,约0.4次,则每生成一点的平均计算量为:2次比较,1次移位,2次加法及0.4次减法,共5.4次整数运算(不包含移动坐标值的加1及减1运算)。
同样地,分析正负画圆及中点画圆法后,可列表比较,见表1。
分析表1可知:中点画圆算法速度最快.为了进一步进行比较,编程分别用这3种算法对圆心在(70,70),半径为50的圆画30 000次,使用的是同一环境(P4 2.0),运行结果是:Bresenham算法用了8.001秒,正负法算法用了11.00秒,中点算法用了7.02秒圆生成算法(中点画圆、Bresenham画圆)#include <graphics.h>#include <math.h>void MidPointCircle(int r, int color);void CirclePoints(int x,int y,int color);void BresenhamCircle(int xc,int yc,int r,int color);void plot_cicle_point(int xc,int yc,int x,int y,int color);main(){int gdriver=DETECT,gmode;initgraph(&gdriver,&gmode," ");cleardevice();setbkcolor(2);MidPointCircle(100,4);getch();cleardevice();BresenhamCircle(100,100,50,5);getch();closegraph();}void MidPointCircle(int r,int color) {int x,y;float d;x=0;y=r;d=1.25-r;CirclePoints(x,y,color);while(x<=y){if(d<0)d+=2*x+3;else{d+=2*(x-y)+5;y--;}x++;CirclePoints(x,y,color);}}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);}void plot_circle_point(int xc,int yc,int x,int y,int 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);}void BresenhamCircle(int xc,int yc,int r,int color) {int x,y,d;x=0;y=r;d=3-2*r;while(x<y){plot_circle_point(xc,yc,x,y,color);if(d<0)d=d+4*x+6;else{d=d+4*(x-y)+10;y--;}x++;}if(x==y)plot_circle_point(xc,yc,x,y,color);}表1 三种算法每生成一点所需的计算量的比较Tab1 Compare of three algorithmic in which drawing one point通过实际的程序运行比较分析,结论是中点画圆法速度最快.就算法本身而言,该算法仍可在某些方面进行改进,如将其中的浮点运算改为整数运算等,执行速度将更快.生成直线和圆这类基础算法在编程时要被无数次的调用,可能每生成一帧画面就要被调用成百上千次,因此其执行速度是至关重要的.而这类基础算法的长度都很短,即使多用一些分支,多用一些变量和语句,一般来说只不过增加几十个语句.这样的空间增加与算法极重要的速度要求来比较是相对次要的因素,因此在开发图形学的基础算法时,如果有可能提高算法的速度,应不惜多占一些存储空间.参考文献【1】孙家广,计算机图形学[M]第三版,北京:清华大学出版社,1999。