Direkte Wegsuche
Verfasst: 09.09.2008 00:20
Vorwort
Nach vielen schlaflosen Nächten habe ich es nun geschafft
eine funktionsfähige direkte Wegsuche zu programmieren.
Derzeit biete ich euch nur eine Demo-Anwendung,
bei der ihr selber Start und Ziel verschieben könnt
und Mauern setzen könnt.
Dies dient dazu mehr Ergebnisse zu sammeln,
sodass ihr mit BUGs oder nicht ganz richtig berechnete Wege
zeigen könnte (ScreenShot mit F12)
Später werde ich dann den Quellcode freigeben,
sodass ihr es in Spielen verwenden könnt.
Infos
- Wegsuche ist Thread-basierend (behintert während der Suche nicht das Hauptprogramm)
Vorteile
- Felderlose Wegsuche
- freies Setzen von Mauern und Start/Ziel-Punkt im Zahlenbereich FLOATs
- Enorm schnelle Wegfindung bei riesigen Karten
- genaue "umfahrung" von unregelmäßigen Mauern
Nachteile
- schneller Anstieg der Berechungszeit bei ungünstiger Mauerlage
ScreenShot

PathFind.zip - Quellcode von Demo, PathFind und Includes
PathFind - Demo Nur als Anwendung
Inhalt:
PathFind-Demo.pb ; Beispiel für die Anwendung
PathFind.pbi ; Haupt-Include für das Wegfinden
Math.pbi, Vector2D.pbi und Line2D.pbi ; Diese sind für die PathFind.pbi notwenig, weil ich das nicht alles mit in die PathFind quetschen wollte. Logischerweise sind dabei auch unbenutze Proceduren dabei, diese gelten hiermit als mit "veröffendlicht"
Mouse.pbi ; ist noch für die Demo notwenig.
Meine Code sind immer etwas "knapp" Kommentiert, bitte nicht übel nehmen
Zur Frage:"Wie sieht denn deine Thread-Arbeitsverteilung aus ?"
Mit einer Procedure wird halt ein Thread gestartet:
CreateThread(@FindPathThread(), *PathTree)
dieser Thread arbeitet nun (völlig unabhängig von außen)
Wenn der Weg gefunden ist, endet der Thread und ExaminePath wird 1 und man kann die Wegpunkt auslesen.
Wenn man nun während der Wegsuche n neue Linie setzt wird die aktuelle wegfindung gekillt, dass das so hart sein muss, kann dabei jeder selber entscheiden ich habe halt FreePath eingebaut.
Schauts euch einfach an.
PS: sobalt auch nur ein Byte geändert wird, verfällt die Rückgabegarantie
... kleiner witz ^^
Noch n kleiner AnwendungsHinweis:
Falls jemand diese Wegfindung bei "normalen" Quadratischen oder Rechteckigen Gebäuden anwenden will, dann braucht man dort nicht 4 Seitenwände, sondern ein Kreuz aus den Diagonalen erfüllt auch den Zweg und man braucht nur 50% der Wände.
Natürlich muss man dann noch verhindern das jemand das Ziel IN DAS Gebäude setzt.
Nach vielen schlaflosen Nächten habe ich es nun geschafft
eine funktionsfähige direkte Wegsuche zu programmieren.
Derzeit biete ich euch nur eine Demo-Anwendung,
bei der ihr selber Start und Ziel verschieben könnt
und Mauern setzen könnt.
Dies dient dazu mehr Ergebnisse zu sammeln,
sodass ihr mit BUGs oder nicht ganz richtig berechnete Wege
zeigen könnte (ScreenShot mit F12)
Später werde ich dann den Quellcode freigeben,
sodass ihr es in Spielen verwenden könnt.
Infos
- Wegsuche ist Thread-basierend (behintert während der Suche nicht das Hauptprogramm)
Vorteile
- Felderlose Wegsuche
- freies Setzen von Mauern und Start/Ziel-Punkt im Zahlenbereich FLOATs
- Enorm schnelle Wegfindung bei riesigen Karten
- genaue "umfahrung" von unregelmäßigen Mauern
Nachteile
- schneller Anstieg der Berechungszeit bei ungünstiger Mauerlage
ScreenShot
PathFind.zip - Quellcode von Demo, PathFind und Includes
PathFind - Demo Nur als Anwendung
Inhalt:
PathFind-Demo.pb ; Beispiel für die Anwendung
PathFind.pbi ; Haupt-Include für das Wegfinden
Math.pbi, Vector2D.pbi und Line2D.pbi ; Diese sind für die PathFind.pbi notwenig, weil ich das nicht alles mit in die PathFind quetschen wollte. Logischerweise sind dabei auch unbenutze Proceduren dabei, diese gelten hiermit als mit "veröffendlicht"
Mouse.pbi ; ist noch für die Demo notwenig.
Meine Code sind immer etwas "knapp" Kommentiert, bitte nicht übel nehmen

Zur Frage:"Wie sieht denn deine Thread-Arbeitsverteilung aus ?"
Mit einer Procedure wird halt ein Thread gestartet:
CreateThread(@FindPathThread(), *PathTree)
dieser Thread arbeitet nun (völlig unabhängig von außen)
Wenn der Weg gefunden ist, endet der Thread und ExaminePath wird 1 und man kann die Wegpunkt auslesen.
Wenn man nun während der Wegsuche n neue Linie setzt wird die aktuelle wegfindung gekillt, dass das so hart sein muss, kann dabei jeder selber entscheiden ich habe halt FreePath eingebaut.
Schauts euch einfach an.
PS: sobalt auch nur ein Byte geändert wird, verfällt die Rückgabegarantie

... kleiner witz ^^
Noch n kleiner AnwendungsHinweis:
Falls jemand diese Wegfindung bei "normalen" Quadratischen oder Rechteckigen Gebäuden anwenden will, dann braucht man dort nicht 4 Seitenwände, sondern ein Kreuz aus den Diagonalen erfüllt auch den Zweg und man braucht nur 50% der Wände.
Natürlich muss man dann noch verhindern das jemand das Ziel IN DAS Gebäude setzt.