Python pnoise возвращает 0: почему так?

Я пытаюсь сгенерировать 2D шум Perlin, используя pnoise2() из Python's < модуль href="http://pypi.python.org/pypi/noise/" rel="nofollow noreferrer">noise. Я пытался следовать примерам.
Функция просто требует ввода x и y:

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

Тем не менее, независимо от того, что я передаю, функция всегда возвращает 0.0. Почему? Я что-то пропустил?

[править: 10.05.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() возвращает число с плавающей запятой, например. 0.7806 и т. д., которое затем умножается на 16.0, чтобы получить частоту. Примечание. Меня это уже озадачивает, потому что я думал, что октавы должны быть целыми числами, поскольку они сообщают количество последовательных функций шума (обратите внимание, что это целое число 1, которое передается в качестве третьего значения в функцию pnoise2()).< /em> В любом случае, в функции некоторые целые числа из 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 или y должны иметь десятичные дроби, чтобы функция возвращала значение, отличное от 0.0.

Теперь, после этого, моя проблема в том, что я не понимаю, почему. Может кто-нибудь просветить меня, пожалуйста?


person neydroydrec    schedule 04.10.2012    source источник
comment
В Python нет модуля noise. Какой модуль noise вы используете?   -  person kindall    schedule 05.10.2012
comment
Используя pypi.python.org/pypi/noise, который я установил с помощью pip.   -  person neydroydrec    schedule 05.10.2012
comment
См. stackoverflow.com/questions/4467638/ для справки.   -  person neydroydrec    schedule 05.10.2012
comment
что вы передаете как x и y (приведите пример?) Вы пробовали использовать x и y как числа с плавающей запятой между 0,0 и 1,0?   -  person John Lyon    schedule 05.10.2012


Ответы (1)


Как отмечено в моем комментарии, вам нужно передать этим функциям значения float для x и y между 0.0 и 1.0.

Вероятно, это можно было бы зарегистрировать как ошибку - если x или y больше 1,0, может быть поднят соответствующий ValueError. Это, вероятно, помешало бы вам задать этот вопрос!

Это зависит от реализации, но это просто способ, позволяющий вам получать результаты с любым разрешением, которое вы хотите/нужно.

Подумайте, не заставил ли автор этой библиотеки максимальные значения x и y быть равными 100 и потребовал, чтобы вы использовали целые числа. Внезапно шум оказался действительно шумом ячеек на сетке 100x100, поскольку вы никогда не могли прочитать какие-либо промежуточные значения. Использование чисел с плавающей запятой позволяет пользователю получать результаты с любым требуемым уровнем детализации.

Тот факт, что эта деталь существует, присущ перлиновому шуму. См. предпоследний пункт в примечаниях ниже (взято из источника):

   """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. 
    """
person John Lyon    schedule 05.10.2012