中点椭圆算法

椭圆与圆不同,不能八分只能四分。中点椭圆算法将分成两部分应用于第一象限。在斜率绝对值小于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 }
时间: 2024-10-07 10:18:57

中点椭圆算法的相关文章

图形学_椭圆扫描转换_中点椭圆算法

中点椭圆算法 (1)先讨论椭圆弧的上部分 设(Xp,Yp)已确定,则下一待选像素的中点是(Xp+1,Yp-0.5) d1=F(Xp+1,Yp-0.5)= b2(Xp+1)2+a2(Yp-0.5)2-a2b2 根据d1的符号来决定下一像素是取正右方的那个,还是右上方的那个. 若d1<0,中点在椭圆内,取正右方象素,判别式更新为: d1'=F(Xp+2,Yp-0.5)=d1+b2(2Xp+3) d1的增量为b2(2Xp+3) 当d1≥0,中点在椭圆外,取右下方象素,更新判别式: d1'=F(Xp+2

计算机图形学(二)输出图元_6_OpenGL曲线函数_4_中点椭圆算法(上)

中点椭圆算法(上) 这里的方法类似于显示光栅圆.给定参数rx,ry和(xc,yc),首先确定以原点为中心的标准位置椭圆上的点(x,y),然后将这些点平移到以(xc,yc)为中心的椭圆上.如果希望显示不在标准位置的椭圆,那么就绕中心坐标旋转并对长轴和短轴重新定向.但目前仅考虑显示标准位置的椭圆,第4章将讨论变换对象方向和位置的通用方法. 中点椭圆算法将分成两部分应用于第一象限.图3.25给出了依据rx<ry的椭圆斜率对第一象限进行的划分.并通过在斜率绝对值小于1的区域内在x方向取单位步长,以及在斜

计算机图形学 – 椭圆的中点生成算法

算法描述: 对于一般位置的椭圆, 例如, 可将中心平移到坐标原点, 确定好中心在原点的标准位置的椭圆像素点集后,再平移到位置,将问题转变为标准位置的椭圆的绘制问题. 如果椭圆的长轴和短轴方向不与坐标轴x 和y 平行,那么可以采用旋转坐标变换的方式, 同样将问题转变为标准位置的椭圆的绘制 即. 定义下面椭圆中点算法的判别式: 则: 若< 0,说明在椭圆边界内: 若= 0,说明在椭圆边界上: 若> 0,说明在椭圆边界外: 由于椭圆的对称性, 这里只讨论第一象限椭圆弧的生成. 在处理这段椭圆弧时,

《图形学》实验七:中点Bresenham算法画椭圆

开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画椭圆. 实验结果: 代码: 1 #include <gl/glut.h> 2 3 #define WIDTH 500 4 #define HEIGHT 500 5 #define OFFSET 15 //偏移量,偏移到原点 6 #define A 6 7 #define B 5 8 9 void Init() //其它初始化 10 { 11 glClearColor(1.0f,1.0f,1.0f,1.0f);

计算机图形学 - 圆的中点生成算法验证

算法描述: 圆的中点生成算法 如果我们构造函数 F(x,y)=x2+y2-R2,则对于圆上的点有F(x,y)=0,对于圆外的点有F(x,y)>0,对于圆内的点F(x,y)<0 . 与中点画线法一样,构造判别式: d=F(M)=F(xp+1,yp-0.5)=(xp+1)2+(yp-0.5)2-R2 若d<0,则应取P1为下一像素,而且再下一像素的判别式为: d=F(xp+2,yp-0.5)=(xp+2)2+(yp-0.5)2-R2=d+2xp+3 若d≥0,则应取P2为下一像素,而且下一像

中点Bresenham算法光栅化画直线(个人总结精简版)代码超短!速度极快!

中点Bresenham算法光栅化画直线,每次只位移一个像素,精度高!此源码借助直线 y=x 做了一些转换,简化了主位移的处理,每次移动只需要 加减操作, 不需要乘除!速度极快!! 原理在最后,下面先贴上核心代码~ void Bresenham_LineTo(CDC *pDC, int x1, int y1, int x2, int y2) //中点Bresenham算法光栅化画直线 { float k = 1.0*(y2 - y1) / (x2 - x1); //斜率 int flag = 0;

计算机图形学 - 全斜率直线中点生成算法

算法描述: 直线中点生成算法 假定直线斜率k在(0,1]之间,当前像素点为,则下一个像素点有两种可选择点P1或P2. 若P1与 P2的中点称为M,Q为理想直线与x=xp+1垂线的交点. • 当M在Q的下方时,则取P2为下一个像素点: • 当M在Q的上方时,则取P1为下一个像素点. 这就是中点画线法的基本原理. 算术推导: 详细代码:Computer Graphics - code_1 生成结果:

「图形学」直线扫描——Bresenham算法改进了中点Bresenham算法?

前言 博主目前在学习<计算机图形学基础>这本书,使用的是第二版. 此书第五章开始讲解基本图形生成算法. 在5.1.3 Bresenham算法中,如是写到: 虽然中点Bresenham算法是一种效率非常高的算法,但也还有改进的余地. 而后,开始介绍Bresenham算法. 思考 然而通过学习和理解,博主发现这两种算法的原理完全相同: 每次在最大位移方向上走一步,而另一个方向上走步还是不走步取决于误差项的判别. 于是博主产生了疑问: Bresenham算法真的改进了中点Bresenham算法吗?

计算机图形学 - 抛物线的中点生成算法

算法描述: 对于抛物线,先分析一种最为特殊的情况,就是对称轴为y轴,且经过坐标原点.如图所示: 只要生成了这样一个抛物线,那么一般情况下的抛物线都可以凭借这种特殊情况进行平移.旋转得到.而由于该特殊情况下的抛物线在y轴两侧是对称的,所以只需要解决第一象限内的抛物线的生成就能够得到完整的图像. 那么如何得到这种特殊情况下的抛物线 由上图可知,假设一点在抛物线第一象限上从原点开始移动,并过该点A作抛物线的切线,那么根据切线的斜率k=1可以将该象限内的抛物线分为两个部分,一部分为点A左边,切线斜率全部