chun2495 发表于 2023-10-7 14:19:42

有没有人用c语言写过抗锯齿圆的函数?

rt,想用c语言写一个画圆函数,支持抗锯齿,不知道有哪位大神做过?

Himem 发表于 2023-10-7 14:45:51

本帖最后由 Himem 于 2023-10-7 14:51 编辑

所以直接画个N倍大的锯齿圆,然后再把画布下采样N倍是不是也抗锯齿(SSAA)了

kv2004 发表于 2023-10-7 14:56:28

本帖最后由 kv2004 于 2023-10-7 15:36 编辑

https://www.amobbs.com/thread-5463068-1-1.html
这里有个画圆的,看看这里满足要求不
……
我看上面的链接是依赖系统库函数的,
或者,参考一下这个文档:,
另外,记得还有不用浮点数实现的算法。

chun2495 发表于 2023-10-7 16:43:26

kv2004 发表于 2023-10-7 14:56
https://www.amobbs.com/thread-5463068-1-1.html
这里有个画圆的,看看这里满足要求不
……

(引用自3楼)

感谢分享,只是这个画圆不带抗锯齿功能。

akey3000 发表于 2023-10-7 16:53:33

emwin的早期版本,ucgui中可能有,开放源码

t3486784401 发表于 2023-10-7 18:21:54

抗锯齿是需要屏幕支持 alpha blend 渲染方法的,即使用半灰像素补齐锯齿的突兀感。

例如 1bpp 的二值单色屏,根本不可能抗锯齿。

然后问题就更复杂了,alpha 渲染是基于透明度的,渲染结果不光与要花的圆方程有关,还要和当前屏幕背景图案有关,即半透明。

如果这些技术点都打算自己实现的话,可以考虑研究抗锯齿代码

lb0857 发表于 2023-10-7 19:12:48

#include <math.h>

void DrawAntiAliasedCircle(int centerX, int centerY, int radius);
void DrawPixel(int x, int y, float intensity);

void DrawAntiAliasedCircle(int centerX, int centerY, int radius)
{
    // 循环遍历圆的包围盒
    for (int y = centerY - radius; y <= centerY + radius; y++)
    {
      for (int x = centerX - radius; x <= centerX + radius; x++)
      {
            // 计算当前像素到圆心的距离
            float distance = sqrt((x - centerX) * (x - centerX) + (y - centerY) * (y - centerY));

            // 计算抗锯齿的像素强度
            float intensity = radius - distance;

            // 如果强度在0到1之间,则绘制像素
            if (intensity >= 0 && intensity <= 1)
            {
                DrawPixel(x, y, intensity);
            }
      }
    }
}

void DrawPixel(int x, int y, float intensity)
{
    // 在这里实现你的像素绘制逻辑,例如将它绘制到屏幕或图像缓冲区上。
    // intensity是一个0到1之间的值,用于调整像素的不透明度或颜色强度。
}

chun2495 发表于 2023-10-7 23:26:20

lb0857 发表于 2023-10-7 19:12

(引用自7楼)

非常感谢,我先试一下。

chun2495 发表于 2023-10-7 23:27:43

t3486784401 发表于 2023-10-7 18:21
抗锯齿是需要屏幕支持 alpha blend 渲染方法的,即使用半灰像素补齐锯齿的突兀感。

例如 1bpp 的二值单色 ...
(引用自6楼)

除了不知道画圆的抗锯齿逻辑,其他技术点都能解决。

t3486784401 发表于 2023-10-8 02:23:48

本帖最后由 t3486784401 于 2023-10-8 02:35 编辑

chun2495 发表于 2023-10-7 23:27
除了不知道画圆的抗锯齿逻辑,其他技术点都能解决。
(引用自9楼)

就是评估每个像素坐标 (xi, yi) 和圆方程的匹配程度。

如果结果只划分成: 匹配(距离<1/2 Pixel) vs 不匹配(距离>1/2 Pixel),就是带锯齿的画法;
如果把结果细分:匹配、中匹配、差不多匹配、不匹配 这样,并且赋予相应的透明度(Alpha通道),就是抗锯齿画法。

上半带锯齿画法,下半是抗锯齿:




加上高度模糊,模拟人眼对屏幕采样(低通),可以看到上半部仍旧保留了锯齿轮廓,而下半部已经有抗锯齿圆的样子了:

chun2495 发表于 2023-10-8 09:26:32

t3486784401 发表于 2023-10-8 02:23
就是评估每个像素坐标 (xi, yi) 和圆方程的匹配程度。

如果结果只划分成: 匹配(距离1/2 Pixel),就是 ...
(引用自10楼)

原来是这样计算的,太感谢了!这下终于明白了抗锯齿原理。我再整理下代码,把函数分享给坛友们。
页: [1]
查看完整版本: 有没有人用c语言写过抗锯齿圆的函数?