Ich habe ein Gitter mit Plättchen in einem Spiel und jedes Plättchen kann eine bestimmte einfache Form haben.
Ich möchte in der Lage sein zu bestimmen, ob die kombinierte Form aus einer bestimmten Anordnung dieser Kacheln zu einer "ungebrochenen" oder "gebrochenen" größeren Form führt.
Zum Beispiel; Dies ist ein Beispiel für eine "ungebrochene" Form ...
Und dies ist ein Beispiel für eine "gebrochene" Form ...
Ich werde in der Lage sein, den erforderlichen Code zu schreiben, sobald ich die Logik dieses Problems herausgefunden habe, aber bisher habe ich Probleme.
Ich habe Datentabellen ausprobiert, die jeder Kachel zugeordnet sind und deren Kanten beschreiben, zum Beispiel:
var edges = {
top : false,
right : true,
bottom : true,
left : false
}
Und daraus kann ich feststellen, ob jede Kachel mit ihren Nachbarn verbunden ist. Dies hilft jedoch nicht in allen Situationen.
EDIT 1: Mehrere Cluster von isolierten "ungebrochenen" Formen würden als "gebrochene" Form betrachtet ...
EDIT 2:
Eine "ungebrochene" Form kann auch erreicht werden, wenn die Kante einer Formkachel nicht mit jeder benachbarten Kachel verbunden ist, sondern nur eine Verbindung. Zum Beispiel würde ich dies als "ungebrochen" betrachten ...
Hat jemand Ideen dazu?
Antworten:
Dies ist ein grundlegendes Problem mit verbundenen Komponenten und kann mit einem einzigen Aufruf der Breitensuche oder Tiefensuche oder einem beliebigen Flood-Fill-Algorithmus gelöst werden.
Der obige Code sagt Ihnen nur, ob Sie genau eine Gruppe haben.
Wenn Sie zählen möchten, wie viele Gruppen es gibt, können Sie dies tun, indem Sie die äußere while-Schleife in eine Weile einschließen (numVisited <tiles.GetNonEmptyTileCount ()), wobei Sie die innere while-Schleife jedes Mal mit einer neuen nicht besuchten Kachel versehen und Ihre Gruppe erhöhen Anzahl.
Beachten Sie, dass
tile.IsConnecedTo(neighbour)
genau dann true zurückgegeben werden sollte, wenn beidetile
undneighbour
entlang ihrer gemeinsamen Kante eine Verbindung herstellen. (dh wenn einetile
Verbindung zum gemeinsam genutzten Edge hergestellt wird, dies jedochneighbour
nicht der Fall ist, sollte false zurückgegeben werden.)Bearbeiten: Hier ist eine rekursive Version:
quelle
Zeichnen Sie die Scheitelpunkte als Linien an den Kanten auf, an denen Formpunkte liegen. Diese werden verwendet, um bei jedem Kartenwechsel bis zu Punkten / Linien auf den anderen Kacheln abzugleichen.
Zum Beispiel:
Über den blauen Linien auf den oberen beiden Kacheln wurden A und B für jede Kante der Kachel entsprechend der darin enthaltenen Form berechnet / gespeichert (beachten Sie, dass Sie die Linie zum Vergleich mit einer einfachen Ganzzahl extrahieren können, obwohl sie sich auf verschiedenen Seiten befinden Werte von 0 -> X.)
Im unterbrochenen Beispiel stimmen die Linien nicht überein, sodass Sie sagen können, dass das Bild unterbrochen ist. Speichern Sie die Daten als zusätzliche Informationen in der Kachel, um sie dann zum Vergleich zu verwenden. Wenn Sie eine festgelegte Anzahl von Kantentypen haben (volle Kante, halbe Kante usw.), können Sie sogar einen Enumerator für die Seiten A, B, C und D auf jeder Kachel erstellen und entsprechend vergleichen.
In unserem Beispiel können unsere Kanten mit Werten von 0 -> 10 verglichen werden.
Um sich den Clustern ungebrochener Formen zu nähern, können Sie einfach jede Kachel durchlaufen und prüfen, ob sie mit einer der zuvor iterierten Kacheln verbunden ist:
quelle
local edges = { top = nil, right = nil, bottom = { 0, 1 }, left = { 0, 0.5 } }
(in lua) Aber das Problem, das ich habe, ist festzustellen, ob ich insgesamt eine oder mehrere "ungebrochene" Formen habeEs hört sich so an, als ob Sie nur suchen müssen, ob Ihre Kacheln gebrochene Kanten aufweisen, und einen wahren oder falschen Rücken erhalten.
In diesem Fall müssen Sie sich nur alle Stellen ansehen, an denen Kacheln zusammengefügt werden (auf der x- und der y-Achse), und prüfen, ob die Kanten kompatibel sind.
Sie haben eine Schleife ausgeführt, bis Sie entweder eine gebrochene Kante gefunden haben (und true zurückgegeben haben) oder bis Ihnen die zu überprüfenden Kanten ausgegangen sind (und false zurückgegeben haben).
Es wäre im Grunde eine for-Schleife innerhalb einer for-Schleife (eine wäre die X-Achse, die andere wäre die Y-Achse), also wäre es ein N ^ 2-Algorithmus.
Ist es das, wonach du suchst? Hilft das?
quelle