圆的生成算法_中点画圆算法
考虑圆的对称性,可以有效的减少计算量,圆的形状在 每个象限中是相似的,因此瑞如果我们确定了再第一象限中圆的位置 ,就可以生成圆在xy平面中其他象限的部分,如下图

我们仅需要计算的是从x=0到x=y分段内的点就可以得到整个圆的所有像素位置
使用圆的参数方程和极坐标方式求解,仍然需要大量的计算时间,根据有效的画圆算法是如同bresenham画线算法一样以决策函数的增量计算为基础
为简单期间设原点坐标为坐标轴的中心点坐标
考虑绘制圆的方向为顺时针方向
如同光栅画线算法,我们在每个步中以单位间隔取样并确定离指定圆最近的像素位置,对于给定半径r,圆弧度为从x=0到x=y,曲线的斜率从0变化为-1,因此可以在该八分圆的正x方向去单位步长,使用决策函数来决定每一步中的两个可能得y值,那个更接近圆的位置
⎩⎨⎧fcirc=x2+y2−r2<0在圆边界内fcirc=x2+y2−r2=0在圆边界上fcirc=x2+y2−r2>0在圆边界外
假设刚在xk,yk上绘制了一个像素,下一个像素的位置则为xk+1,yk或者xk+1,yk−1, 看那个更接近圆, 也就是距离xk+1,yk−21那个更近
pk=fcircxk+1,yk−21=xk+12+yk−212−r2
设定pk<0, 中点在圆内,yk接近圆边界,否则yk−1接近圆边界

pk+1=xk+1+12+yk+1−212−r2
pk+1=xk+22+yk+1−212−r2
pk+1=xk2+2xk+4+yk+1−212−r2
pk+1−pk=xk2+4xk+4+yk+1−212−r2−xk+12+yk−212−r2
pk+1−pk=xk2+4xk+4+yk+1−212−r2−xk2+2xk+1+yk−212−r2
pk+1−pk=xk2+4xk+4+yk+1−212−r2−xk2−2xk−1−yk−212+r2
pk+1−pk=3+2xk+yk+1−212−yk−212
pk+1−pk=3+2xk+yk+12−yk+1+41−yk2−yk+41
pk+1−pk=3+2xk+yk+12−yk+1+41−yk2+yk−41
pk+1−pk=3+2xk+yk+12−yk+1−yk2+yk
pk+1−pk=3+2xk+yk+12−yk2−yk+1−yk
pk+1=pk+3+2xk+yk+12−yk2−yk+1−yk
pk+1=pk+1+2xk+1+yk+12−yk2−yk+1−yk
其中yk+1是yk还是yk−1取决去pk的符号
生成算法如下:
- 求初始误差, 将0,r坐标带入p0=1+r−212−r2=45−r
- 求下一个光栅点xk+1=xk+1
如果pk<0, 则yk+1=yk
否则选择为yk+1=yk−1 - 绘制xk+1,yk+1,
- 计算差值Pk+1=Pk+1+2xk+1+yk+12−yk2−yk+1−yk,
若pk<0 则Pk+1=pi+3+2xk
否则Pk+1=pi+1+2xk−yk - 如果x >= y 则终止循环否则执行2,3,4
代码实现
请参考中点画圆算法