中点画椭圆算法与中点画圆算法非常类似
但是其中有区别的地方就是,椭圆不是八对称的。不能像圆那样扫描八分之一就可以绘制出整个圆。所以,必须要考虑在扫描四分之一椭圆的过程中,遇到斜率为-1的切线。
如下图
因此要绘制椭圆,就要把椭圆分成上部区域和下部区域
先考虑椭圆的曲线方程
x^2/a^2+y^2/b^2=1
记F(x,y)=b^2*x^2+a^2*y^2-a^2*b^2=0
对于椭圆上某点的切线法向量N如下
也就是说,
某点在x方向上的增量速度为2*b^2*x
某点在y方向上的增量速度为2*a^2*y
如果某点(x,y)有2*b^2*x>2*a^2*y时,表明x的增加速度大于y的增加速度。
在绘制椭圆的时候,上图橘黄色部分是以x为基准进行扫描,直到y的增量速度大于x的增量速度为止,换y为基准扫描,直到y=0为止。
接下来跟圆做同样的推导
从点(0,b)开始绘制
假设某点(xi,yi)为当前要绘制的点
则下一点可能要绘制(xi+1,yi)或(xi+1,yi-1),这取决于这两点的中点是在椭圆内还是椭圆外
因此可以得出如下判别式
di=F(xi+1,yi-0.5)=b^2*(xi+1)^2+a^2*(yi-0.5)^2-a^2*b^2;
当di<0时,下一点取(xi+1,yi)
当di>=0时,下一点取(xi+1,yi-1)
d(i+1)=F(x(i+1),y(i+1))=di+b^2*(2*xi+3) (di<0)
d(i+1)=F(x(i+1),y(i+1))=di+b^2*(2*xi+3)+a^2*(2-2*yi) (di>=0)
一开始d0=F(1,b-0.5)=b^2+a^2*(0.25-b)
以上是画椭圆四分之一的上半部分(上图的橘色部分)
假设画完上半部分后,新的起点为(xi,yi)
新的判别式
di=F(xi+0.5,yi-1)
当di<0时,下一点取(xi+1,yi-1)
当di>=0时,下一点取(xi,yi-1)
d(i+1)=F(x(i+1),y(i+1))=di+b^2*(2*xi+2)+a^2*(3-2*yi) (di<0)
d(i+1)=F(x(i+1),y(i+1))=di+a^2*(3-2*yi) (di>=0)
当y<0时绘制完毕