3

我正在尝试使用Python 的噪声模块生成 2D Perlin 噪声。我试图遵循示例。 该函数只需要一个和输入:pnoise2()
xy

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

然而,无论我传入什么,函数总是返回0.0. 怎么来的?我错过了什么?

[编辑:2012 年 5 月 10 日]

其他一些示例有效,代码很简单:

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.5or + 0.5or * 10+3etc. 值是什么,我尝试了自己,同时排除了其中一些值。在上面的示例中,random.random()返回一个浮点数,例如0.7806等,然后将其乘以16.0得到频率。注意:这已经让我感到困惑,因为八度音阶,我认为应该是一个整数,因为它告诉了连续噪声函数的数量(还要注意它是一个整数1,作为函数中的第三个值传入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 or y必须有小数才能使函数返回0.0.

现在在这之后,我的问题是我不明白为什么。有人可以启发我吗?

4

1 回答 1

3

如我的评论中所述,您需要在 和 之间传递x和floaty 的函数值。0.01.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. 
    """
于 2012-10-05T05:59:35.890 回答