双曲面的采样点
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维坐标的函数=],
范围u
和v
,
g(point)
,曲面上每个点的梯度范数(“拉伸因子”),以及
gmax
,整个面的最大值g
。
那么算法就是:
- 在曲面上生成一个点,
xyz
。
- 若
g(xyz) >= RNDU01()*gmax
,其中RNDU01()
为[0, 1)中的均匀随机数,接受该点。否则,重复此过程。
对于参数为a=b=c=1的双曲面:
- 梯度为
[2*x, -2*y, 2*z]
。
- 梯度范数的最大值为:
2*sqrt(3)
,如果x
、y
、z
都在[0, 1]区间内。
只剩下将隐式公式变成参数方程,它是二维坐标u
和v
的函数。我知道这个算法适用于参数化曲面,但我不知道如果我们在步骤 1 中“在 [0,1] 中随机选择 x 和 y,然后填写使公式相等的 z 值”,它是否仍然有效.
双曲面的公式为
-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维坐标的函数=],范围
u
和v
,g(point)
,曲面上每个点的梯度范数(“拉伸因子”),以及gmax
,整个面的最大值g
。
那么算法就是:
- 在曲面上生成一个点,
xyz
。 - 若
g(xyz) >= RNDU01()*gmax
,其中RNDU01()
为[0, 1)中的均匀随机数,接受该点。否则,重复此过程。
对于参数为a=b=c=1的双曲面:
- 梯度为
[2*x, -2*y, 2*z]
。 - 梯度范数的最大值为:
2*sqrt(3)
,如果x
、y
、z
都在[0, 1]区间内。
只剩下将隐式公式变成参数方程,它是二维坐标u
和v
的函数。我知道这个算法适用于参数化曲面,但我不知道如果我们在步骤 1 中“在 [0,1] 中随机选择 x 和 y,然后填写使公式相等的 z 值”,它是否仍然有效.