我看到您的问题希望以伪代码作为答案。我最终没有使用渐变(我已经有一个难以兼容的单纯形噪声函数),而是做了其他事情。
这个想法是选择一个间隔长度(统一很好,但较大的会产生较小的舍入误差)并使用随机种子考虑噪声间隔[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]
。您需要在噪声最大值和噪声最小值之间保持紧密的分布,否则您的圈子大部分会摇摆不定。
对于正方形,过程相同,但您不需要任何控制或插值,只需要缩放因子和间隔正方形边长。
您可以花哨并进行非线性插值,但我并没有真正看到需要,它可能会弄乱单纯形噪声。