Java 查找距点一定距离内的所有三维对象

Java 查找距点一定距离内的所有三维对象,java,3d,r-tree,Java,3d,R Tree,我有一组对象(我们称之为点),它们在某个确定的空间中包含其位置的x-y-和z-分量。我想对点中的对象之间的交互进行建模,但是,除非我能快速找到集合中与该集合中某个对象之间的距离小于一定距离的对象,否则我无法进行建模 这无疑听起来有点不清楚,所以让我换一种说法:如果点中的第一个点具有坐标,我想找出点中的哪些对象与第一个点的距离小于[某个任意值] 我曾考虑在Java中实现一个R-Tree,但我觉得这是一个非常常见的问题,因此存在一个更简单的解决方案。如果没有,我希望对查询R-树的方法进行简单解释,以

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

这无疑听起来有点不清楚,所以让我换一种说法:如果
中的第一个点具有坐标
,我想找出
中的哪些对象与第一个点的距离小于[某个任意值]

我曾考虑在Java中实现一个R-Tree,但我觉得这是一个非常常见的问题,因此存在一个更简单的解决方案。如果没有,我希望对查询R-树的方法进行简单解释,以便找到距离树中某个对象
x
一定距离内的对象,其中
x
是已知的


编辑:请注意,这些对象的位置值将发生变化

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

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

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

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

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

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

所有方块都将根据它们的位置存储在数组或hashmap中,所以如果您知道要查找的位置,可以快速访问它们

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

正方形将相互交叉,因此一个点可以位于多个正方形中

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

当点移动时,它们负责在正方形中注册和注销


1D示例:

类别:
线段

Attrributes:
线段
int位置
列表点

int位置
列出线段

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

因此,我创建了宽度为40的
线段的实例,并将它们逐个放置在距离为20的位置

因此,他们将处于位置0、20、40、60

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

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

创建点时,我将其添加到它所属的
线段中

更新时,每个点仅与线段中的点交互


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

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

k-d树更简单,但它不太支持更改。它是为一次性批量施工而设计的

然而,由于您的数据只是三维的:如果您的数据足够小,可以放入内存,并且x、y、z的最大值和最小值是已知的,那么一个八叉树或一个简单的网格可能是您所需的简单性和性能的折衷


特别是,如果您事先确定了查询半径,那么很难找到网格文件。R*-当你需要支持多个半径、窗口查询、最近邻查询以及所有这些时,树会变得很有吸引力。

我缺少信息,如果你用一些点创建这样的“空间”,然后,你就不会添加/删除/移动点,所以预计算是一个解决方案,恐怕我不明白你的问题/陈述。我相信你是在问这些职位是否会改变:他们会改变,这就是我所要求的:)我关心的是这需要多长时间。正如我的问题所指出的,我需要找到与我正在考虑的对象在设定距离内的所有对象。如果我的
点集
有大量点,并且我需要为每个点执行此操作,这可能会非常低效。如何在不检查所有点的情况下检查所有点?这是一个非常小的计算,除非它是一个超大数量的物体,它应该是精细的-实际上它是O(n^2),它只能用于成千上万个点。在一般情况下,创建O(n)可以有不同的做法。我会给你投票,让你对这个问题进行批判性思考,但我必须先测试它,然后才能给你检查非常有趣的信息-在我做出任何决定之前,我需要检查网格文件。网格文件和八叉树非常适合内存使用。当您必须管理磁盘上的数据时,R*-树可能是更好的选择;虽然它们在记忆中也能很好地工作。