Ich habe eine 2D-Spielkarte, die aus mehreren "Räumen" besteht.
Hier ist zum Beispiel ein 2D-Kartenraster: (Braune Zellen = Wandkacheln)
Wenn ich auf eine Kachel klicke (die nicht braun ist), möchte ich ein Array aller Zellen in der Region erhalten, auf die ich geklickt habe. (Wenn die Region von braunen Kacheln begrenzt ist, sonst nichts tun)
Zum Beispiel gibt es im obigen Bild zwei Bereiche, die beide grau gefärbt sind. Wenn ich auf Zelle (4,4) klicke, erhalte ich ein 4x5-Array von Zellen ab (3,3).
Kennt jemand einen guten leistungseffizienten Algorithmus dafür? Ich muss idealerweise nicht quadratische Räume berücksichtigen.
Antworten:
Dies wird als Floodfill bezeichnet . Sie können es auf Wikipedia nachschlagen.
Eine Möglichkeit zur Implementierung besteht darin, eine Liste der besuchten
v
und ausstehenden Quadrate zu erstellenp
und so etwas zu tunDie Quadrate im Raum sind diejenigen, die noch übrig sind,
v
wenn Sie fertig sind.Es gibt auch verschiedene Möglichkeiten, dies zu optimieren, aber Sie sollten die Hauptidee verstehen.
quelle
nil
Werte als Wände betrachten.Ein einfacher Flutfüllungsalgorithmus passt gut zu Ihnen.
Lassen Sie es im Verlauf eine Liste mit Kacheln erstellen. Befindet sich eine benachbarte Kachel außerhalb der Grenzen Ihres Gitters, wird diese gesamte Region nicht von den braunen Kacheln begrenzt und kann ignoriert werden.
quelle