Polygonales Terrain-Abfragealgorithmus mit quadratischem Gitter?


7

Ich habe ein quadratisches Gelände mit festem Raster mit einem Geländetyp pro Rastereinheit in meinem Spiel und möchte eine beliebige polygonale Geländeabfrage durchführen, die alle vom Polygon eingeschlossenen / geschnittenen Rastereinheiten zurückgibt. Kann mich jemand auf einen Algorithmus dafür hinweisen?

Ich werde dies verwenden, um sicherzustellen, dass meine Schauspieler nicht durch ungültiges Gelände gehen, wenn sie sich bewegen.

Vielen Dank!

Antworten:


3

Bereiten Sie Ihr Polygon vor

Richten Sie Ihr Polygon als gerichtete Folge von Punkten / Linien ein. Dies wird in jedem Point-in-Polygon- Test beschrieben, für den unzählige Ressourcen online und in Stackoverflow / Stackexchange verfügbar sind. Daher werde ich hier nicht wiederholen.

Bereiten Sie Ihre Karte für die Abfrage vor

Weisen Sie jedem Gitterquadrat eine eindeutige ID zu.

Erstellen Sie eine Liste aller eindeutigen Scheitelpunkte (Ecken), die Ihre Gitterquadrate definieren. Für eine Karte N x M Quadrate gibt es (N + 1) x (M + 1) Ecken.

Geben Sie jeder Ecke eine Liste der Quadrate, auf die sie verweist. (zwischen 1 und 4 - die meisten sind 4, da im Allgemeinen eine Ecke am Schnittpunkt von vier Quadraten liegt).

Abfragen und lösen

Führen Sie nun für jeden Eckpunkt einen Punkt-in-Polygon-Test durch. Fügen Sie Eckpunkte, die hineinfallen, einer neuen "Innen" -Liste hinzu.

Der letzte Schritt besteht darin, zu bestimmen, zu welchen Quadraten Ihre inneren Punkte gehören. Aus diesem Grund haben wir früher Listen mit Quadraten für jede Ecke geführt. Es gibt zwei Möglichkeiten, wie Sie "Insideness" für Quadrate interpretieren können:

  • Quadrate mit nur 1 Punkt im Inneren gelten als innerhalb des Polygons.
  • Nur Quadrate, deren 4 Punkte alle in das Abfragepolygon fallen, gelten als innerhalb des Polygons.

Wenn erstere, ist es sehr einfach, gehen Sie einfach alle inneren Punkte durch und fügen Sie Quadrate, auf die sie verweisen, zu einer Menge hinzu (dh einer Liste, die keine Duplikate zulässt). Dieses Set ist Ihr Endergebnis.

Andernfalls können Sie die Referenzzählung durchführen. Richten Sie für jedes Quadrat Ihres Geländes eine Karte mit ganzzahligen Werten (Nullen) ein, die durch quadratische IDs gekennzeichnet sind. Führen Sie nun die Liste der Innenpunkte durch und fügen Sie für jedes einzelne referenzierte Quadrat in jedem dieser Innenpunkte einen zum entsprechenden Karteneintrag mit Schlüssel hinzu. Führen Sie anschließend die Karte durch und fügen Sie alle Einträge mit einer 4 im Wertefeld zu einer neuen Liste hinzu. Dies ist Ihr Endergebnis, da die 4 Ecken dieser Quadrate vollständig in das Polygon fallen.

Optimierung - OPTIONAL

Sie können den Vorgang etwas vereinfachen, indem Sie jedem Quadrat einen Mittelpunkt zuweisen und prüfen, welche davon in das Polygon fallen. Dies ist konzeptionell einfacher, aber nicht so genau wie die 4-Ecken-Prüfung. Wenn Ihnen ein gröberer Ansatz nichts ausmacht, würde ich dies empfehlen.

Letzter Tipp

Das Quantisieren von Polygonen und Polyedern in Zellen kann oft ein langwieriger Prozess sein. In solchen Fällen empfehle ich manchmal, dass Sie, wenn Sie das Rigmarole oben nicht durchgehen möchten, stattdessen einfach Ihre Spieldynamik so konstruieren, dass Ihr Polygon tatsächlich bereits eine Form aus Zellen / Blöcken ist und nicht eine schönes ordentliches Polygon. Dies macht es sehr einfach, mit der Gitterkarte zu vergleichen.

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.