请问一下这个画圆的算法是什么算法
算法如下,具体的算法名称和原理是什么呢void ST7789_Draw_Circle(uint16_t x0, uint16_t y0, uint8_t r, uint16_t color)
{
int16_t f = 1 - r;
int16_t ddF_x = 1;
int16_t ddF_y = -2 * r;
int16_t x = 0;
int16_t y = r;
ST7789_DrawPixel(x0, y0 + r, color);
ST7789_DrawPixel(x0, y0 - r, color);
ST7789_DrawPixel(x0 + r, y0, color);
ST7789_DrawPixel(x0 - r, y0, color);
while (x < y) {
if (f >= 0) {
y--;
ddF_y += 2;
f += ddF_y;
}
x++;
ddF_x += 2;
f += ddF_x;
ST7789_DrawPixel(x0 + x, y0 + y, color);
ST7789_DrawPixel(x0 - x, y0 + y, color);
ST7789_DrawPixel(x0 + x, y0 - y, color);
ST7789_DrawPixel(x0 - x, y0 - y, color);
ST7789_DrawPixel(x0 + y, y0 + x, color);
ST7789_DrawPixel(x0 - y, y0 + x, color);
ST7789_DrawPixel(x0 + y, y0 - x, color);
ST7789_DrawPixel(x0 - y, y0 - x, color);
}
} 不懂,感觉不会太圆,如果不想浮点运算,不如查表插值计算 本帖最后由 cjseng 于 2021-10-23 22:23 编辑
这是插补算法,将圆分成四个象限,画出一个象限的圆弧,其余三个对称着画出来。
其实我没看懂你的程序,但我以前做过类似的东西,以第一象限为例,圆心坐标(x0,y0),半径r,原理就是:初始值X=x0,Y=y0+r,X轴横移一步,即X++,判断此刻坐标在圆弧外面还是里面,如果在外面,Y--,否则Y保持不变,继续X++,继续判断坐标在外面还是里面,不断循环直到完成第一个象限。这样,实际的轨迹是锯齿,不断逼近圆弧的锯齿。
改进一下:X、Y不变,先预测X++后,坐标在圆弧外面还是里面,如果在外面,则:X++;Y--;否则X++;这样的结果是锯齿更小。
同样,这种方法也适用于直线,甚至任意曲线,任意曲线的方法是:将曲线用一段段直线拟合,然后套用直线插补的方法。
假设x0=y0=0;
从x=0;y=r开始循环 x++,y--; 直到x=y=r/2 ;
相当于画了个直线x+y=r;画的范围是八分之一象限;
下面的8句画了其它的八分之七;
结论就是画了个倾斜45度的正方形啊,哪里有圆? 是不是画的太小了,看起来像圆?
代码是我从github上找的,当时是为了找ST7789的驱动,里面实现的画圆函数就是我贴出来的代码,完全没看明白,但是确实画出来的是圆形,效果还很好, cjseng 发表于 2021-10-23 22:15
这是插补算法,将圆分成四个象限,画出一个象限的圆弧,其余三个对称着画出来。
其实我没看懂你的程序,但 ...
嗯,看起来应该是这个原理,需要仔细研究一下代码,谢谢
页:
[1]