我有一组对象(我们称之为points
),它包含在某个确定空间内位置的x-y和z-分量。我想模拟points
中对象之间的交互,但是,我不能这样做,除非我能够快速找到集合中与该集合中的一个对象相距一定距离的对象。
这无疑听起来有点不清楚,所以让我换一种说法:如果points
中的第一个点有坐标<x, y, z>
,我想找出{{1}中的哪些对象距离第一个点的距离小于[某个任意值]。
我正在考虑使用Java实现一个R-Tree,但我觉得这是一个普遍存在的问题,存在一个更简单的解决方案。如果没有一个,我将很感激一个简单的解释方法,通过该方法查询R-Tree,以便找到距离树中对象一定距离points
的对象,其中{{1}已经知道了。
编辑:请注意,这些对象的位置值将会改变
答案 0 :(得分:1)
编辑:Square = Cube(但想象它在2D空间中可能更好,那么你可以轻松地将它转换为3D)
我在思考,我想我已经解决了。然而,这只是“我的”解决方案,我没有参考。
您创建“Square”类,其中包含该对象中的位置,宽度和点列表。
所有正方形将根据其位置存储在数组或散列映射中,因此如果您知道所寻找的位置,则可以快速访问它们。
所有正方形将定期分发,因此 - 从“点实例”的角度来看 - 你不必知道所有现有的正方形,以便在你所属的恒定时间内找出。 (例如:我知道有宽度为40的正方形,它们按距离20分布。我处于位置10001,所以我知道我属于位置9980和10000的正方形)
正方形将相互交叉,因此一个点可以在更多正方形中。
当你做某事时,对于每个点,你只检查点,这些点存储在点所属的正方形中。当然 - 方块必须足够大并且足够交叉以实现目标。
当点移动时,他们负责注册和取消注册到正方形。
1D示例:
课程:Line segment
和Point
Attrributes:
Line segment
:int position
,List<Points> points
Point
:int position
,List<LineSegment> lineSegments
我想只与距离为20的点进行交互。
所以我创建了宽度为40的Line segments
个实例,并将它们逐个放在距离为20的位置。
所以他们将在0,20,40,60 ......
位置第一个将覆盖0-40区,第二个20-60区等。
我将它们放入阵列并且具有已知位置,我可以快速访问它们:arrayOfLineSegments[position/20]
当我创建点时,我将他添加到它所属的line segments
。
当我更新时,每个点只与lineSegments中的点交互。
当我移动点时,它会注册并取消注册它所属的lineSegments。
答案 1 :(得分:1)
R * -tree是一个非常好的数据结构,特别是在点数发生变化时。它实际上是为改变而设计的。
k-d-tree更简单,但它不能很好地支持变化。它专为一次性散装结构而设计。
但是,由于您的数据只是三维的:如果您的数据足够小以适应内存,并且x,y,z的最大值和最小值已知,则八叉树或简单的网格可能是您需要的简单性和性能的折衷。
特别是如果事先修复了查询半径,网格文件很难被击败。当你需要支持多个半径,窗口查询,最近邻查询以及所有这些时,R * -trees会很有吸引力。
答案 2 :(得分:0)
您可以使用for循环来检查对象数组。
使用以下公式:d = sqrt[(x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2]
x1,y1,z1是Points
中的第一个点,x2,y2,z2是您正在检查的对象的点。这将检查您的已知点与所有其他点。如果距离(d)小于你想要的距离x
,那么你可以做任何你想要编程的事情。