在n维环面的表面上生成随机点

时间:2014-10-10 13:24:09

标签: math random geometry evolutionary-algorithm

我想生成位于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维。对此事的任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

我猜你可以递归地做到这一点。从矢量空间的完整标准正交基础开始,并将当前位置作为原点。在每个步骤中,选择由前两个坐标向量跨越的平面中的点,即取w1 = cos(t)* v1 + sin(t)* v2。移动其他基矢量,即w2 = v3,w3 = v4,....也可以从w1方向的当前位置向前迈出一步,并在前面选择半径r1。当你只剩下一个基础向量时,那么当前点就是最外层递归调用的n维环面上的一个点。

请注意,虽然上述内容可用于随机选择点,但不会统一选择它们。这可能是一个更难的问题,你绝对应该在Math SE或者Cross Validated (Statistics SE)上询问数学问题,以便在你担心实施之前得到正确的数学。

答案 1 :(得分:0)

n圆环(n是圆环表面的维数;百吉饼或圆环因此是2圆环,而不是3圆环)是n矩形的平滑映射。解决这个问题的一种方法是在矩形上生成点,然后将它们映射到环面上。除了弄清楚如何将矩形映射到圆环上的问题(我现在还不知道),存在这样的问题:即使点的分布是圆的,圆环上的点的分布也是不均匀的。矩形上的均匀。但必须有一种方法来调整矩形上的分布,使其在圆环上均匀。

答案 2 :(得分:0)

仅均匀地生成uv并不一定要从圆环表面均匀采样。需要额外的步骤。

J.F。威廉姆森(Williamson),“随机选择分布在曲面上的点”,物理学与生物学 32(10),1987年,描述了一种选择参量表面上均匀随机点的一般方法。它是一种接受/拒绝方法,根据其拉伸因子(梯度范数)接受或拒绝每个候选点。要将这种方法用于参数化曲面,必须了解该曲面的几件事,即

  • x(u, v)y(u, v)z(u, v),它们是从二维坐标uv生成3维坐标的函数,< / p>

  • uv的范围,

  • g(point),表面上每个点的梯度范数(“拉伸因子”),以及
  • gmax,整个表面的最大值g

对于您在问题中给出的带有参数化的3维环面,ggmax如下:

  • 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,{{ 1}}),其中gmax是最大梯度范数。