画椭圆没有圆哪么简单,想不到好的方法,像素上操作误差是不可以避免,draw_pixel 和画圆的代码一样。时间复杂度为O(a+b),a,b分别的椭圆的长短轴。
int draw_ellipse(unsigned char *data, int width, int height, int x0, int y0, int w, int h, int color)
{
int a, b;
int a2, b2;
int ab2;
a = w/2;
b = h/2;
a2 = a * a;
b2 = b * b;
ab2 = a2 * b2;
int x, y;
int x2, y2;
int x21;
for(x = 0, y = b; x <= a && y >= 0; x++){
int diff, diff2;
x2 = x * x;
x21 = x2 + 2*x + 1;
while(y >= 0){
y2 = y * y;
int left = a2 * y2 - ab2;
diff = b2 * x2 + left;// x^2/b^2 + y^2/a^2 = a^2 * b^2
diff2 = b2 * x21 + left;
//printf("x:%d y:%d diff:%d ,%d\n", x, y, diff, diff2);
draw_pixel(data, width, height, x0, y0, x, y, color);
draw_pixel(data, width, height, x0, y0, -x, y, color);
draw_pixel(data, width, height, x0, y0, x, -y, color);
draw_pixel(data, width, height, x0, y0, -x, -y, color);
if(abs(diff) < abs(diff2)){
y--;
}else{
break;
}
}
}
return 0;
}