1

我有一组对象(我们称之为points),其中包含它们在某个确定空间内的位置的 x-y-和 z-分量。我想对 中的对象之间的交互进行建模points,但是,除非我能快速找到集合中与该集合中的一个对象之间的距离小于一定距离的对象,否则我不能这样做。

这无疑听起来有点不清楚,所以让我换一种说法:如果第一个点points有坐标<x, y, z>,我想弄清楚哪个对象points与第一个点的距离小于[某个任意值] .

我正在考虑在 Java 中实现 R-Tree 来执行此操作,但我觉得这是一个足够常见的问题,存在一个更简单的解决方案。如果没有,我将不胜感激对查询 R-Tree 以查找x与树中x已知对象有一定距离内的对象的方法的简单解释。

编辑:注意这些对象的位置值将会改变

4

3 回答 3

1

编辑:Square = Cube(但是在 2D 空间中想象它可能会更好,然后您可以轻松地将其转换为 3D)

我在想,我想我解决了。然而,这只是“我的”解决方案,我没有参考。

您创建类“Square”,它具有该对象中的位置、宽度和点列表。

所有方块都将根据它们的位置存储在数组或哈希图中,因此如果您知道要寻找的位置,就可以快速访问它们。

所有方格都会有规律地分布,所以——从“点实例​​”的角度来看——你不必知道所有现有的方格就可以在恒定时间内找出你属于哪个方格。(例如:我知道有宽度为 40 的正方形,它们的分布距离为 20。我在位置 10001,所以我知道我属于位置 9980 和 10000 的正方形)

正方形会相互交叉,因此一个点可以在多个正方形中。

当你做某事时,对于每个点,你只检查点,这些点存储在该点所属的方格中。当然 - 正方形必须足够大并且足够交叉才能实现您的目标。

当点移动时,它们负责注册和取消注册到方格中。


一维示例:

类:Line segmentPoint

Attrributes:

Line segment: int position,List<Points> points

Point: int position,List<LineSegment> lineSegments

我只想与距离为 20 的点进行交互。

所以我创建Line segments了宽度为 40 的实例,并将它们一一放置在 20 的距离内。

所以他们将在位置 0, 20, 40, 60 ....

第一个将覆盖区域 0-40,第二个将覆盖区域 20-60 等。

我将它们放入数组中,并且位置已知,我可以快速访问它们:arrayOfLineSegments[position/20]

当我创建点时,我将他添加到line segments它所属的位置。

当我更新时,每个点只与 lineSegments 中的点交互。

当我移动点时,它会注册和注销它所属的 lineSegments。

于 2014-02-26T03:04:26.340 回答
1

R*-tree 是一个非常好的数据结构,特别是当点发生变化时。实际上,它是为改变而设计的。

kd-tree 更简单,但它不能很好地支持更改。它专为一次性批量施工而设计。

但是,由于您的数据只有三个维度:如果您的数据足够小以适合内存,并且 x、y、z 的最大值和最小值已知,则八叉树或简单网格可能是简单性和性能的权衡你需要。

特别是如果您事先修复了查询半径,则很难击败网格文件。当您需要支持多个半径、窗口查询、最近邻查询和所有这些时,R*-trees 会变得很有吸引力。

于 2014-02-26T12:04:23.797 回答
0

您可以使用 for 循环来检查对象数组。

使用以下公式:d = sqrt[(x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2]

x1,y1,z1 是第一个点,Pointsx2,y2,z2 是您正在检查的对象的点。这将检查您的已知点与所有其他点。如果距离 (d) 小于您想要的距离x,则执行您希望程序执行的任何操作。

于 2014-02-26T02:57:33.663 回答