例如,在2D空间中,x [0; 1]和y [0; 1]。对于p = 4,直观地说,我将每个点放在正方形的每个角落。
但是一般的算法是什么?
答案 0 :(得分:0)
编辑:如果尺寸与彼此不正交,则需要修改算法
要按照示例中的描述统一放置点,您可以执行以下操作:
var combinedSize = 0
for each dimension d in d0..dn {
combinedSize += d.length;
}
val listOfDistancesBetweenPointsAlongEachDimension = new List
for each d dimension d0..dn {
val percentageOfWholeDimensionSize = d.length/combinedSize
val pointsToPlaceAlongThisDimension = percentageOfWholeDimensionSize * numberOfPoints
listOfDistancesBetweenPointsAlongEachDimension[d.index] = d.length/(pointsToPlaceAlongThisDimension - 1)
}
运行你的例子,它给出了:
combinedSize = 2
percentageOfWholeDimensionSize = 1/2
pointsToPlaceAlongThisDimension = 0.5 * 4
listOfDistancesBetweenPointsAlongEachDimension [0] = 1 /(2 - 1) listOfDistancesBetweenPointsAlongEachDimension [1] = 1 /(2 - 1)
注意:减号1处理包含间隔,允许维度
的两个端点处的点答案 1 :(得分:0)
2D案例
在 2D (n=2
)中,解决方案是将p
点均匀地放在某个圆圈上。如果您还想定义点之间的距离d
,则圆圈的半径应为:
2*Pi*r = ~p*d
r = ~(p*d)/(2*Pi)
更准确地说,你应该使用常规p点多边形的圆周而不是圆周(我太懒了)。或者,您可以根据需要计算生成点的距离和放大/缩小。
因此每个点p(i)可以定义为:
p(i).x = r*cos((i*2.0*Pi)/p)
p(i).y = r*sin((i*2.0*Pi)/p)
3D案例
只需使用球体而不是圆圈。
ND案例
使用 ND 超球面而不是圆圈。
所以你的问题归结为p
"等距离"指向n-D超球面(表面或体积)。正如您所看到的2D案例很简单,但在3D中这开始成为一个问题。参见:
正如你所看到的,有很多方法可以做到这一点(甚至有更多的方法甚至使用Fibonacci序列生成的螺旋),或多或少难以掌握或实现。
但是,如果要将其概括为 ND 空间,则需要选择一般方法。我会尝试这样做:
将p
均匀分布的地方置于界限超大球内
每个点应具有位置,速度和加速度矢量。您也可以随机放置点数(只确保没有位于同一位置)......
对于每个p
计算加速
每个p
都应缩回任何其他点(与重力相反)。
更新位置
在ND中进行Newton D' Alembert物理模拟。不要忘记包括一些阻尼速度,以便模拟将及时停止。将位置和速度限制在球体上,这样点就不会越过它的边界,也不会向内反射速度。
循环#2,直到任何p
的最高速度超过某个阈值
这或多或少会准确地将p
点放在 ND 超球面的圆周上。因此,它们之间的距离d
最小。如果你在n
和p
之间有一些特殊的依赖关系,那么可能会有更好的配置,但对于任意数字,我认为这种方法应该足够安全。
现在,通过修改#2 规则,您可以实现2种不同的结果。一个填充超球面(通过将大量负质量放入表面中心)并填充其体积。对于这两个选项,半径也会不同。对于一个你需要使用表面和其他卷......
此处用于解决几何问题的类似模拟示例:
此处预览3D表面案例:
顶部的数字是用于确定模拟停止的粒子的最大abs速度,而白色线是速度矢量。您需要仔细选择加速度和阻尼系数,以便模拟速度快......