答えとして疑似コードを望んでいるあなたの質問を見ました。結局、勾配を使用せずに (互換性を持たせるのが難しいシンプレックス ノイズ関数を既に持っています)、別のことをしました。
アイデアは、間隔の長さを選択することです (単位は問題ありませんが、大きい方が丸め誤差が少なくなります)、ランダム シードを使用して、[s, s + I]
I が間隔の長さ、s がシードであるノイズ間隔を考慮します。次に、角度シータを にマッピングして、円に「巻き付け」I / (2 * Pi) * theta
ます。s
ただし、とのノイズ値が同じであることを確認する必要がありますs + I
。そうしないと、円が不連続になります。ただし、これは簡単です。で指定x
されている場合は[s, s + I]
、次のようにします。
interpolate(x, s, I)
mid <- noise(s) - noise(s + I)
out <- noise(x)
out <- out + (x - s) / I * mid
out <- out - (s + I - x) / I * mid
return out
x = s
の場合は を引きmid
、 の場合はx = s + I
を加算することに注意してくださいmid
。
これで、角度からノイズ値へのマッピングができました。円の半径を指定すると、ノイズの最小値と最大値を設定できます。次に、評価するシータについて、対応する値を円の半径に追加します。極座標では、これは次のようになります。
radius(theta)
s <- randomDouble
I <- 1
theta <- theta / (2 * pi)
dr <- interpolate(theta, s, I)
dr <- dr * (noisemax - noisemin) / 2 + (noisemax + noisemin) / 2
return dr + r
平均半径 ( r
) と必要な分散 ( noisemin
、noisemax
) が既にあり、ノイズ関数が の値を出力すると仮定します[-1, 1]
。Noisemax と Noisemin の間の狭い範囲が必要になるでしょう。
正方形の場合は同じプロセスですが、制御や補間は必要なく、スケーリング係数と間隔の正方形の辺の長さだけが必要です。
工夫して非線形補間を行うことはできますが、実際にはその必要性がわかりません。また、シンプレックス ノイズが台無しになる可能性があります。