使用1D perlin噪音创建粗略/不稳定的线条

时间:2012-05-02 16:44:46

标签: c# algorithm imaging perlin-noise

有人可以帮助我开始使用伪代码或步骤使用1D perlin噪声来绘制粗略/不稳定的行,如页面所示

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

wobbly circle http://freespace.virgin.net/hugo.elias/models/sketch1.gif

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

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

但我不确定如何使用它来产生不稳定的线条。

2 个答案:

答案 0 :(得分:0)

只需要从1D到2D进行差异就可以计算出斜率。一旦得到斜率和1D噪声,只需在垂直于斜率方向的方向上添加噪声。

答案 1 :(得分:0)

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

这个想法是选择一个区间长度(一致是好的,但是更大的一个会产生更少的舍入误差)并且使用随机种子考虑噪声区间[s, s + I],其中I是区间长度,s是种子。然后,通过将角度θ映射到I / (2 * Pi) * theta,将其“环绕”圆圈。但是,您需要确保ss + 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

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

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)和所需的方差(noiseminnoisemax),并且您的噪音函数输出[-1, 1]中的值。你需要在noisemax和noisemin之间进行紧密的传播,否则你的圈子将会大部分摆动。

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

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