Weg finden mit Hilfe von Kreisberechnung

Für allgemeine Fragen zur Programmierung mit PureBasic.
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Weg finden mit Hilfe von Kreisberechnung

Beitrag von D4uS1 »

Ich bin auf ein kleines Problem mathematischer Natur gestoßen. Ich habe einen Menschen der einen Weg um ein Gewässer, zum Beispiel einen See finden muss.

Hierzu habe ich folgende Überlegung gehabt. Die Wegstrecke teile ich in gleich große Abschnitte. Die Abschnitte werden zunächst in Richtung zum Ziel hin geprüft. Befindet sich kein Gewässer im Weg dann soll der Weg in Richtung Ziel führen. Befindet sich aber Wasser im Weg wird von dem Vektor aus, der zum Ziel führt, in gleichmäßig Kreisförmig angeordneten Schritten in eine Richtung geprüft.

Zum Beispiel: Wenn wir zunächst 20 Meter gerade aus gehen und merken es kommt ein See. Dann drehen wir uns um 12° nach rechts und sehen, dass da ist immer noch Wasser im Weg ist. Dann drehen wir uns um weitere 12° nach rechts, also insgesamt 24°, und da ist kein Wasser im Weg. Die nächsten 20 Meter gehen wir also in diese Richtung. Dann wird erneut in Richtung Ziel geprüft...

Generell ist diese Art der Prüfung kein Problem. Ich benutze um den Kreis zu berechnen, in dessen Richtung die Strecke Abschnittsweise geprüft werden soll die Formel aus dem Beispielcode von PB in "Math". Um das ganze nicht durchgehend im Kreis zu prüfen habe ich es in 20 Abschnitte unterteilt.

Code: Alles auswählen

For y = 1 To 20
 ZielX = PosX+cos(0.314*y)*#PRUEFUNGSLAENGE-sin(0.314*y)*#PRUEFUNGSLAENGE
 ZielZ = PosZ+cos(0.314*y)*#PRUEFUNGSLAENGE-sin(0.314*y)*#PRUEFUNGSLAENGE
 ;Wenn zwischen dem neuen Ziel und der Position kein Wasser ist unterbreche die Schleife, wenn doch dann mache weiter
Next
Diese Art der Berechnung geht aber von 0° bis 360°. Um den Weg zu finden muss aber bei dem Vektor der das Ziel mit der Position verbindet angefangen werden. Also habe ich mir überlegt einen Zusatzwinkel zu berechnen, der Zwischen dem Zielvektor und dem ersten Prüfungsvektor ist. Dieser Zusatzwinkel wird dann einfach zu Sinus und Cosinus hinzugefügt.

Code: Alles auswählen

For y = 1 To 20
 ZielX = PosX+cos(0.314*y+Zusatzwinkel)*#PRUEFUNGSLAENGE-sin(0.314*y+Zusatzwinke)*#PRUEFUNGSLAENGE
 ZielZ = PosZ+cos(0.314*y+Zusatzwinkel)*#PRUEFUNGSLAENGE-sin(0.314*y+Zusatzwinke)*#PRUEFUNGSLAENGE
 ;Wenn zwischen dem neuen Ziel und der Position kein Wasser ist unterbreche die Schleife, wenn doch dann mache weiter
Next
Jetzt kommen wir zum eigentlichen Problem: Wenn das Ziel des Menschen weiter als 180° von der ersten Prüfung entfernt ist wird das Ergebnis verfälscht, da ich nur eine Formel besitze die den Inneren Winkel zwischen zwei Vektoren ausrechnet besitze.

Ich bin sehr schlecht im erklären, hoffe aber das Problem einigen etwas näher gebracht zu haben und bitte euch um Hilfe.
Solltet ihr Rechtschreibfehler finden, dürft ihr diese natürlich gerne behalten ;).
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Such mal nach atan2() oder generell atan() hier im Forum. Da findest du schon
vorgefertigte Funktionen (unter anderem von mir), die einen Vektor bekommen und dann
den Winkel dazu ausgeben. Dann wird auch das Problem mit größer als 180° beachtet.
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Beitrag von D4uS1 »

Danke! Hat geklappt! :allright:
Solltet ihr Rechtschreibfehler finden, dürft ihr diese natürlich gerne behalten ;).
Antworten