中点椭圆算法

17 Mar 2025 | 4 分钟阅读

这是一种扫描转换椭圆的增量方法,该椭圆以标准位置的原点为中心,即主轴和副轴与坐标系轴平行。 它与中点圆算法非常相似。 由于四向对称性,我们需要考虑第一象限的整个椭圆曲线。

让我们首先重写椭圆方程,并定义函数 f,该函数可用于确定两个候选像素之间的中点是在椭圆内部还是外部

Midpoint Ellipse Algorithm
Midpoint Ellipse Algorithm

现在将椭圆曲线从 (0, b) 分成两部分,到 (a, 0) 在点 Q,其中曲线的斜率为 -1。

曲线的斜率由 f(x, y) = 0 定义为中点椭圆算法,其中 fx & fy 是 f(x, y) 相对于 x & y 的偏导数。

我们有 fx = 2b2 x, fy=2a2 y & 中点椭圆算法 因此,我们可以在扫描转换过程中监视斜率值以检测 Q。我们的起始点是 (0, b)

假设进入步骤 i 时,最后一个扫描转换像素的坐标是 (xi,yi)。 我们将选择 T (xi+1),yi) 或 S (xi+1,yi-1) 作为下一个像素。 T & S 的中点用于定义以下决策参数。

pi = f(xi+1),yi-中点椭圆算法)
pi=b2 (xi+1)2+a2 (yi-中点椭圆算法)2-a2 b2

如果 pi<0,中点在曲线内部,我们选择像素 T。

如果 pi>0,中点在曲线外部或曲线上,我们选择像素 S。

下一步的决策参数是

pi+1=f(xi+1+1,yi+1-中点椭圆算法)
          = b2 (xi+1+1)2+a2 (yi+1-中点椭圆算法)2-a2 b2

由于 xi+1=xi+1,我们有
          pi+1-pi=b2[((xi+1+1)2+a2 (yi+1-中点椭圆算法)2-(yi -中点椭圆算法)2]
          pi+1= pi+2b2 xi+1+b2+a2 [(yi+1-中点椭圆算法)2-(yi -中点椭圆算法)2]

如果选择了像素 T (pi<0),我们有 yi+1=yi。

如果选择了像素 S (pi>0),我们有 yi+1=yi-1。 因此我们可以表达

          pi+1 用 pi 和 (xi+1,yi+1):           pi+1= pi+2b2 xi+1+b2          if pi<0           = pi+2b2 xi+1+b2-2a2 yi+1 if pi>0

可以通过使用 (0, b) 评估 pi 的原始定义来获得递归表达式的初始值

p1 = (b2+a2 (b-中点椭圆算法)2-a2 b2
= b2-a2 b+a2/4

假设像素 (xj yj) 在进入步骤 j 时刚刚被扫描转换。 下一个像素是 U (xj ,yj-1) 或 V (xj+1,yj-1)。 连接 U & V 的水平线的中点用于定义决策参数

qj=f(xj+中点椭圆算法,yj-1)
qj=b2 (xj+中点椭圆算法)2+a2 (yj -1)2-a2 b2

如果 qj<0,中点在曲线内部,我们选择像素 V。

如果 qj≥0,中点在曲线外部,我们选择像素 U。下一步的决策参数是

qj+1=f(xj+1+中点椭圆算法,yj+1-1)
          = b2 (xj+1+中点椭圆算法)2+ a2 (yj+1-1)2- a2 b2

由于 yj+1=yj-1,我们有
qj+1-qj=b2 [(xj+1+中点椭圆算法)2-(xj +中点椭圆算法)2 ]+a2 (yj+1-1)2-( yj+1)2 ]
qj+1=qj+b2 [(xj+1+中点椭圆算法)2-(xj +中点椭圆算法)2]-2a2 yj+1+a2

如果选择了像素 V (qj<0),我们有 xj+1=xj。

如果选择了像素 U (pi>0),我们有 xj+1=xj。 因此我们可以表达

qj+1用 qj 和 (xj+1,yj+1 )
qj+1=qj+2b2 xj+1-2a2 yj+1+a2          if qj < 0
=qj-2a2 yj+1+a2          if qj>0

递归表达式的初始值是使用 qj 的原始定义计算的。 以及曲线的第 1 部分选择的最后一个像素的坐标 (xk yk)

q1 = f(xk+中点椭圆算法,yk-1)=b2 (xk+中点椭圆算法)2-a2 (yk-1)2- a2 b2

算法

int x=0, y=b; [starting point]
int fx=0, fy=2a2 b [initial partial derivatives]
int p = b2-a2 b+a2/4
while (fx2;
	if (p<0)
	p = p + fx +b2;
	else
	{
		y--;
		fy=fy-2a2
		p = p + fx +b2-fy;
	}
}
Setpixel (x, y);
p=b2(x+0.5)2+ a2 (y-1)2- a2 b2
while (y>0)
{
	y--;
	fy=fy-2a2;
	if (p>=0)
	p=p-fy+a2
           else
	{
		x++;
		fx=fx+2b2
		p=p+fx-fy+a2;
	}
	Setpixel (x,y);
}

使用中点椭圆算法绘制椭圆的程序

输出

Midpoint Ellipse Algorithm
下一个主题边界填充算法