https://en.wikipedia.org/wiki/Superellipse
我已经阅读了关于如何从圆和椭圆中进行点选的SO问题。
如何从超椭圆内部均匀地选择随机点?
更一般地说,如何从任意超公式描述的曲线内部均匀选择随机点?
https://en.wikipedia.org/wiki/Superformula
丢弃方法不算是解决方案,因为它在数学上没有启发性。
答案 0 :(得分:1)
为了采样超椭圆,让我们假设a = b = 1
不失一般性。然后可以通过重新缩放相应的轴来获得一般情况。
第一象限中的点(正x坐标和正y坐标)可以parametrized设为:
x = r * ( cos(t) )^(2/n)
y = r * ( sin(t) )^(2/n)
带有0 <= r <= 1
和0 <= 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)
其中2F1
是hypergeometric函数。
为了在x,y
中获得统一采样,我们现在需要对f(t)
中t
的{{1}}范围进行统一采样,然后找到{{1} }对应于此采样值,即求解[0, pi/2]
的方程t
,其中t
是从u = f(t)
采样的统一随机变量。这基本上与u
的方法相同,不过在这种情况下,可以直接计算逆。
此方法的一个小问题是函数[f(0), f(pi/2)]
的行为不那么接近零-无穷大的斜率使其很难找到r
的根。为了避免这种情况,我们可以仅对第一个象限的“上部”(即线f
和u = f(t)
之间的区域进行采样),然后通过对称获得所有其他点(不仅在第一个象限中)象限,也适用于所有其他象限。
此方法在Python中的实现可能类似于:
x=y