3

有人可以帮助我开始使用伪代码或步骤来使用 1D perlin 噪声来绘制粗略/摆动的线条,如页面中所示

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

摇摇晃晃的圈子
(来源:处女网

我确实发现 aforge.net 具有 1D 和 2D perlin 噪声函数的函数。它显示了使用 2D 噪声生成云的示例。

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

但我不确定如何使用它来生成摇摆不定的线条。

4

2 回答 2

0

我看到您的问题希望以伪代码作为答案。我最终没有使用渐变(我已经有一个难以兼容的单纯形噪声函数),而是做了其他事情。

这个想法是选择一个间隔长度(统一很好,但较大的会产生较小的舍入误差)并使用随机种子考虑噪声间隔[s, s + I],其中 I 是间隔长度,s 是种子。然后,您通过将角度 theta 映射到 来将其“包裹”在一个圆圈周围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

我们现在有一个从角度到噪声值的映射。给定我们希望圆的半径,我们可以设置噪声的最小值和最大值,然后对于我们希望评估的任何 theta,只需将相应的值添加到圆的半径即可。在极坐标中,这看起来像:

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) 和所需的方差 ( noisemin, noisemax),并且您的噪声函数在 中输出值[-1, 1]。您需要在噪声最大值和噪声最小值之间保持紧密的分布,否则您的圈子大部分会摇摆不定。

对于正方形,过程相同,但您不需要任何控制或插值,只需要缩放因子和间隔正方形边长。

您可以花哨并进行非线性插值,但我并没有真正看到需要,它可能会弄乱单纯形噪声。

于 2012-07-31T13:32:00.537 回答
0

从一维到二维的唯一区别是计算斜率。一旦你有了斜率和一维噪声,只需在垂直于斜率方向的方向上添加噪声。

于 2012-05-02T18:33:35.273 回答