3. 椭圆
椭圆绘制方法与圆类似,椭圆我们记录矩形对角线端点坐标,使用Bresenham方法绘制。
基本代码:
void draw_ellipse_Bresenham_4i(int32 x0, int32 y0, int32 x1, int32 y1)
{
int32 i, j;
int32 x = (x0 + x1) >> 1;
int32 y = (y0 + y1) >> 1;
int32 a = abs(x0 - x1) >> 1;
int32 b = abs(y0 - y1) >> 1;
int64 e, aa, bb;
aa = a * a;
bb = b * b;
j = b;
e = (bb << 2) + aa * (1 - (b << 2));
for(i=0;i<=a;++i)
{
draw_point_2i(x + i, y + j);
draw_point_2i(x + i, y - j);
draw_point_2i(x - i, y + j);
draw_point_2i(x - i, y - j);
if(e <= 0)
{
e += bb * (12 + (i<<3));
}
else
{
e += bb * (12 + (i<<3)) + aa * (8 - (j<<3));
-- j;
}
if(bb * ((i<<1) + 2) > aa * ((j<<1) - 1))
{
break;
}
}
e = bb * ((i<<1) + 1) * ((i<<1) + 1) + aa * ((j<<1) - 2) * ((j<<1) - 2) - ((aa * bb)<<2);
for(;j>=0;--j)
{
draw_point_2i(x + i, y + j);
draw_point_2i(x + i, y - j);
draw_point_2i(x - i, y + j);
draw_point_2i(x - i, y - j);
if(e <= 0)
{
e += bb * (8 + (i<<3)) + aa * (12 - (j<<3));
++ i;
}
else
{
e += aa * (12 - (j<<3));
}
}
}