双曲面的采样点

Sample points from a hyperboloid

双曲面的公式为

-x^2/a^2 - y^2/b^2 + z^2/c^2 = 1.

如何从 Python 中的双曲面生成样本? (比如说,a=b=c=1。)

我想在 [0,1] 中随机选择 x 和 y,然后填充使公式等于 1 的 z 值。然而,这不会均匀采样。有没有更好的方法?

这只是部分答案。

J.F。 Williamson,“Random selection of points distributed on curve surfaces”,Physics in Medicine & Biology 32(10),1987,描述了在参数化表面上选择均匀随机点的一般方法。这是一种 acceptance/rejection 方法,根据其拉伸因子(梯度范数)接受或拒绝每个候选点。要将此方法用于参数化曲面,必须了解有关曲面的几件事,即 -

  • x(u, v)y(u, v)z(u, v),分别是从二维坐标u和[=14生成3维坐标的函数=],

  • 范围uv,

  • g(point),曲面上每个点的梯度范数(“拉伸因子”),以及

  • gmax,整个面的最大值g

那么算法就是:

  1. 在曲面上生成一个点,xyz
  2. g(xyz) >= RNDU01()*gmax,其中RNDU01()为[0, 1)中的均匀随机数,接受该点。否则,重复此过程。

对于参数为a=b=c=1的双曲面:

  • 梯度为[2*x, -2*y, 2*z]
  • 梯度范数的最大值为:2*sqrt(3),如果xyz都在[0, 1]区间内。

只剩下将隐式公式变成参数方程,它是二维坐标uv的函数。我知道这个算法适用于参数化曲面,但我不知道如果我们在步骤 1 中“在 [0,1] 中随机选择 x 和 y,然后填写使公式相等的 z 值”,它是否仍然有效.