画椭圆

画椭圆没有圆哪么简单,想不到好的方法,像素上操作误差是不可以避免,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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值