Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

18.02.2012, 22:33

geschlossener Pfad finden

Hallo zusammen!

Ich versuche ein alten Klassiker neu aufzusetzen und muss nun in einer 2D-Matrix
geschlossene Pfade finden.
Beispiel:
..xxx...
.xx.x...
.x..x..x
.xxxx..x
..x....x

Hier befindet sich eine "geschlossener Pfad". Dieser Pfad umrandet eine Gebiet.
Diese Gebiet muss ich identifizieren und intern markieren.
Der Pfad ist nur geschlossen, wenn kein "Diagonalsprung" erfolgt, d.h.
der Pfad muss immer in einer der 4 Himmelsrichtungen fortgesetzt werden.

Meine ersten Versuche haben mir gezeigt, dass ich auf viele Dinge
achten muss, die die Komplexität extrem steigern und somit die Rechenlast
anheben.

Daher hier die Frage an die Profis, ob es nicht eine elegantere Methode
gibt, die umschlossenen Räume zu finden? Derzeit arbeite ich mit rekursiv
aufrufenden Methoden.

Übrigens ist folgende Matrix ebenfalls valide:

....xxxxxxx.......xxx
...xx.....xxxxx...x.x
....x.xxx.xx..xx..xxx
....x.x.x.x...x.....x
...xx.xxx.xx.xxxxxx..
..xx......xxxx.......
..xxxxxxxxx.......xxx

Es sind daher Donut-Objekte, angrenzende und
"nicht angrenzende" geschlossende Pfade möglich.
Bei allen geschlossenen Objekten können "Nasen"
enthalten sein.

Vielleicht hat jemand eine schöne Idee oder vielleicht
sogar eine Lösung in der Schublade.

Ich freue mich auf Anregungen.

Grüße
Jens

P.S. Das Ganze findet momentan in HTML5 (Javascript) statt :-)

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

18.02.2012, 22:42

Du versuchst einen Zyklus in einem Graphen zu finden. Über das Problem haben sich schon viele andere vor dir Gedanken gemacht;) Deine Matrix kannst du ja relativ einfach in einen Graphen überführen. Dabei kannst du dann selbst sagen, dass für die Diagonalen keine Kanten angelegt werden. Ist es das was du genau suchst? Oder geht es dir eigentlich eher um die Felder die nicht im Graphen sind und du möchtest nun genau den Verlauf darum haben? Wenn es darum geht, könntest du mal Floodfill angucken. Du nimmst ein zufälliges Feld, welches kein Weg ist, füllst dann die Fläche, dabei erhälst du dann genau deinen Raum. Wenn du jetzt wissen möchtest, ob auch diagonal kein weiterer Raum angrenzt, könntest du ja auch so schon relativ einfach die Tiles rund um den Raum abfragen. Damit hättest du dann schon eine Lösung für dieses Problem. Vielleicht habe ich dich aber auch nicht richtig verstanden.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

3

19.02.2012, 00:06

Du ersetzt durch Floodfill alle . durch O. Die X bleiben wie sie sind, und die übrig gebliebenen . sind dann deine Innengebiete. Floodfill ist sehr einfach und hat lineare Laufzeit zum Matrixvolumen, ein schlechter Graphenalgorithmus wäre vermutlich komplexer.
Du musst dir nur noch überlegen, von wo du überall Floodfill starten musst. Vielleicht von sämtlichen Randpixeln, vielleicht nur von einer Ecke, du musst dir halt überlegen, wie du "Innen" definieren willst.
Lieber dumm fragen, als dumm bleiben!

4

19.02.2012, 07:01

Super!

Wenn man sich mal einen Weg überlegt hat, dann ist es schwer einen anderen zu finden. Vielen Dank für den floodfill-Hinweis.
Das ist genau das, was ich brauche.
Ich denke, ich werde all Randpunkte abarbeiten müssen, um sicher zu gehen, dass alle
Außenpunkte gefunden werden.

Bei meinem Floodfill-Ansatz muss ich aber alle Diagonalfelder abarbeiten, damit die
am Ende übrig gebliebenen Felder definitiv geschlossen sind.

Grüße
Jens

Werbeanzeige