Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将两个轴的一维噪波组合成连续的二维噪波?_C_2d_Noise Generator - Fatal编程技术网

C 如何将两个轴的一维噪波组合成连续的二维噪波?

C 如何将两个轴的一维噪波组合成连续的二维噪波?,c,2d,noise-generator,C,2d,Noise Generator,首先,我不习惯在这里提问(虽然我已经潜伏了很长一段时间),所以如果我没有正确地格式化或使用单词,请原谅。 其次,我没有寻找任何库的链接(我个人不喜欢它们,因为我没有访问源代码的权限……而且,在我看来,它们就像是一个潜在的安全漏洞在等待发生),我只是在寻找普通的旧C代码来完成所需的任务(最好不要使用对象/结构) 我试图产生二维噪音,我似乎遇到了障碍 我已经写了我自己的伪随机数生成器,在这里你给它种子/输入值,它总是给相同的种子/输入相同的输出(从0.0->1.0)。换句话说,它可以愉快地产生确定

首先,我不习惯在这里提问(虽然我已经潜伏了很长一段时间),所以如果我没有正确地格式化或使用单词,请原谅。
其次,我没有寻找任何库的链接(我个人不喜欢它们,因为我没有访问源代码的权限……而且,在我看来,它们就像是一个潜在的安全漏洞在等待发生),我只是在寻找普通的旧C代码来完成所需的任务(最好不要使用对象/结构)


我试图产生二维噪音,我似乎遇到了障碍

我已经写了我自己的伪随机数生成器,在这里你给它种子/输入值,它总是给相同的种子/输入相同的输出(从0.0->1.0)。换句话说,它可以愉快地产生确定性的一维噪声。
使用这种方法,我可以创建单独的x/y轴噪声(我会发布示例图像来演示我的意思,但我需要10个代表点来发布图像…但可以说它们看起来像水平/垂直方向的黑色/灰色/白色条形码)
然而,我的努力结合到两个轴已经导致了一个图像,类似于黑色和白色的“格子”类型的模式(再次,我会后演示图像,如果我可以的话)。我想要的是“蓬松的云”样式的图案,就像柏林噪音产生的一样

我的目标是拥有一个单一的函数,当提供seed/x/y值时,它将提供所需的二维输出

在这里,预先计算一个值数组(这是我在Google的几个地方找到的方法)是不可能的。噪声用于程序世界生成,二维输入坐标可以从-1088391168到+1088391168(对于x和y轴,都是(4*(10^18))字节)。。。因此,输出必须直接取决于动态给定和计算的输入值


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


编辑:

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

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


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

在深入研究这个问题之后,我发现了Morton代码(虽然它们可以用来将输入坐标“散列”为单个数字,但实际上与噪声函数无关)。莫顿码将两个输入数字的位交织在一起,如下所示:
第一个输入号码

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  
第二个输入号码

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位输入提供确定性输出。

只需使用以下方法:


2D、3D和4D噪波的方向伪影明显少于柏林噪波,尤其是与您尝试执行的操作相比。

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

  • 将坐标转换为所需粒度的整数

  • 将整数散列在一起。您的需求介于用于哈希表的简单函数和加密哈希产生的过度杀戮之间。在哪里达成妥协完全取决于你,所以我不能给出太多关于使用哪个散列函数的建议

  • 将结果哈希转换为介于0和1之间的浮点


  • 好的,如果我明白你的意思,你所说的单轴噪声是你随机生成的数字,代表水平方向上的噪声振幅。你说你有另一个类似的轴代表垂直方向上的噪音。你说你想把它们组合成正常的
    蓬松云
    表示噪声,而不是
    格子图案
    。我想我明白了。问题在于噪声/声音通常是一个频率(每秒周期的振幅)。要得到蓬松的云,为什么不在水平轴时间段内将垂直
    振幅
    从“0”缩放到其最大值回到“0”?如果你想要看起来像柏林噪声的东西,最简单的方法是编写柏林噪声发生器。顺便说一句,还不清楚你是如何“组合”1D数据的。您知道2D需要N^2个独立点,而两个1D集只提供2N?我所描述的“格子图案”(我相当确定)是由于不正确地插值2轴造成的,导致每个“网格单元”(如果您将整个图像视为X*Y网格)的中心不正确舍入。我会看看我是否可以添加一些代码的问题,以澄清…谢谢你的投入,我会投票,如果我可以。然而,就我而言,您的解决方案似乎有点“繁重”(过激)。。。最终的结果将是我所追求的,但计算要求将远远高于我所追求的。再次感谢。计算要求与柏林噪声的要求没有太大区别。代码太多了,因为东西都被扩展了。这是为了提高性能。例如,3D实现中的0,0,0和1,1,1四面体可以由相同的代码处理。这会使文件变小,但不一定会提高性能。如果您只需要2D,请注意2D函数并不是很大。Y