gpt4 book ai didi

c++ - 为什么我的 C++ 圆抗锯齿算法会给出不对称的结果?

转载 作者:行者123 更新时间:2023-12-02 18:35:50 26 4
gpt4 key购买 nike

一些背景:

所以我的计划是用 C++ 创建一个点画算法,我基本上只是计划为圆的每个半径存储一大堆数据,以便写入 OpenGL 中的纹理贴图上,我不确定这是否正确有件事要做,但我喜欢这样做

比计算机动态计算每个圆的半径更快,特别是如果很多圆的大小相同,我的计划是创建一个函数,只编写一个充满半径的整个文本文档,达到一定的大小,这数据将按位存储在 long 的 std::array <long> bit = {0x21, 0x0A ect... } 数组中这样我就可以用分配给每个像素的抗锯齿值的 2 位对 4X4 值数组进行编码,但是要创建这个 Ant 锯齿圆数据库,我需要编写一个我一直出错的函数;

实际问题:

所以这可能看起来很懒,但我可以保证我已经尝试了一切来解决我在这里犯的错误基本上我已经通过将像素划分为子像素将这段代码编写为 anti=alias 但它似乎是返回大于 1 的值,这是不可能的,因为我已将每个像素分为 100 个大小为 0.01 的像素

float CircleConst::PixelAA(int I, int J)
{
float aaValue = 0;

for (float i = (float) I; i < I + 1; i += 0.1f)
{
for (float j = (float) J; j < J + 1; j += 0.1f)
{
if ((pow((i - center), 2) + pow((j - center), 2) < pow(rad, 2)))
aaValue += 0.01f;
}
}
return aaValue;
}

这也是编写实际圆的代码

CircleConst::CircleConst(float Rad)
{
rad = Rad;
dataSize = (unsigned int) ceil(2 * rad);


center = (float) dataSize/2;

arrData.reserve((int) pow(dataSize, 2));

for (int i = 0; i < dataSize; i++)
{
for (int j = 0; j < dataSize; j++)
{
if ( CircleBounds(i, j, rad-1) )
arrData.push_back(1);
else if (!CircleBounds(i, j, rad - 1) && CircleBounds(i, j, rad + 1))
{
arrData.push_back(PixelAA(i,j));
}
else
arrData.push_back(0);
}
}
}

所以我注意到,在没有抗锯齿的情况下,圆圈的书写方式被移动了一行,但这可以通过将圆圈中心的值更改为 dataSize/2 - 0.5f 来解决。但这会导致稍后当圆与抗锯齿不对称时出现问题,这里是半径 3.5 的示例

0.4 1.0 1.1 1.1 1.1 0.4 0.0
1.0 1.0 1.0 1.0 1.0 1.1 0.2
1.1 1.0 1.0 1.0 1.0 1.0 0.5
1.1 1.0 1.0 1.0 1.0 1.0 0.5
1.1 1.0 1.0 1.0 1.0 1.0 0.2
0.4 1.1 1.0 1.0 1.0 0.5 0.0
0.0 0.2 0.5 0.5 0.2 0.0 0.0

正如你所看到的,有些值超过 1.0,这是不可能的,我确信有一个明显的答案可以解释为什么会这样,但我完全错过了它。

最佳答案

问题出在这样的行上:

for (float i = (float) I; i < I + 1; i += 0.1f)

float 无法以无限精度存储或操作。通过重复将一个 float 与另一个 float 相加,误差会累积。这就是您看到的值高于 1.0 的原因。

解决方案是使用整数类型进行迭代并计算所需的 float 。例如:

for (unsigned i = 0U; i < 10U; ++i)
{
float x = 0.1F * static_cast<float>(i);
printf("%f\n", x);
}

关于c++ - 为什么我的 C++ 圆抗锯齿算法会给出不对称的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68793408/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com