まず、私はここで質問をするのは初めてなので (かなり長い間潜んでいましたが)、形式や言葉が正しくない場合はご容赦ください。
第二に、私はライブラリへのリンクを探していません (個人的には、ソースにアクセスできないので好きではありません...そして、私の意見では、潜在的なセキュリティの悪用が起こるのを待っているように感じます) )、私は目的のタスクを実行するための単純な古い C コードの直後です (できればオブジェクト/構造体を使用しないでください)。
2 次元ノイズを生成しようとしていますが、障害にぶつかったようです。
私は独自の疑似乱数ジェネレーターを作成しました。シード/入力値を指定すると、同じシード/入力に対して常に同じ出力 (0.0 -> 1.0) が得られます。つまり、決定論的な 1 次元ノイズを問題なく生成できます。
この方法を使用して、ノイズの個別の x/y 軸を作成できます (意味を示すためにサンプル画像を投稿しますが、画像を投稿するには 10 担当者ポイントが必要です... しかし、それらが黒/灰色のように見えると言えば十分です/白いバーコードは水平方向/垂直方向)
しかし、2 つの軸に結合しようとした結果、白黒の「タータン」タイプのパターンに似た画像になりました (できれば、デモ画像を投稿したいと思います)。パーリン ノイズが生成するような「ふわふわした雲」スタイルのパターンを求めています。
私の目標は、シード/x/y 値を指定すると、目的の 2-D 出力が得られる単一の関数を持つことです。
値の配列を事前に計算すること (これは、Google のいくつかの場所で見つけた方法です) は、ここでは問題外です。ノイズはプロシージャル ワールドの生成に使用され、2 次元の入力座標は -1,088,391,168 から +1,088,391,168 になります (x 軸と y 軸の両方で、(4*(10^18)) バイトになります)。 ...そのため、出力は、オンザフライで指定および計算された入力値に直接依存する必要があります。
私の質問は、1-D ノイズの 2 つの別々の軸 (x 軸/y 軸) が与えられた場合、どうすれば 2 つの軸を単一の 2-D ノイズ値に結合できますか? 言い換えれば、水平バーコードと垂直バーコードを組み合わせて 2D ノイズ フィールドを作成するにはどうすればよいでしょうか?
編集:
const double noise_x1 = Noise(seed, x);
const double noise_x2 = Noise(seed, x + 1);
const double noise_y1 = Noise(seed + 1, y);
const double noise_y2 = Noise(seed + 1, y + 1);
これは、x/y 軸のノイズ値と、次の x/y ポイントのノイズ値を取得します。「グリッドセル」の「コーナー」として使用するために、これら4つの値を数学的に組み合わせるにはどうすればよいですか? 私は単にそれらを平均化しますか?
例えば:
const double noise_x1y1 = (noise_x1 + noise_y1) * 0.5;
const double noise_x2y1 = (noise_x2 + noise_y1) * 0.5;
const double noise_x1y2 = (noise_x1 + noise_y2) * 0.5;
const double noise_x2y2 = (noise_x2 + noise_y2) * 0.5;
そして、指定された「セル」内の正確なスポットを補間するための式/アルゴリズムは何でしょうか?
他の人がノイズに「グリッドベースのロジック」を使用しているのを見たことがありますが、それは私を困惑させているようです :P
更新 (2014 年 10 月 30 日午後 7 時 35 分、オーストラリア東部標準時/AEST):
この問題をさらに掘り下げると、Morton コードに出くわしました (実際にはノイズ関数とは関係ありませんが、入力座標を単一の数値に「ハッシュ」するために使用できます)。モートン コードは、次のように 2 つの入力数値のビットをインターリーブします。
最初の入力数値...
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
2 番目の入力番号...
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
これらの 2 つの出力数値は、1 つの数値に結合されます。このプロセスは、(単一の 64 ビット出力を形成するために) 2 つの 32 ビット入力で動作するように簡単に拡張できます。
次に、出力数を 1 次元ノイズ関数に入力して、任意の 32 ビット入力に対して確定的な出力を与えることができます。