【寒江雪】中点画椭圆算法

中点画椭圆算法与中点画圆算法非常类似

但是其中有区别的地方就是,椭圆不是八对称的。不能像圆那样扫描八分之一就可以绘制出整个圆。所以,必须要考虑在扫描四分之一椭圆的过程中,遇到斜率为-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时绘制完毕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值