Grenzkoordinaten aus einem gegebenen Satz von Punktkoordinaten finden?


18

Wie finden wir die Grenzkoordinaten, wenn ein Satz von Koordinaten gegeben ist?
Satz von Koordinaten <== Abbildung 1
Unter Berücksichtigung der Koordinaten im obigen Satz, wie kann ich die Koordinaten an der roten Grenze erhalten. Grenze ist das Polygon, das durch die Eingabekoordinaten für Eckpunkte so gebildet wird, dass die Fläche maximiert wird.

Ich arbeite an einer App, die Objekte in einem Umkreis von 'x' Meilen um eine Stadt sucht . Was ich habe ist:

  1. Koordinaten aller Eigenschaften.
  2. Eine Reihe von Koordinaten für jede Stadt (ich habe eine Koordinate für jede Postleitzahl. Und da die meisten Städte mehr als eine Postleitzahl haben, hat jede Stadt eine Reihe von Koordinaten)

Der Grund, warum ich nach der maximalen Fläche frage, ist, dass ich kein Polygon wie das folgende finde:

krummes Polygon <== Abbildung 2

Was ich brauche, ist der Algorithmus , um den Satz von Koordinaten für die Grenze zu finden. Ein Algorithmus, mit dem ich die Grenzkoordinaten für Abbildung 1 ermitteln kann .



4
Nein, nicht duplizieren, das ist konvexer Rumpf, nicht konkav
Nicklas Avén

1
Suchen Sie Code, theoretische Referenzen oder Lösungen in bestimmten vorhandenen Softwareumgebungen?
WolfOdrade

1
@Khaja Nein, Sie möchten den Bereich nicht maximieren, sondern ihn unter allen konvexen Polygonen mit den Punkten minimieren . (Die einzige Möglichkeit, die Fläche zu maximieren, besteht darin, die gesamte Welt als
umschließendes

1
@whuber Ja, jetzt verstehe ich was du meinst, ich möchte ein konvexes Polygon mit der minimalen Fläche. Mein letztendliches Ziel ist es, eine Annäherungssuche durchzuführen. Wir möchten, dass unsere Umgebungssuche funktioniert: Wenn wir in einer bestimmten Stadt (konvexer Rumpf) innerhalb von "x" Meilen nach Häusern suchen (jedes Haus hat eine Koordinate), sollte sie mir alle Häuser geben, die sich entweder innerhalb der befinden konvexen Rumpf oder sind in einem orthogonalen Abstand von weniger als "x" Meilen
Khaja Minhajuddin

Antworten:


21

Es gibt viele Algorithmen, um dieses Problem zu lösen ( Wikipedia "Convex_hull_algorithms" ):

  • Geschenkverpackung aka Jarvis Marsch - O (nh): Einer der einfachsten Algorithmen. Es hat O (nh) Zeitkomplexität, wobei n die Anzahl der Punkte in der Menge und h die Anzahl der Punkte in der Hülle ist. Im schlimmsten Fall ist die Komplexität O (n2).
  • Graham-Scan-O (n log n): Etwas ausgefeilterer, aber wesentlich effizienterer Algorithmus. Wenn die Punkte bereits nach einer der Koordinaten oder nach dem Winkel zu einem festen Vektor sortiert sind, benötigt der Algorithmus O (n) Zeit. [ Pseudocode ]
  • QuickHull: Wie der QuickSort-Algorithmus hat er die erwartete Zeitkomplexität von O (n log n), kann aber im schlimmsten Fall zu O (nh) = O (n2) ausarten. [ illustrierte Beschreibung ]
  • Teilen und erobern - O (n log n): Dieser Algorithmus ist auch auf den dreidimensionalen Fall anwendbar.
  • Monotone Kette - O (n log n): Eine Variante des Graham-Scans, bei der die Punkte lexikographisch nach ihren Koordinaten sortiert werden. Wenn die Eingabe bereits sortiert ist, benötigt der Algorithmus O (n) Zeit.
  • Algorithmus für inkrementelle konvexe Hülle - O (n log n)
  • Ehe vor der Eroberung - O (n log h): Optimaler ausgangssensitiver Algorithmus.
  • Chans Algorithmus - O (n log h): Einfacherer optimaler ausgangssensitiver Algorithmus.

Vielen Dank für die Auflistung dieser @underdark ... welches ist Ihre Wahl?
Marin




1

Wenn Sie möchten, dass ein Algorithmus dies ausführt (anstatt Pakete, die dies ausführen können), müssten Sie die Daten wahrscheinlich triangulieren. oder definieren Sie im Grunde eine Linie von jedem Punkt zu jedem anderen Punkt. Beginnen Sie dann an dem Punkt mit dem höchsten Y-Wert (sagen wir) und zeichnen Sie eine Route entlang der Verbindungslinie mit dem kleinsten Außenwinkel / der kleinsten Außenpeilung nach.

Sie können die Verfolgung beschleunigen, indem Sie sich überschneidende Linien zuerst wegwerfen. Die Außengrenze hat keine Schnittpunkte.

Übrigens - FME erledigt dies auch mit den Transformatoren ConvexHullAccumulator oder ConvexHullReplacer!


1

Wenn Sie sich einen vorhandenen, in Code implementierten Algorithmus ansehen möchten, verfügt NetTopologySuite über einen Algorithmus, der dies ermöglicht

Siehe ConvexHull.cs

Im Übrigen sind NTS und eine Reihe anderer Bibliotheken in einem coolen Projekt namens DotSpatial zusammengefasst, das hier zu finden ist

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.