3

ページに示されているように、1Dパーリンノイズを使用して大ざっぱな/ぐらついた線を描くための疑似コードまたは手順を始めるのを誰かが手伝ってくれませんか

http://freespace.virgin.net/hugo.elias/models/m_perlin.htm

グラグラ円
(ソース: virgin.net )

aforge.net には、1D および 2D パーリン ノイズ関数の関数があることがわかりました。2D ノイズを使用して雲を生成する例を示します。

http://www.aforgenet.com/framework/docs/html/f2f36ce1-ddab-389e-b538-0ccaca81fa87.htm

しかし、それを使用してぐらついた線を生成する方法がわかりません。

4

2 に答える 2

0

1D から 2D に移行するために必要な唯一の違いは、勾配を計算することです。勾配と 1D ノイズを取得したら、そのノイズを勾配の方向に垂直な方向に追加します。

于 2012-05-02T18:33:35.273 に答える
0

答えとして疑似コードを望んでいるあなたの質問を見ました。結局、勾配を使用せずに (互換性を持たせるのが難しいシンプレックス ノイズ関数を既に持っています)、別のことをしました。

アイデアは、間隔の長さを選択することです (単位は問題ありませんが、大きい方が丸め誤差が少なくなります)、ランダム シードを使用して、[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) と必要な分散 ( noiseminnoisemax) が既にあり、ノイズ関数が の値を出力すると仮定します[-1, 1]。Noisemax と Noisemin の間の狭い範囲が必要になるでしょう。

正方形の場合は同じプロセスですが、制御や補間は必要なく、スケーリング係数と間隔の正方形の辺の長さだけが必要です。

工夫して非線形補間を行うことはできますが、実際にはその必要性がわかりません。また、シンプレックス ノイズが台無しになる可能性があります。

于 2012-07-31T13:32:00.537 に答える