Bestellung einer Liste von Punkten, die am nächsten zu einem bestimmten Punkt
Ich versuche, um eine Liste der Punkte, durch die Entfernung von einem gegebenen Punkt.
Ist die Anwendung zu finden, die nächsten Sehenswürdigkeiten (gps-Koordinaten), um Ihre aktuelle gps-Koordinate.
wenn du also folgenden code :
public static void main(String[] args) throws SQLException {
ArrayList<Point2D.Double> points = new ArrayList<Point2D.Double>();
Point2D.Double point1 = new Point2D.Double(1,1);
Point2D.Double point2 = new Point2D.Double(2,2);
Point2D.Double point3 = new Point2D.Double(3,3);
points.add(point1);
points.add(point2);
points.add(point3);
Point2D.Double myPoint = new Point2D.Double(4,4);
}
Wenn ich einen Komparator zum Sortieren der Punkte-array bekomme ich eine schön geordnete Liste von Punkten, aber wie finde ich heraus, welche näher zu myPoint? und was sind die Entfernungen.
Sollte sicherlich meine Frage beantworten, aber für bonus-Punkte.. wie kann ich beschränken, das Ergebnis der Punkte zurück, wenn Sie geben eine maximale Entfernung. eg : Rückkehr eine geordnete Liste von Koordinaten, die nicht weiter als 100 Meilen.
- Wie willst du den Abstand berechnet werden? Euklidische Distanz? Manhattan-Distanz? Und das sieht eher wie eine Hausaufgaben-Frage ...
- Ich habe keine Ahnung, um ehrlich zu sein. Das ist alles neu für mich. und ich versichere Ihnen, es ist nicht Hausaufgaben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zuerst ein paar kleinere Sachen:
ArrayList
aber nur alsList
( Was bedeutet es, "das Programm um eine Schnittstelle"? )Point2D.Double
, aber nur alsPoint2D
Bezüglich der eigentlichen Frage: Die
Point2D
schon Klasse besitzt Methoden für die (euklidische und andere) Distanz-Berechnungen. Aber für einen Punkt die Speicherung von geo-Koordinaten, die Sie haben könnten, zu implementieren, die Abstand-Funktion auf Ihrem eigenen.Im Allgemeinen einen Komparator, der vergleicht, die durch die Entfernung zu einem bestimmten Zeitpunkt umgesetzt werden können, wie im folgenden Beispiel:
Die Frage über die Begrenzung der Zahl der Punkte wurde auch gezielt in diesem Beispiel: Es werden nur die Punkte zurückgegeben, die haben einen Abstand, der nicht größer als
maxDistance
. Allerdings werden Sie immer noch Art die ganze Liste der Punkte. Wenn Sie vermeiden möchten, Sortieren Sie die ganze Liste, dann verwandelt sich in ein "K Nächste Nachbarn" - problem ( http://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm ), wo Sie Sie verwenden können, einige wirklich anspruchsvolle Daten-Strukturen...Haben Sie sich überlegt mit dieser Algorithmus - Planare Teile und herrsche?
Auch Sie erwähnen, mithilfe von GPS-Koordinaten, wenn diese gespeichert sind als Längen - /Breitengrad, vielleicht sollte man verwenden Haversine Formel zu berechnen Entfernungen.
Einfach Mathematik überprüfen.
Edit: Hinzugefügt dot in b2x
Point2D
Klasse. 2.: Um einen Vergleich der Punkte durch Ihre euklidische Distanz, die Sie verwenden können, die Quadrat Distanz (und speichern Sie diesqrt
Berechnung). Und 3.: Computing x2 alspow(x,2)
ist schrecklich ineffizient. Sollten Sie verwendenx*x
statt.Wenn Sie der geordneten Liste können Sie sich dann für den nächsten Punkt, indem Sie schreiben zwei Listen, wo man sich für X-Koordinaten und eine für die Y-Koordinaten. Dann überprüfen Sie die position der Punkte in der Liste und der mit den niedrigsten Indizes ist der nächste Punkt.
Nur ein Vorschlag.
}
Diese sollen die Arbeit machen:
0.3
und0.1
, dann wird der Komparator zurück0
aufgrund der Besetzung zuint
. Sollten Siereturn Double.compare(dist1, dist2)
statt.