码迷,mamicode.com
首页 > 编程语言 > 详细

中点椭圆算法

时间:2016-05-29 19:44:42      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:

    椭圆与圆不同,不能八分只能四分。中点椭圆算法将分成两部分应用于第一象限。在斜率绝对值小于1的区域内在x方向取单位步长,在斜率绝对值大于1的区域内在y方向取单位步长。

    技术分享

技术分享,可定义椭圆函数为

    技术分享

技术分享即决策参数。

技术分享开始,在技术分享方向取单位步长直到区域1和区域2的界限处,然后转还为技术分享方向的单位步长,再覆盖第一象限中剩余的曲线段。不过,每一步都要检测曲线斜率值。

斜率方程:

    技术分享

在区域1和区域2的交界区,技术分享,且

    技术分享

因此,移除区域1的条件是

    技术分享

和中点画圆算法一样,通过该中点对决策函数求值来确定沿椭圆轨迹的下一个位置:

 技术分享

技术分享

在下一个取样位置技术分享,区域1的决策参数可求值为

      技术分享

    技术分享

其中,技术分享根据技术分享的符号取值为技术分享技术分享

如果技术分享,递增增量为技术分享;如果技术分享,递增增量为技术分享

在区域2中,在负方向以单位步长取样。

技术分享

    技术分享

在下一个位置技术分享对椭圆函数求值:

    技术分享

    技术分享

其中,技术分享的设置根据技术分享的符号可取值为技术分享技术分享

算法过程:

1.输入技术分享技术分享和椭圆中心技术分享,并得到椭圆上的第一个点:

    技术分享

2.计算区域1中决策参数的初始值:

    技术分享

3.在区域1中的每个技术分享位置,从技术分享开始,假如技术分享,沿中心在技术分享的椭圆的下一个点为技术分享,并且

    技术分享

否则,沿椭圆的下一个点为技术分享,并且

    技术分享

其中

    技术分享

并且直到技术分享

4.使用区域1中计算的最后点技术分享来计算区域2中参数的初始值:

    技术分享

5.在区域2的每个技术分享位置处,从技术分享开始,假如技术分享,沿中心为技术分享的椭圆的下一个点为技术分享,并且

    技术分享

否则,沿椭圆的下一个点技术分享,并且

    技术分享

使用与区域1中相同的技术分享技术分享增量进行计算,直到技术分享

6.确定其他三个象限中的对称点。

7.将计算出的每个像素位置技术分享移动到中心在技术分享的椭圆轨迹上,并按坐标值绘制点:

    技术分享

 1 inline int Round(const float a) { return static_cast<int>(a + 0.5); }
 2 
 3 void setPixel(GLint xCoord, GLint yCoord)
 4 {
 5     glBegin(GL_POINTS);
 6     glVertex2i(xCoord, yCoord);
 7     glEnd();
 8 }
 9 
10 void ellipsePlotPoints(int xCenter, int yCenter, int x, int y)
11 {
12     setPixel(xCenter + x, yCenter + y);
13     setPixel(xCenter - x, yCenter + y);
14     setPixel(xCenter + x, yCenter - y);
15     setPixel(xCenter - x, yCenter - y);
16 }
17 
18 void ellipseMidpoint(int xCenter, int yCenter, int Rx, int Ry)
19 {
20     int Rx2 = Rx * Rx;
21     int Ry2 = Ry * Ry;
22     int twoRx2 = 2 * Rx2;
23     int twoRy2 = 2 * Ry2;
24     int p;
25     int x = 0;
26     int y = Ry;
27     int px = 0;
28     int py = twoRx2 * y;
29     // Plot the initial point in each quadrant
30     ellipsePlotPoints(xCenter, yCenter, x, y);
31     /* Region 1 */
32     p = Round(Ry2 - (Rx2 * Ry) + (0.25 * Rx2));
33     while (px < py) {
34         x++;
35         px += twoRy2;
36         if (p < 0) {
37             p += Ry2 + px;
38         }
39         else {
40             y--;
41             py -= twoRx2;
42             p += Ry2 + px - py;
43         }
44         ellipsePlotPoints(xCenter, yCenter, x, y);
45     }
46     /* Region 2 */
47     p = Round(Ry2 * (x + 0.5) * (x + 0.5) + Rx2 * (y - 1) * (y - 1) - Rx2 * Ry2);
48     while (y > 0) {
49         y--;
50         py -= twoRx2;
51         if (p > 0) {
52             p += Rx2 - py;
53         }
54         else {
55             x++;
56             px += twoRx2;
57             p += Rx2 - py + px;
58         }
59         ellipsePlotPoints(xCenter, yCenter, x, y);
60     }
61 }

 

中点椭圆算法

标签:

原文地址:http://www.cnblogs.com/clairvoyant/p/5540023.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!