Pathfinding im Bitmap

Saiz

Grünschnabel
Beispiel Bild

So ich habe folgendes Problem.
Ich habe einen Startpunkt und ein Zielpunkt. Es muss eine Linie vom Startpunkt zum Zielpunkt gemahlt werden ohne
das er die schwarzen Wände berüht. Die Wände werden immer anders gezeichnet er muss sich also den Weg finden.

Wie macht man sowas? Hat einer Ideen oder vieleicht Lösungen?

vielen dank
 
Würde dir raten dich mit der theoretischen Informatik auseinander zu setzen, die hat solche Algos mit denen du das machen kannst. Stichwort : Hammiltionscher Pfad, traveling Salesman

Da müsstest du auch Lösungsansetze für C++ finden, wenn du googelst.

Gruss

MFC OpenGL
 
Hammiltonkreis sowie das TSP (so wurde traveling salesman abgekürzt, oder?) sind NP vollständig, wenn ich mich recht erinnere.
Ist zwar etwas länger her, aber Pathfinding ist es nicht (schlagt mich, wenn ich mich irre :-) ).
Ich würde nach Dijkstra suchen.
Da braucht man zwar einen Graphen, aber den kannst du dir mit Hilfe der Informationen über Wände auch zusammenbauen. :)
Der Algorithmus selbst ist verwirrend, aber schnell und einfach zu implementieren.
Wenn du erstmal den Graphen hast, sollte das kein Problem mehr sein.

/edit Satz verdreht :-)
 
Ja das ist ja das problem wie kriege ich den Graphen
WIe kann ich rausfinden das da eine Wand ist?
 
mueslirocker hat gesagt.:
Hammiltonkreis sowie das TSP (so wurde traveling salesman abgekürzt, oder?) sind NP vollständig, wenn ich mich recht erinnere.
Ist zwar etwas länger her, aber Pathfinding ist es nicht (schlagt mich, wenn ich mich irre :-) ).
Ich würde nach Dijkstra suchen.
Da braucht man zwar einen Graphen, aber den kannst du dir mit Hilfe der Informationen über Wände auch zusammenbauen. :)
Der Algorithmus selbst ist verwirrend, aber schnell und einfach zu implementieren.
Wenn du erstmal den Graphen hast, sollte das kein Problem mehr sein.

/edit Satz verdreht :-)

Korrekt, die Probleme sind NP-vollständig, jedoch für bestimmte kleine n durchaus in polynomialer Laufzeit lösbar ;)
 
MFC openGL,
hab doch geschrieben, dass shortes path eben nicht in NP liegt.
Wollte damit sagen, dass es nicht direkt was mit TSP und Hamilton zu tun hat. :)

<edit>
Und in wie fern hat eine Änderung von n etwas mit der Komplexität zu tun?
Ein NP Problem wird doch immer exponentiell bleiben... nur dass es bei kleinen n noch ertragbar ist.
</edit>

Saiz hat gesagt.:
Ja das ist ja das problem wie kriege ich den Graphen
Wie dick ist eine Wand? Eine Längeneinheit (wahrscheinlich Pixel) oder kann sie auch dicker sein?

Ich stand auch mal vor dem Problem.
Habe damals von jeder Ecke einer Wand aus eine Linie (horizontal und vertikal) gezogen habe, bis ich auf eine andere (ggf Außen-) Wand gestoßen bin.
Es entstand ein Raster von Sektoren. Das schöne daran war, dass ein Sektor von überall aus mit jedem angrenzenden Sektor erreichbar ist... man kann also einen Sektor auf einen Punkt (normalerweise der Mittelpunkt) reduzieren.
Verbinde die Punkte, die benachbarte Sektoren darstellen und du hast deinen Graphen.

Man kann sich auch von jeder Ecke ein kleines Stückchen diagonal (wenn es die rechte obere Ecke einer Wand ist, dann nach oben rechts) entfernen und da einen Knoten setzen... dann hat man wohl auch wirklich den kürzesten Weg (im ersten Fall würde Dijkstra nicht innerhalb der Sektoren optimieren). Bin mir nur grad nicht ganz darüber im Klaren, wie man dann Nachbarschaft feststelllt.

Saiz hat gesagt.:
WIe kann ich rausfinden das da eine Wand ist?
Keine Ahnung, was zeichnet denn eine Wand aus?
Dass die Pixel da schwarz sind?
Dann vielleicht einfach mal alles abgrasen und dabei benachbarte schwarze Pixel in ein "Wandobjekt" packen. :)
Dachte, dass du schon Informationen über Wände hast..

/edit2
Oh hab das Beispiel gar nicht gesehen.
Gibt es keine Wände innerhalb des Feldes?
Dann geht es doch vielleicht noch einfacher oder?
Man versucht direkt zum Ziel zu laufen.
Stößt man auf eine Wand, geht man so lange links und rechts an der Wand lang, bis man den Kurs wieder aufnehmen kann.
Bin mir aber nicht sicher, ob es da Probleme geben kann... ist nur eine spontane Überlegung.

/edit3
Hab mal den Graphen, den du erzeugen müsstest, in das Beispiel gemalt.
Start und Ziel müssen logischerweise auch noch Konten darstellen. :)
Wie man da die Nachbarschaft einfach feststellt, weiß ich leider immernoch nicht.
Zur Not einfach jeden Punkt zwischen zwei Knoten (auf direkter Linie) prüfen.

Wie man Wände erkennt... naja, wenn die Zeichnung so ungenau ist, wie in deinem Beispiel, könnte es Probleme geben. :(
Man braucht ja eigentlich nur die Eckpunkte und Informationen darüber was für eine Ecke es ist (links oben, rechts oben, links unten, rechts unten)...

/edit4
Und hier noch der Graph nach meiner ersten Methode.
Nachteil ist ziemlich eindeutig.
Es werden schnell viele Sektoren (vielleicht auch mal sehr schmale Sektoren).
Ferner wird nicht exakt der kürzeste Weg berechnet und wenn man so wenige große Sektoren hat, wird die Geschichte sehr ungenau.
Dafür hat ein Knoten maximal 4 Nachbarn. Das ist wichtig für Dijkstra, wenn ich mich recht erinnere.
Bei vielen Wänden kann die zweite Methode auch Probleme bereiten, da ein Punkt einer Ecke vielleicht schon hinter oder in einer anderen Wand liegen kann. Das kann bei der ersten Methode nicht passieren. :)
 

Anhänge

  • opr00UTN2.JPG
    opr00UTN2.JPG
    11,2 KB · Aufrufe: 66
  • opr00YSN2.JPG
    opr00YSN2.JPG
    13,6 KB · Aufrufe: 59
Zuletzt bearbeitet:
Zurück