gpt4 book ai didi

c - 如何将两个一维噪声轴组合成连续的二维噪声?

转载 作者:行者123 更新时间:2023-11-30 19:45:18 25 4
gpt4 key购买 nike

首先,我刚开始在这里提问(尽管我已经潜伏了一段时间),所以如果我的格式或措辞不正确,请原谅。
其次,我寻找任何库的链接(就我个人而言,我不喜欢它们,因为我无法访问源代码......并且,在我看来,他们感觉像是潜在的安全漏洞正在等待发生),我只是在使用普通的旧 C 代码来完成所需的任务(最好不使用对象/结构)。

<小时/>

我正在尝试生成二维噪声,但似乎遇到了障碍。

我编写了自己的伪随机数生成器,您可以在其中为其提供种子/输入值,并且对于相同的种子/输入,它始终给出相同的输出(从 0.0 -> 1.0)。换句话说,它可以愉快地生成确定性的一维噪声。
使用这种方法,我可以创建单独的 x/y 轴噪声(我会发布示例图像来演示我的意思,但我需要 10 个代表点来发布图像......但足以说明它们看起来像黑色/灰色/水平/垂直方向的白色条形码)
然而,我组合两个轴的努力产生了一个类似于黑白“格子呢”类型图案的图像(如果可以的话,我会再次发布演示图像)。我追求的是“蓬松的云”风格的图案,就像柏林噪音产生的那样。

我的目标是拥有一个函数,当提供种子/x/y 值时,它会给出所需的二维输出。

预先计算值数组(这是我在 Google 上的多个地方找到的方法)在这里是不可能的。噪声将用于程序世界生成,二维输入坐标可以从 -1,088,391,168 到 +1,088,391,168(对于 x 和 y 轴,这将是 (4*(10^18)) 字节) ...因此输出必须直接依赖于即时给出和计算的输入值。

<小时/>

我的问题是:给定两个独立的一维噪声轴(x 轴/y 轴),如何将这两个轴组合成单个二维噪声值?或者换句话说,如何将水平和垂直条形码组合在一起以创建二维噪声场?

<小时/>

编辑:

const double noise_x1 = Noise(seed, x);
const double noise_x2 = Noise(seed, x + 1);

const double noise_y1 = Noise(seed + 1, y);
const double noise_y2 = Noise(seed + 1, y + 1);

这将获取 x/y 轴的噪声值以及下一个 x/y 点的噪声值。如何在数学上组合这 4 个值以用作“网格单元”的“角”?我只是简单地平均它们吗?
例如:

const double noise_x1y1 = (noise_x1 + noise_y1) * 0.5;
const double noise_x2y1 = (noise_x2 + noise_y1) * 0.5;
const double noise_x1y2 = (noise_x1 + noise_y2) * 0.5;
const double noise_x2y2 = (noise_x2 + noise_y2) * 0.5;

然后,用于在给定“单元格”内插入精确位置的公式/算法是什么?
我见过其他人使用“基于网格的逻辑”来处理噪音,但这似乎让我感到困惑:P

<小时/>

更新(2014 年 10 月 30 日晚上 7:35,澳大利亚东部标准时间/AEST):

在进一步深入研究这个问题后,我遇到了莫顿代码(它们实际上与噪声函数无关,尽管它们可用于将输入坐标“散列”为单个数字)。莫顿代码将两个输入数字的位交错,如下所示:
首先输入数字...

00000001 -> 00000000 00000001 = 1  
00000010 -> 00000000 00000100 = 4
00000100 -> 00000000 00010000 = 16
00001000 -> 00000000 01000000 = 64
00010000 -> 00000001 00000000 = 256
00100000 -> 00000100 00000000 = 1024
01000000 -> 00010000 00000000 = 4096
10000000 -> 01000000 00000000 = 16384

第二个输入数字...

00000001 -> 00000000 00000010 = 2  
00000010 -> 00000000 00001000 = 8
00000100 -> 00000000 00100000 = 32
00001000 -> 00000000 10000000 = 128
00010000 -> 00000010 00000000 = 512
00100000 -> 00001000 00000000 = 2048
01000000 -> 00100000 00000000 = 8192
10000000 -> 10000000 00000000 = 32768

然后将这两个输出数字组合成一个数字。此过程可以轻松扩展以处理两个 32 位输入(形成单个 64 位输出)。

然后可以将输出数输入一维噪声函数,为任何 32 位输入提供确定性输出。

最佳答案

获得真正的确定性 xD 噪声的最简单方法是使用一些哈希函数将坐标组合在一起:

  1. 将坐标转换为所需粒度的整数。

  2. 将整数散列在一起。您的需求介于用于哈希表的简单函数和加密哈希产生的过度杀伤力之间。在哪里进行妥协完全取决于您,因此我无法就使用哪个哈希函数提供太多建议。

  3. 将生成的哈希值转换为 0 到 1 之间的 float 。

关于c - 如何将两个一维噪声轴组合成连续的二维噪声?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26602187/

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