ボックス内にあるすべてのポイント 2D (x、y) を見つけるための最速の方法を取得するアルゴリズムを探しています (ボックスは 2 つのポイントで定義されます: lowerLeft と upperRight)。
2D 空間に 200 万点あるとします。
その 2D 空間で、2 つの点からどこかにボックスを作成します。1 つは左下、もう 1 つは右上です。ボックスにあるすべてのポイントを取得する最速の方法は何ですか? 最悪のシナリオの Java テストを次に示します。各ポイント (200 万!) をループし、ボックス内にあるかどうかを判断します。ポイントのリストを最初に並べると、本当に高速になると確信しています...
アイデアはありますか?
public class FindPointsInBox {
public static void main(String[] args) throws Exception {
// List of 2,000,000 points (x,y)
List<Point> allPoints = new ArrayList<Point>();
for(int i=0; i<2000000; i++) {
allPoints.add(new Point(46 - (Math.random()), -74 - (Math.random())));
}
// Box defined by 2 points: lowerLeft and upperRight
List<Point> pointsInBox = new ArrayList<Point>();
Point lowerLeft = new Point(44.91293325430085, -74.25107363281245);
Point upperRight = new Point(45.3289676752705, -72.93820742187495);
Date t1 = new Date();
// TODO: What is the fastest way to find all points contained in box
for(int i=0; i<allPoints.size(); i++) {
if(isPointInBox(allPoints.get(i), lowerLeft, upperRight))
pointsInBox.add(allPoints.get(i));
}
Date t2 = new Date();
System.out.println(pointsInBox.size() + " points in box");
System.out.println(t2.getTime()-t1.getTime() + "ms");
}
private static boolean isPointInBox(Point p, Point lowerLeft, Point upperRight) {
return (
p.getX() >= lowerLeft.getX() &&
p.getX() <= upperRight.getX() &&
p.getY() >= lowerLeft.getY() &&
p.getY() <= upperRight.getY());
}
}