资源预览内容
第1页 / 共19页
第2页 / 共19页
第3页 / 共19页
第4页 / 共19页
第5页 / 共19页
第6页 / 共19页
第7页 / 共19页
第8页 / 共19页
第9页 / 共19页
第10页 / 共19页
亲,该文档总共19页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Date4.3.1圆弧的生成1. 数值微分法(DDA法)2. 中点画圆算法3. Bresenham画圆算法4. 正负法Date与直线的生成类似,圆的生成算法的好 坏将直接影响到绘图的效率。本节仅讨 论圆心位于坐标原点的圆弧生成算法, 对于圆心为任意的圆弧,可以先将其平 移到原点,然后光栅化,再平移到原来 的位置。Date圆弧的DDA算法和直线段DDA法类似,也是根据圆 弧的微分方程来实现的,我们以圆心在坐标系原点, 半径为R的一段圆弧为例来讨论。圆心在原点(0,0),半径为R的方程为:1、数值微分法(DDA法)它的微分方程为:Date若令即可得离散变量微分方程式为:式中: 为一很小的常数。若设为用DDA法顺时针画第一象限的圆弧在X,Y方向的增量值,由上 式可知,则有:(4-1)Date用矩阵表示为:(4-2)但是,由式(4-1)得:所以式(4-1)表示的并不是一个圆,而是一个 半径逐渐增大的螺旋线。要得到圆的方程, 需要使式(4-2)中系数矩阵行列式值为1.即将式 (4-2)中的Date变为1。若取即能满足要求。即有:Date也即:(4-3)由(4-3)可知,在计算时我们不用的结果,而是直接引用的值。Date2、中点画圆算法假设x坐标为 的各像素点中,与该圆弧最近者已确定, 为 ,那么,下一个与圆弧最近的像素只能 是正右方的 ,或右下方的 两者之一。令M为 和 的中点,易知M的坐标为。显然,若M在圆内,则 离圆弧 近,应取为下一个像素;否则应取 。Date判别式d:d的初始值为:在d0的情况下,取右下方像素 ,在d0的情况下,取正右方像素 , 为了消除在计算判别式初始值产生的浮点数运算,将用 4d来代替d。Date下述程序使用中点画圆算法绘制一个1/8圆弧。 void MidPointCircle(int r,int color) int x,y,dx=0;y=r;d=5-4r;CirclePoint(x,y,color);while(x=y)if(d=0) d+=8x+12;else d+=8(x-y)+20;y-; x+;CirclePoint(x,y,color); Date3. Bresenham画圆算法 Bresenham画圆算法是最有效的算法之一 。 Bresenham画圆算法的基本原理是如下图 所示,若 为已经选定的点,那么 下一个可能的像素点为其正右方的点 或右下方 的点 。若 到圆弧的距离小于 到圆弧的距离 ,则取 ,反之取 。Date设R为圆弧的半径,记P(x,y)到原点的距离的平方 与圆的半径的平方之差为D(P),即令则下面给出 的递推公式。Date当 0时,点 做为下一个像素点 ,故当 0时,点 做为下一个像素点 ,故 Date根据算法,可得Bresenham生成圆弧的程序如下: void bresenham_arc(int R,int color) int x,y,d;x=0;y=R;d=3-2*R;while(xy)putpixel(x,y,color);if(d0)d+=4*x+6;elsed+=4*(x-y)+10;y-=1;x+;if(x=y) putpixel(x,y,color); Date4. 生成圆弧的正负法原理:设圆的方程为 ; 假设求得 的坐标为 ; 则当 在圆内时,有 ; 当 在圆外时,有 ;Date即求得Pi点后选择下一个象素点Pi+1的规则为:当 时,点落在圆弧上。当 时,要右走一步,得 ,这是向圆外 方向走去, 的坐标为:代入到圆的方程可得: (4-4)Date当 时,要向下走一步 ,这是向圆内 方向走去, 的坐标为:代入圆的方程可得:(4-5)公式(4-4)和(4-5)就是计算 的递推公式。当判 别函数确定后,就可用正负法绘制圆弧。首先规定先 向右走一步。DateThank you !Date
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号