Perlin用伪代码解释:http://freespace.virgin.net/hugo.elias/models/m_perlin.htm
本教程提供了一个用伪代码编写的随机数生成器函数。返回范围为(-1,1)的浮点数。在
function IntNoise(32-bit integer: x)
x = (x<<13) ^ x;
return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);
end IntNoise function
所以如果这个函数返回一个范围为(-1,1)的数字,我不能只用random.uniform(-1, 1)
?
但后来我遇到了一个问题:
我猜Noise(x)
函数为1D噪声生成随机数。在
我似乎不明白x
参数是什么。
是种子吗?我不能用random.uniform(-1, 1)
在Perlin噪声中使用的噪声函数是一个种子随机数发生器。也就是说,每次调用它时,它必须返回相同的值,参数X。你可以把X看作是空间中某个给定维度上的某个位置,在计算Perlin噪声的区域边界之间。在
如果可以根据给定的参数重置RNG的状态,那么可以使用Python random模块,以便它始终为给定的X返回相同的值。在
注意,当第一次传递1时,Noise返回相同的值,第二次。当输入的值不是1时,它也返回一个不同的值。在Python中,seed的参数可以是任何散列类型。就您的目的而言,任何数字类型都是有效的。在
通常,在创建Perlin noise时,会对这个noise函数进行许多调用,因此您希望它速度更快。在我的机器上,执行上面的函数大约需要14微秒。每秒只有大约70000个电话。实现IntNoise的伪代码可能会导致更好的性能。事实上,以下方法:
^{pr2}$每次调用的平均时间大约是1.6微秒,或者比上面的噪声快10倍。它的返回值范围是(-1,1),但可以通过修改最后一行来更改。我不能说它分布的均匀性,然而,一幅画胜过千言万语。下面的蓝点来自IntNoise,红点来自python随机.均匀功能。在
上面的噪声函数可由平滑噪声算法在您的问题中使用。你在问题中链接的URL描述了平滑函数比我做的更好。读了这段之后,研究旁边的1D和2D平滑的图片,以更好地理解它们的目的。在
相关问题 更多 >
编程相关推荐