如何在给定n及其短轴长度(可以假定长轴为x轴且大小为1)的椭圆内均匀分布n个点?或者,如果那不可能,那么如何选择n个点,以使任意两个点之间的最小距离最大化?
现在,我对运行昂贵的电子排斥模拟器感到不安(希望有一个更好的解决方案,例如this question中的向日葵函数,以便将n个点分布在一个圆中)。 n最有可能在10到100点之间,但是如果它对所有n都有效,那将是很好的。
答案 0 :(得分:1)
相当简单的方法:
使D距离近似为D=Sqrt(Pi*b/N )
的初始值,其中b是短轴长度。
生成像元大小为D的点的三角形网格(带有等边三角形,以提供最密集的堆积)。计数给定椭圆内的点的数量。
如果它小于N,则将距离D减小,将其增大-将D增大。重复直到恰好有N个点在内部。
依赖性CountInside <=> D
是固定起点的单调,因此您可以使用二进制搜索更快地获得结果。
在边界附近可能会有2-4个对称点的复杂情况-当它们同时出入或进入内部时。如果遇到这种情况,请稍微移动起点。
答案 1 :(得分:1)
如果椭圆以(0,0)
为中心,如果a=1
是长半径,b
是短半径,并且主轴是水平的,则椭圆的方程为{{ 1}},其中x' A x = 1
是矩阵
A
现在,这是一种使用公式 / \
| 1 0 |
| 0 1/b² |
\ /
在椭圆内部进行均匀采样的方法。取x' A x = r
的上三角Cholesky因子,说A
。在这里,U
就是
U
在以 / \
| 1 0 |
| 0 1/b |
\ /
为中心且半径为y
的圆上均匀地随机选择一个点(0,0)
。然后r
是在椭圆中均匀随机选取的点。
此方法不仅在二维情况下(用“超球面”替换“圆”),还可以在任意维度上使用。
因此,对于我们目前的情况,这里是伪代码,假设x = U^{-1}y
统一生成0到1之间的数字。
random()
这是一个R代码,用于生成R = sqrt(random())
theta = random() * 2 * pi
x1 = R * cos(theta)
x2 = b * R * sin(theta)
点:
n