当前位置: 代码迷 >> 综合 >> 程序画圆
  详细解决方案

程序画圆

热度:34   发布时间:2024-03-07 09:17:22.0

看了一下 GUILite 的代码,其中的画线没有乘法操作,很好,其实他的一个除以 2 的操作也可以去掉,现在也写一个画圆的程序,尽量少用乘法。

//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^2int x21 = x2 + x + x + 1;// = (x + 1)^2prev = 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) ^ 2y--;}else{break;}}}return 0;
}

 

  相关解决方案