椭圆的特性
以中心在原点,长半轴为a,短半轴为b的标准椭圆为例。
根据椭圆的对称性,只需讨论第一象限内的1/4椭圆弧的生成即可。
第一象限内的1/4椭圆弧的像素分布情况:
以弧上斜率为-1的点作为分界,将第一象限内的1/4椭圆弧分为上、下两半部分:
上半部分(斜率大于–1):在x方向取单位步长,来确定下一个像素的位置;
下半部分(斜率小于–1):在y方向取单位步长,来确定下一个像素的位置。
改为形式:F (x, y) =b2x2+a2y2-a2b2= 0 (1式)
已知标准位置的椭圆方程为:X2/a2+y2/b2=1
在上半部分和下半部分的交界处,法向量的x和y方向两个分量相等,则满足:
即:2b2x = 2a2y
上半部分的条件是:2b2x < 2a2y下半部分的条件是:2b2x >= 2a2y
中点画椭圆法
1/4椭圆弧的上半部分:
设当前已确定的椭圆弧上的像素点为P (xp, yp),则下一对候选像素为正右方H和右下方D,H和D的中点为(xp+1, yp–0.5)
将中点代入1式,构造判别式为:
d = F(xp+1, yp–0.5) = b2(xp+1)*(xp+1) + a2(yp–0.5)*(yp–0.5) – a2b2
若d<0,则中点在椭圆内,取正右方像素H,且判别式应更新为:
d1 = F(xp+2, yp–0.5) = b2(xp+2)*(xp+2) + a2(yp–0.5)*(yp–0.5) – a2b2
= (b2(xp+1)*(xp+1) + a2(yp–0.5)*(yp–0.5) – a2b2) + b2(2xp+3)
= d + b2(2xp+3)
所以沿正右方向,判别式d 的增量为b2(2xp+3)
若d≥0,则中点在椭圆外,取右下方像素D,且判别式应更新为:
d1 = F(xp+2, yp–1.5) = b2(xp+2)*(xp+2) + a2(yp–1.5)*(yp–1.5) – a2b2
= (b2(xp+1)*(xp+1) + a2(yp–0.5)*(yp–0.5) – a2b2) + a2(-2yp+2)
= d + b2(2xp+3) + a2(-2yp+2)
所以沿右下方向,判别式d 的增量为b2(2xp+3)+a2(-2yp+2)
上半部分判别式 d 的初始值:
弧起点为(0, b),则第一个中点为(1, b–0.5),对应的判别式:
d0 = F(1, b–0.5) = b2+a2(b–0.5)*(b–0.5)–a2b2 = b2+a2(–b+0.25)
注意:在生成1/4椭圆弧的上半部分时,每步迭代中,必须随时计算和比较从上半部分转入下半部分的条件是否成立。
1/4椭圆弧的下半部分:
下半部分的步进方向由 x 改为 y。
设当前已确定的像素点为P(xp, yp),则下一对候选像素为正下方V和右下方D的两个像素。
V和D的中点为(xp+0.5, yp–1),将中点代入1式,构造判别式为:
d = F(xp+0.5, yp–1) = b2(xp+0.5)*(xp+0.5) + a2(yp–1)*(yp–1) – a2b2
若d≤0,则中点在椭圆内,取右下方像素D,且判别式应更新为:
d1 = F(xp+1.5, yp–2) =b2(xp+1.5)*(xp+1.5) + a2(yp–2)*(yp–2) – a2b2
= (b2(xp+0.5)*(xp+0.5) + a2(yp–1)*(yp–1) – a2b2) + a2(-2yp+3)
= d +b2(2xp+2) +a2(-2yp+3)
所以沿右下方向,判别式d 的增量为b2(2xp+2) + a2(-2yp+3)
若d>0,则中点在椭圆外,取正下方像素V,且判别式应更新为:
d1 = F(xp+0.5, yp–2) = b2(xp+0.5)*(xp+0.5) + a2(yp–2)*(yp–2) – a2b2
= ( b2(xp+0.5)*(xp+0.5) + a2(yp–1)*(yp–1) – a2b2) + a2(-2yp+3)
= d +a2(-2yp+3)
所以沿正下方向,判别式d 的增量为a2(-2yp+3)
下半部分判别式 d 的初始值:
如果在上半部分所选择的最后一个像素为(x, y),则下半部分的判别式 d 的初始值就在 (x+0.5, y–1) 处计算,即:
d0 = F(x+0.5, y–1) =b2(xp+0.5)*(xp+0.5) + a2(yp–1)*(yp–1) – a2b2
注意:下半部分椭圆弧的终止条件是 y=0。