仅仅均匀地生成u 和v 不一定会从环面均匀地采样。需要一个额外的步骤。
J.F. Williamson,“随机选择分布在曲面上的点”,Physics in Medicine & Biology 32(10),1987 年,描述了在参数表面上选择均匀随机点的一般方法。它是一种接受/拒绝方法,根据其拉伸因子(梯度规范)接受或拒绝每个候选点。要将这种方法用于参数曲面,必须了解有关曲面的几件事,即——
-
x(u, v)、y(u, v)和z(u, v),它们是从二维坐标u和v生成3维坐标的函数,
-
u和v的范围,
-
g(point),曲面上每个点的梯度范数(“拉伸因子”),以及
-
gmax,整个表面的最大值g。
对于您在问题中给出的参数化的 3 维环面,g 和 gmax 如下:
-
g(u, v) = a * (c + cos(v) * a)。
-
gmax = a * (a + c)。
然后,在具有圆环半径c 和管半径a 的 3 维圆环表面上生成均匀随机点的算法如下(其中RNDEXCRANGE(x,y) 在[x,y) 中均匀返回一个数字随机,RNDRANGE(x,y) 统一随机返回[x,y] 中的一个数字):
// Maximum stretch factor for torus
gmax = a * (a + c)
while true
u = RNDEXCRANGE(0, pi * 2)
v = RNDEXCRANGE(0, pi * 2)
x = cos(u)*(c+cos(v)*a)
y = sin(u)*(c+cos(v)*a)
z = sin(v)*a
// Norm of gradient (stretch factor)
g = a*abs(c+cos(v)*a)
if g >= RNDRANGE(0, gmax)
// Accept the point
return [x, y, z]
end
end
如果您有 n 维环面生成公式,可以使用类似的方法在该环面上生成均匀随机点(如果梯度范数等于或超过 [0, @987654344 中的随机数,则接受候选点@),其中gmax 是梯度的最大范数)。