打印
[C语言]

请问一下这个画圆的算法是什么算法

[复制链接]
3393|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xinyue_z|  楼主 | 2021-10-22 16:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
算法如下,具体的算法名称和原理是什么呢
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);
    }
}

使用特权

评论回复

相关帖子

沙发
gx_huang| | 2021-10-22 16:35 | 只看该作者
不懂,感觉不会太圆,如果不想浮点运算,不如查表插值计算

使用特权

评论回复
板凳
cjseng| | 2021-10-23 22:15 | 只看该作者
本帖最后由 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++;这样的结果是锯齿更小。
同样,这种方法也适用于直线,甚至任意曲线,任意曲线的方法是:将曲线用一段段直线拟合,然后套用直线插补的方法。

使用特权

评论回复
地板
linqing171| | 2021-10-24 10:26 | 只看该作者
假设x0=y0=0;
从x=0;y=r开始  循环   x++,y--; 直到x=y=r/2 ;
相当于画了个直线x+y=r;画的范围是八分之一象限;
下面的8句画了其它的八分之七;

结论就是画了个倾斜45度的正方形啊,哪里有圆? 是不是画的太小了,看起来像圆?

使用特权

评论回复
5
xinyue_z|  楼主 | 2021-10-25 11:59 | 只看该作者
代码是我从github上找的,当时是为了找ST7789的驱动,里面实现的画圆函数就是我贴出来的代码,完全没看明白,但是确实画出来的是圆形,效果还很好,

使用特权

评论回复
6
xinyue_z|  楼主 | 2021-10-25 12:00 | 只看该作者
cjseng 发表于 2021-10-23 22:15
这是插补算法,将圆分成四个象限,画出一个象限的圆弧,其余三个对称着画出来。
其实我没看懂你的程序,但 ...

嗯,看起来应该是这个原理,需要仔细研究一下代码,谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

27

帖子

0

粉丝