超椭圆点拾取

时间:2018-06-22 04:59:41

标签: math random

https://en.wikipedia.org/wiki/Superellipse

我已经阅读了关于如何从圆和椭圆中进行点选的SO问题。

如何从超椭圆内部均匀地选择随机点?

更一般地说,如何从任意超公式描述的曲线内部均匀选择随机点?

https://en.wikipedia.org/wiki/Superformula

丢弃方法不算是解决方案,因为它在数学上没有启发性。

1 个答案:

答案 0 :(得分:1)

为了采样超椭圆,让我们假设a = b = 1不失一般性。然后可以通过重新缩放相应的轴来获得一般情况。

第一象限中的点(正x坐标和正y坐标)可以parametrized设为:

x = r * ( cos(t) )^(2/n)
y = r * ( sin(t) )^(2/n)

带有0 <= r <= 10 <= t <= pi/2

现在,我们需要在r, t中进行采样,以便转换为x, y的采样是统一的。为此,让我们计算该变换的雅可比行列式:

dx*dy = (2/n) * r * (sin(2*t)/2)^(2/n - 1) dr*dt
      = (1/n) * d(r^2) * d(f(t))

在这里,我们看到,对于变量r,只需对r^2的值进行均匀采样,然后以平方根进行转换就足够了。对t的依赖要复杂一些。但是,经过一番努力,一个人得到了

f(t) = -(n/2) * 2F1(1/n, (n-1)/n, 1 + 1/n, cos(t)^2) * cos(t)^(2/n)

其中2F1hypergeometric函数。

为了在x,y中获得统一采样,我们现在需要对f(t)t的{​​{1}}范围进行统一采样,然后找到{{1} }对应于此采样值,即求解[0, pi/2]的方程t,其中t是从u = f(t)采样的统一随机变量。这基本上与u的方法相同,不过在这种情况下,可以直接计算逆。

此方法的一个小问题是函数[f(0), f(pi/2)]的行为不那么接近零-无穷大的斜率使其很难找到r的根。为了避免这种情况,我们可以仅对第一个象限的“上部”(即线fu = f(t)之间的区域进行采样),然后通过对称获得所有其他点(不仅在第一个象限中)象限,也适用于所有其他象限。

此方法在Python中的实现可能类似于:

x=y

这将产生: enter image description here