- 计算机图形学:原理、算法及实践
- 李晓武
- 1100字
- 2021-03-28 09:07:42
3.3 椭圆的扫描转换
中点画圆法可以推广到一般二次曲线的扫描转换,例如椭圆的扫描转换。图3.3-1所示通过坐标原点的椭圆方程为
![](https://epubservercos.yuewen.com/BFC8F2/12023547903396406/epubprivate/OEBPS/Images/Figure-P65_17335.jpg?sign=1739084409-hSh1RFlOwMufjMiYXJM0jFkHpKoSLwhE-0-f11802da2df391a6004ba2eb3175c76a)
![](https://epubservercos.yuewen.com/BFC8F2/12023547903396406/epubprivate/OEBPS/Images/Figure-P66_7949.jpg?sign=1739084409-VlBWt5uejOrvqhBoUJFp91LFJX4WZn3l-0-e4c5d958c5ec9a9d657c16cb1a011f1e)
图3.3-1 椭圆
其中a为沿x轴方向的长半轴长度,b为沿y轴方向的短半轴长度。由于椭圆具有对称性,因此只需讨论第一象限部分的椭圆的生成,其他三部分通过对称实现。在处理这段椭圆弧时,需要从弧上斜率为-1(即法向矢量为1)的点进一步把它分为上下两部分,如图3.3-2所示,法向量N>1,即点在上一部分时,在x方向进行单位增量;法向量N<1,即点在下一部分时,在y方向进行单位增量。
![](https://epubservercos.yuewen.com/BFC8F2/12023547903396406/epubprivate/OEBPS/Images/Figure-P66_7952.jpg?sign=1739084409-VJaE9Tyb9XBfo72VQYPYxIc7uqHhMM2t-0-83b5744793bfbafb33091c7ac2528cd0)
图3.3-2 椭圆法向量N=1
与中点画圆算法类似,首先在做选择的两个像素的中点处构造判别式,并根据判别式的正负来确定最佳逼近像素,然后,再构造下一个判别式。
假设当前最佳像素逼近点为(xi,yi),在x方向进行单位增量,构造中点为(xi+1,yi-0.5),则判别式为
![](https://epubservercos.yuewen.com/BFC8F2/12023547903396406/epubprivate/OEBPS/Images/Figure-P66_17347.jpg?sign=1739084409-auLRBuuLrTRTOgUesC21rNSYVxbHoef9-0-f4f71a7e5fe43831e8a6cecf1aa28522)
若d<0,构造的中点在椭圆内,则下一个最佳像素点为(xi+1,yi)。再构造下一个中点为(xi+2,yi-0.5),则判别式为
![](https://epubservercos.yuewen.com/BFC8F2/12023547903396406/epubprivate/OEBPS/Images/Figure-P66_7962.jpg?sign=1739084409-QFG0UdJEw2nYKwvX3Y4aIpzm7qfl1Gpp-0-6fc8ae13d2866aa00690f909fa488982)
即增量为b2(2xi+3)。
若d≥0,构造的中点在椭圆外,则下一个最佳像素点为(xi+1,yi-1)。再构造下一个中点为(xi+2,yi-1.5),则判别式为
![](https://epubservercos.yuewen.com/BFC8F2/12023547903396406/epubprivate/OEBPS/Images/Figure-P66_17349.jpg?sign=1739084409-TszM7tCCEoVWFxaE11LAVB56TK6XSu5R-0-2a1b6a94d8ac3ac54094b6e72f4df6c9)
即增量为b2(2xi+3)+a2(-2yi+2)。
从起点(0,b)处开始构造初始中点(1,b-0.5),对应的初始判别式为
![](https://epubservercos.yuewen.com/BFC8F2/12023547903396406/epubprivate/OEBPS/Images/Figure-P66_17356.jpg?sign=1739084409-XJNGSYLTALEh1MHyf7sPJFLDK1KB3d77-0-b0863241d1c92d26a0ae47f9540f6397)
上述迭代是法向量N≥1时的算法。当N<1时,在y方向单位增量。根据微分知识,椭圆上点(x,y)处的法向量N为
![](https://epubservercos.yuewen.com/BFC8F2/12023547903396406/epubprivate/OEBPS/Images/Figure-P66_17350.jpg?sign=1739084409-fPsYS4zSzy4V870JmT88LQvgsQ4SSffE-0-3b81e834db1fbf771bd4b617e39c8ed5)
其中i和j分别为该点在x方向和y方向的单位向量。当N≥1时,法向量y分量较大;N<1时,法向量x分量较大。因此N≥1时,即为2b2x≤2a2y⇒b2x≤a2y,由于构造的中点和椭圆上的点非常接近,可以认为构造的中点(xi+1,yi-0.5)也满足
![](https://epubservercos.yuewen.com/BFC8F2/12023547903396406/epubprivate/OEBPS/Images/Figure-P66_17352.jpg?sign=1739084409-SuDr3w7cpmm20FMKtoakOkve6FFiu62q-0-bc03f44cf5fa51b7f9bb146e10cbca8e)
在构造下一个中点时,如果上面的不等式不再成立,则说明这时椭圆上点的法向量N<1,这时开始在y方向单位增量。
与在x方向的单位增量计算迭代类似,构造N<1时的中点和判别式。假设当前最佳像素逼近点为(xi,yi),在y方向单位增量,构造中点为(xi+0.5,yi-1),则判别式为
![](https://epubservercos.yuewen.com/BFC8F2/12023547903396406/epubprivate/OEBPS/Images/Figure-P67_7978.jpg?sign=1739084409-v0jAr0hgd7JtPFo0MVZQ6o1mVQferUVY-0-7de4936f460cf7d2d82dd8637ea8a632)
若d<0,构造的中点在椭圆内,下一个最佳像素点为(xi+1,yi-1)。再构造下一个中点为(xi+1.5,yi-2),则判别式为
![](https://epubservercos.yuewen.com/BFC8F2/12023547903396406/epubprivate/OEBPS/Images/Figure-P67_17358.jpg?sign=1739084409-Tq5zwYJotCbSP53cTX1glkdvySUTkahL-0-380c0c8752a1dd89d851641bd8a7bbe8)
即增量为b2(2xi+2)+a2(-2yi+3)。
若d≥0,构造的中点在椭圆外,下一个最佳像素点为(xi,yi-1)。再构造下一个中点为(xi+0.5,yi-2),则判别式为
![](https://epubservercos.yuewen.com/BFC8F2/12023547903396406/epubprivate/OEBPS/Images/Figure-P67_17359.jpg?sign=1739084409-wk37FupB1FxS26jVSmEfKxmyvoKqdY9E-0-87df7cb99146a8d9e1d465d58281507d)
即增量为a2(-2yi+3)。
当yi=0时,迭代终止。
上述的椭圆中点算法函数代码参考如下:
![](https://epubservercos.yuewen.com/BFC8F2/12023547903396406/epubprivate/OEBPS/Images/Figure-P67_17360.jpg?sign=1739084409-6qC4qSoi84s25VYt5SprD6QzdQWUance-0-172ccdf8684cb48662111907bfeb8c90)
在应用程序中生成椭圆时,可建立如下的椭圆类:
![](https://epubservercos.yuewen.com/BFC8F2/12023547903396406/epubprivate/OEBPS/Images/Figure-P68_17366.jpg?sign=1739084409-Q1LvUvx6xYR27F4IMlbNVb0gUWKnS9O3-0-8437ef2feda41616b73939d856c4b0fe)
在视图窗口类建立椭圆的集合:CArray<CEllipse,CEllipse>m_ellipse_array;,通过窗口拾取椭圆的中心点和设计两个半轴的长度,或者直接通过对话框输入对应值,生成的椭圆如图3.3-3所示。椭圆生成程序的流程和代码可参考3.1节“直线的扫描转换”中的相关内容实现。
![](https://epubservercos.yuewen.com/BFC8F2/12023547903396406/epubprivate/OEBPS/Images/Figure-P68_8045.jpg?sign=1739084409-K6Q62BmxYnXmf2JWhSfAn0aqw2ljxgu4-0-31ce5861e509ffcc99352364a311dcec)
图3.3-3 椭圆的生成