我想生成位于n维环面上的随机点。我找到了如何在3-dimensional torus表面上生成点的公式:
x = (c + a * cos(v)) * cos(u)
y = (c + a * cos(v)) * sin(u)
z = a * sin(v)
u,v∈[0,2 * pi]; c,a> 0。
我的问题是:如何将此公式扩展到n维。任何有关此事的帮助将不胜感激。
我想你可以递归地做到这一点。从矢量空间的完整标准正交基础开始,并将当前位置作为原点。在每个步骤中,选择由前两个坐标向量跨越的平面中的点,即取w1 = cos(t)* v1 + sin(t)* v2。移动其他基矢量,即w2 = v3,w3 = v4,....也可以从w1方向的当前位置向前迈出一步,并在前面选择半径r1。当您只剩下一个基础向量时,则当前点是最外层递归调用的n维环面上的一个点。
请注意,虽然上述内容可用于随机选择点,但不会统一选择它们。这可能是一个更难的问题,你肯定应该在Math SE或Cross Validated (Statistics SE)上询问数学,以便在你担心实施之前获得数学。
n圆环(n是圆环表面的维数;百吉饼或圆环因此是2圆环,而不是3圆环)是n矩形的平滑映射。解决这个问题的一种方法是在矩形上生成点,然后将它们映射到环面上。除了弄清楚如何将矩形映射到圆环上的问题(我现在还不知道),存在这样的问题:即使点的分布是圆的,圆环上的点的分布也是不均匀的。矩形上的均匀。但必须有一种方法来调整矩形上的分布,使其在圆环上均匀。
仅仅均匀地生成u
和v
不一定从圆环表面均匀地采样。还需要一个额外的步骤。
J.F.Williamson,“曲面上分布的点的随机选择”,Physics in Medicine&Biology 32(10),1987,描述了在参数表面上选择均匀随机点的一般方法。它是一种接受/拒绝方法,根据其伸展因子(梯度范数)接受或拒绝每个候选点。要将此方法用于参数曲面,必须了解表面的一些事项,即 -
x(u, v)
,y(u, v)
和z(u, v)
,它们是从二维坐标u
和v
生成三维坐标的函数,u
和v
的范围,g(point)
,表面上每个点的梯度(“伸展因子”)的范数,和gmax
,整个表面的g
的最大值。对于您在问题中给出的参数化的三维圆环,g
和gmax
如下:
g(u, v) = a * (c + cos(v) * a)
。gmax = a * (a + c)
。在环面半径为c
和管半径为a
的三维环面上生成均匀随机点的算法如下(其中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,gmax
中的随机数],则接受候选点,其中gmax
是最大的梯度范数)。