程序画圆

看了一下 GUILite 的代码,其中的画线没有乘法操作,很好,其实他的一个除以 2 的操作也可以去掉,现在也写一个画圆的程序,尽量少用乘法。后来看到 Bresenham 做图法,更通用更好,都是一个学习的过程。

Bresenham
//draw_pixel 中间的乘法应该可以简化,
//不过这个里主要是画圆,这里不考虑
int draw_pixel(unsigned char *data,  int width , int height, int x0, int y0, int x, int y, int color)
{

	int y2 = y + y0;
	int x2 = x + x0;
	if(y2 < 0 || y2 > height){
		return -1;
	}
	if(x2 < 0 || x2 > width){
		return -1;
	}
	int offset = y2  * width;
	unsigned char *p = data + offset + x2 ;
	p[0] = color;
	return 0;
}

int draw_circle(unsigned char *data,  int width, int height, int x0, int y0, int r, int color)
{
	int x, y;
	int r2 = r*r;

	int prev = 0;
	int y2 = r2;
	for(x = 0, y = r; x <= r && y >= 0; x++){
		int diff;
		int diff2;
		int x2 = prev;// = x^2
		int x21 = x2 + x + x + 1;// = (x + 1)^2
		prev = x21;
		while(y >= 0){
			diff = x2 + y2 - r2;
			diff2 = x21 + y2 - r2;
			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)){
				y2 = y2 - y - y + 1; // = (y - 1) ^ 2
				y--;
			}else{
				break;
			}
		}
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值