3

Pythonのノイズモジュールを使用して2Dパーリンノイズを生成しようとしています。私は例に従おうとしました。 この関数は、入力を必要とするだけです。pnoise2()
xy

noise2(x, y, octaves=1, persistence=0.5, repeatx=1024, repeaty=1024, base=0.0)

しかし、私が何を渡しても、関数は常にを返します0.0。どうして?私は何か見落としてますか?

[編集:05/10/12]

他のいくつかの例は機能しますが、コードは単純です。

import sys
from noise import pnoise2
import random
random.seed()
octaves = random.random()
freq = 16.0 * octaves
for y in range(30):
    for x in range(40):
        n = int(pnoise2(x/freq, y / freq, 1)*10+3)
        if n>=1:
            n=1
        else:
            n=0
        print n,
    print

* 0.5それで、またはなどの値が何のためにあるの+ 0.5かわからないので* 10+3、これらの値のいくつかを除外しながら、私は自分自身を試しました。上記の例でrandom.random()は、float0.7806などを返します。これに乗算し16.0て周波数を取得します。注意:オクターブは、連続するノイズ関数の数を示すため、整数である必要があるため、すでに困惑しています(関数1の3番目の値として渡される整数でもあることに注意してくださいpnoise2())。とにかく、関数では、からのいくつかの整数range()が、で除算されfrequencyます13.88

>>> pnoise2(1/13.88, 1/13.88, 1)
0.06868855153353493
>>> pnoise2(0.07, 0.06, 1)
0.06691436186932441
>>> pnoise2(3.07, 3.04, 1)
0.06642476158741428 
>>> pnoise2(3.00, 2.03, 1)                                                   
0.02999223154495647

しかし、再び:

>>> pnoise2(3.0, 2.0, 1)                                                   
0.0
>>> pnoise2(1.0, 2.0, 1)                                                     
0.0
>>> pnoise2(4.0, 5.0, 1)
0.0

したがって、関数が。以外の値を返すためには、x または 小数が必要であると結論付けます。y0.0

この後、私の問題は、理由がわからないことです。誰かが私を教えてくれませんか?

4

1 に答える 1

3

float私のコメントで述べたように、 xとyのこの関数値をとの間で渡す必要があり0.0ます1.0

これはおそらくバグとして提出される可能性があります-xまたはyが1.0より大きい場合、適切なValueErrorものが発生する可能性があります。それはおそらくあなたがこの質問をする必要をなくしたでしょう!

これは実装固有ですが、必要な解像度で結果を取得できるようにするための方法にすぎません。

このライブラリの作成者が最大x値とy値を100に強制し、intを使用する必要があるかどうかを検討してください。100x100中間値を読み取ることができなかったため、突然のノイズは実際にはグリッド上のセルノイズです。floatを使用すると、ユーザーは必要な詳細レベルで結果を得ることができます。

この詳細が存在するという事実は、パーリンノイズに固有のものです。以下の注記の最後から2番目のポイントを参照してください(ソースから取得)。

   """Perlin simplex noise generator

    Adapted from Stefan Gustavson's Java implementation described here:

    http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf

    To summarize:

    In 2001, Ken Perlin presented 'simplex noise', a replacement for his classic
    noise algorithm.  Classic 'Perlin noise' won him an academy award and has
    become an ubiquitous procedural primitive for computer graphics over the
    years, but in hindsight it has quite a few limitations.  Ken Perlin himself
    designed simplex noise specifically to overcome those limitations, and he
    spent a lot of good thinking on it. Therefore, it is a better idea than his
    original algorithm. A few of the more prominent advantages are: 

    * Simplex noise has a lower computational complexity and requires fewer
      multiplications. 
    * Simplex noise scales to higher dimensions (4D, 5D and up) with much less
      computational cost, the complexity is O(N) for N dimensions instead of 
      the O(2^N) of classic Noise. 
    * Simplex noise has no noticeable directional artifacts.  Simplex noise has 
      a well-defined and continuous gradient everywhere that can be computed 
      quite cheaply. 
    * Simplex noise is easy to implement in hardware. 
    """
于 2012-10-05T05:59:35.890 に答える