![](/img/trans.png)
[英]How does the read function in boost::iostreams::source actually work?
[英]How does the noise function actually work?
我查看了libnoise源並找到了ValuNoise3D函數:
double noise::ValueNoise3D (int x, int y, int z, int seed)
{
return 1.0 - ((double)IntValueNoise3D (x, y, z, seed) / 1073741824.0);
}
int noise::IntValueNoise3D (int x, int y, int z, int seed)
{
// All constants are primes and must remain prime in order for this noise
// function to work correctly.
int n = (
X_NOISE_GEN * x
+ Y_NOISE_GEN * y
+ Z_NOISE_GEN * z
+ SEED_NOISE_GEN * seed)
& 0x7fffffff;
n = (n >> 13) ^ n;
return (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff;
}
但是當我看到這個時,這對我來說是一種魔力。 這實際上是如何工作的? 我的意思是為什么寫這篇文章的人拿這些素數代替其他人? 為什么這樣的等式 他是如何決定使用這些方程而不是其他方程式的? 只是......怎么理解這個?
libnoise網站對這種噪聲函數背后的數學有很好的解釋。 特別是關於素數:
這些大整數是素數。 這些整數可以修改,只要它們保持為素數; 非素數可能會在輸出中引入可辨別的模式。
noise::IntValueNoise3D
實際上noise::IntValueNoise3D
操作:第一步將(x,y,z)坐標轉換為單個整數,第二步將整數通過整數噪聲函數產生一個大致在-1073741824之間的噪聲值。 1073741824. noise::ValueNoise3D
只是將該整數轉換為介於-1和1之間的浮點值。
至於為什么noise::IntValueNoise3D
執行所有那些復雜的操作,它基本上歸結為這個特定的操作序列產生一個漂亮,嘈雜的結果,沒有明顯的模式可見。 這不是唯一可以使用的操作順序; 任何產生足夠嘈雜結果的東西都會起作用。
隨機性有一種藝術。 有很多東西使偽隨機數“看起來很好”。 對於很多3D功能而言,使其“看起來很好”最重要的是擁有適當的頻率分布。 確保以2 ^ 32為模數的良好頻率分布的任何東西都將產生非常好看的數字。 乘以大素數會產生良好的頻率分布,因為它們沒有2 ^ 32的因子共享。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.