Java 从大量点数据集中计算附近点的最快方法是什么

Java 从大量点数据集中计算附近点的最快方法是什么,java,geometry,java-3d,Java,Geometry,Java 3d,我有一大组三维点(20000+),分散在整个三维空间中。我需要确定哪些点在集合中每个点的特定任意范围内。例如,对于每个点,10个单位范围内的点组是什么。这个的排列是相当大的。那么,计算效率最高的方法是什么呢?(我只需要用java来解决这个问题。)因为这是一个没有代码的理论问题,所以我在这里花2美分。如果您不使用任何几何数据库,比如postgis(),我建议您使用以下方法,前提是这些点有三个坐标(X,Y,Z) 制作三个数组,其中包含点的id和一个坐标。按坐标排序。然后,检查每个点的最后一个和下一个

我有一大组三维点(20000+),分散在整个三维空间中。我需要确定哪些点在集合中每个点的特定任意范围内。例如,对于每个点,10个单位范围内的点组是什么。这个的排列是相当大的。那么,计算效率最高的方法是什么呢?(我只需要用java来解决这个问题。)

因为这是一个没有代码的理论问题,所以我在这里花2美分。如果您不使用任何几何数据库,比如postgis(),我建议您使用以下方法,前提是这些点有三个坐标(X,Y,Z)

制作三个数组,其中包含点的id和一个坐标。按坐标排序。然后,检查每个点的最后一个和下一个是否在范围内。如果两者不一致,则消除该点。为每个数组创建一个。这样,计算空间就会大大减少。然后,对于一个点范围内的每个点,计算距离和标志,消除最远的点


希望这会有所帮助。

您可以使用,它基本上是一个k维二叉树。k-d树中的范围搜索非常有效。

使用预先分配为全尺寸的ArrayList。(使用立方体形状分区)

公共类Point3D{
公共整数x,y,z;
公共静态列表allWithinRange(列出可能的点、int x、int y、int z、int inter){
List List=newarraylist(possiblePoints.size());
possiblePoints.stream()
.filter(it->it.x=x-inter)
.filter(it->it.y=y-inter)
.filter(it->it.z=z-inter)
.forEach(列表::添加);
退货清单;
}
}

您可以使用空间填充曲线和近似值。将点视为二进制并交错。然后对数字进行排序,并利用曲线首先访问附近的点。您可以尝试许多曲线,很可能这取决于点。

听起来您需要一个曲线。或者像kd树这样的范围树,它将返回一个框中的所有点,然后您只需在距离查询点所需的距离处过滤所有点。

似乎您可以通过对点进行排序并使用滑动立方体窗口(例如边长20)来减少搜索空间。这似乎可以让你从比较中快速消除点。如果你想使用球体而不是立方体,那么你必须使用该算法对它们进行过滤(我建议在其他过滤器之后进行过滤,因为它将是一个子类别)。这是一个有趣的想法,一种分步方法+1.
public class Point3D {
    public int x, y, z;

    public static List<Point3D> allWithinRange(List<Point3D> possiblePoints, int x, int y, int z, int inter) {
        List<Point3D> list = new ArrayList<Point3D>(possiblePoints.size());
        possiblePoints.stream()
                .filter(it -> it.x <= x + inter && it.x >= x - inter)
                .filter(it -> it.y <= y + inter && it.y >= y - inter)
                .filter(it -> it.z <= z + inter && it.z >= z - inter)
                .forEach(list::add);
        return list;
    }
}