Forum
Tipps
News
Menu-Icon

logik/mathe-frage an alle programierer (überthema: wegfindung)

HAllo :)

Ich programmiere gerade ein ziemlich umfangreiches programm just for fun in dem ich versuche einen bot für ein spiel zu bauen und bin da auch schon recht weit.

Die Programmiersprache ist Qbasic eingebettet in eine batch(jaja 's gibt modernere sprachen  ;))
aber ich glaube die sprache ist für meine Frage eher unrelevant.

die "schnittstelle" von bot zum spiel läuft über eine regelmäßig vom spiel erneuerte temporäre datei die mein programm liest und dann entsprechent durch simulieren einer benutzereingabe (maus+tastatur) reagiert.

ich habe also folgende situation:
Ich möchte ganz "simpel" meine Spielfigur von a nach b bewegen und zwar auf dem geradesten weg.
a=startpunkt b=zielpunkt
-Ich kann die aktuelle x,y koordinaten abfragen.
-ich kann die figur loslaufen und stoppen lassen
-ich kann sie einen schritt nach vorne/hinten bewegen
-ich kann sie um soundsoviel grad nach rechts/links drehen
-ich weiß aber  nicht in welche richtung sie schaut

Mein erster versuch war das ich die figur einfach loslaufen hab und dann abgefragt habe ob die enfernung steigt oder sinkt und dann nach dem try-and-error prinzip ein stück mehr rechts bzw links läuft.
Ich glaube ich brauch nicht zu erzählen was eine so ungenaue verfahrensweise so für probleme mit sich bringt.

Es geht ja eigentlich nur darum das ich rausfinde wohin (in grad) die figur gerade schaut, sie dann auf das ziel auszurischten und loszulaufen.

Wenn ich sie aber einen schritt nach vorn gehen lasse diese koordinaten zwischenspeichere (ich nenns mal punk c) und dann wieder einen schritt zurück habe ich ja ein dreieck aus den koordinaten von a,c und (abstand x von a zu c + abstand y von a zu c (ich nenn den punkt jetzt mal d))
die seitenlängen des dreiecks lassen sich dank pythagoras herleiten weil an d ein winkel von 90 grad ist.
Jetzt müssten nach meiner logik die anderen winkel auch herleitbar sein.

wenn ich diese winkel hätte wüsste ich also "wohin" meine figur schaut und könnte sie ausrichten.

Tja "wenn".....
aber wie? ???
Oder hättet ihr andere ideen um den winkel herauszufinden?
Oder ideen von guten Mathe seiten bzw stichwörter für google?
Oder einen anderen Ansatz um zum ziel zu kommen?

Stellt gerne fragen zb falls meine erklärung zu verwirrend war versuch ichs nochmal detailliert ;D
Ich bin hier wirklich festgefahren und hab schon freunde gefragt+ ewig im netz gesucht, also Postet auch wenn ihr nur nen verdacht habt, ich erwarte hier keine komplettlösungen aber vielleicht anregungen wie ich weiterkomme.(Komplettlösungen wären natürlich auch willkommen ;D)
Ich werd den threat auch noch öfter nachgucken also zu spät posten gibs nicht.

Vielen dank schonmal  8)


Antworten zu logik/mathe-frage an alle programierer (überthema: wegfindung):

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hi |

Kannst du denn nicht einfach einen Startwinkel bei der Initialisierung vergeben und alle Änderungen des Winkels direkt auf die zuständige Variable anwenden? Diese würde ja dann immer den aktuellen Winkel enthalten.

Ist doch umständlich, jedesmal den Winkel neu herauszufinden ;)

greez 8)
JoSsiF

ne ne das geht nicht.
ich hab mir schon gedacht das ich mich da zu ungenau ausgedrückt habe.
Also ich habe ein normales gekauftes spiel was ich durch mein programm beeinflusse.

da sich die figur bei verschiedenen aktionen automatisch anders ausrichtet wäre dann schon meine variable nicht mehr genau.

Oder sagen wir es mal so:
Stellt euch vor ich habe einen überwachungsroboter(real)  mit gps ,der rumfahren soll, gebaut aber war so blöd den kompass zu vergessen.
wenn der über 1,2 kleine unebenheiten fährt wäre die änderung des winkels schon nicht mehr korrekt berechnet.
Da wäre die fragestellung die gleiche...

Hab nochmal ne grafik dazu gemacht:


Wenn ich sie aber einen schritt nach vorn gehen lasse diese koordinaten zwischenspeichere (ich nenns mal punk c) und dann wieder einen schritt zurück habe ich ja ein dreieck aus den koordinaten von a,c und (abstand x von a zu c + abstand y von a zu c (ich nenn den punkt jetzt mal d))
die seitenlängen des dreiecks lassen sich dank pythagoras herleiten weil an d ein winkel von 90 grad ist.
Jetzt müssten nach meiner logik die anderen winkel auch herleitbar sein.

wenn ich diese winkel hätte wüsste ich also "wohin" meine figur schaut und könnte sie ausrichten.

Der Ansatz passt schon mal gut.

Deine Zeichnung stimmt aber nicht ganz.

Also nehmen wir als Ausgangspunkt den Punkt A(x1, y1).
Dann haben wir einen Vektor der uns den Nullwinkel bestimmt, den definieren wir als N mit (0, 1),
Dann haben wir den Punkt B(x2, y2) mit den Koordinaten der Position nach den Schritt.
Daraus erhalten wir einen Bewegungsvektor B mit (x2-x1, y2-y1).
Dann musst du nur noch den Winkel zwischen N und B berechnen und du hast den winkel in dem die Figur steht.

Ich schreib dir morgen mal die Formeln zusammen, hab nämlich grad keinen passenden formel editor da.

MFG
BWA

PS: Einige Probleme die Auftreten könnten:
1. Da du nur einen Schritt machst kann es zu ungenauigkeiten der Berechnung kommen.
2. Du landest beim ersten Schritt in einer Wand un bewegst dich somit nicht, was ein problem ist.

PPS: Zu deiner Zeichnung, es entsteht kein rechtwinkeliges dreieck, da sonst ja der schritt(Strecke AC) größer werden müsste je weiter die Figur sich dreht (je größer Winkel DA und CA).

mist, ja ist mir auch aufgefallen das die die zeichnung nicht ganz korrekt ist. ;D
das dreieck müsste ja eigentlich gespiegelt sein nach meiner beschreibung.
Ich glaube aber die formel zu haben
Ich hab nämlich meine frage etwas abgfespeckt in einem  matheforum gepostet
http://www.matheboard.de/thread.php?postid=323378#post323378
wo ich folgende ausfürliche antwort bekam:
 

Zitat
Arbeite mim Tangens

Daraufhin habe ich mal bei wikepedia tangens eingegeben und habe das hier gefunden:
 http://de.wikipedia.org/wiki/Tangens
 
 
Zitat
In einem rechtwinkligen Dreieck ist der Tangens eines Winkels α das Längenverhältnis von Gegenkathete zu und der Kotangens das Längenverhältnis von Ankathete zu Gegenkathete:Ankathete


also kurz gesagt wenn ich 2 seiten des dreiecks durcheinander teile hab ich den tangens

dann habe ich folgende funktion bei QBasic gefunden:
 
Zitat
ATN - eine mathematische Funktion, die den Arkustangens eines numerischen
      Ausdrucks zurückgibt (der Winkel, dessen Tangens dem numerischen Aus-
      druck entspricht).

Syntax
  ATN(Numerischer Ausdruck)

Das heißt doch wenn ich atn(längeeinerseite/längeeineranderenseite)
eingebe müsste ich doch eigentlich meinen winkel haben oder?  :P:)

P.S.
die ungenauigkeiten werden immer da sein deswegen werde ich den winkel auch wärend des laufens auf das ziel zu immer wieder überprüfen.
Eine routine die überprüft ob die figur sich bewegt gehört natürlich auch dazu (oops da isja ne wand-routine)

das dreieck ist 100prozentick mit nem 90grad winkel nur das die länge AD nicht der länge des schrittes AC entspricht was ja egal ist da ich ja nur den winkel brauch (im verhälnis zum imaginären norden).
90grad weil die ecke D (in meinem bild) aus dem Y-koordinaten von C und den X-koordinaten von A konstruirt ist.

PPS.

Also nehmen wir als Ausgangspunkt den Punkt A(x1, y1).
Dann haben wir einen Vektor der uns den Nullwinkel bestimmt, den definieren wir als N mit (0, 1),
Dann haben wir den Punkt B(x2, y2) mit den Koordinaten der Position nach den Schritt.
Daraus erhalten wir einen Bewegungsvektor B mit (x2-x1, y2-y1).
Dann musst du nur noch den Winkel zwischen N und B berechnen und du hast den winkel in dem die Figur steht.
äh ja so hatte ich es auch gemeint nur n bischen falsch ausgedrückt  ():-)

mmhhh scheint irgendwo ein denkfehler zu sein...
Ich hab schnell ein kl prog geschrieben wo ich manuell die länge eingebe und es mir den winkel ausgeben sollte.
stimmte absolut nicht mit dem was ich aufgezeichnet hatte überein. :(

INPUT "länge 1 !"; laenge1
INPUT "länge 2 !"; laenge2
PRINT " "
PRINT "der winkel ist "; ATN(laenge1 / laenge2); " grad"

Dein denkfehler ist des es kein rechtwinkeliges sonder ein schiefwinkeliges dreieck ergibt, was dazu führt, dass du mitm tangens nich so einfach weiter kommst.

Werd mal mein nootebook anwerfen und dir was zusammenschreiben.

MFG
BWA

 ??? ???
das musst du mir nochmal erklären warum das schiefwinklig ist

Bin schon gespannt auf deine Antwort  ;D

Also,

Es geht mit deinem Ansatz natürlich auch, aber es stellt sich danach noch das Problem, dass du ja noch den Winkel zum Ausgangspunkt berechnen musst.

schau mal hier

MFG
BWA

Hi katerkarloak,

also 'ne direkte Lösung habe ich jetzt nicht parat,
aber vielleicht einen Ansatzpunkt, oder Denkanstoss?

Eine Figur soll einen Weg gehen(finden).

Wenn ich eine Figur in einem Spiel "irgendwo hinschicke",
klicke ich die Figur an und durch einen weiteren Klick
bestimme ich ein Ziel, z.B..

Auf diesem Weg befinden sich u.a. Hindernisse, die die
Figur umlaufen muß.

Heißt, die Figur guckt(selber), wo geht's weiter.

Und dieser Weg UND die Hindernisse müssen ja irgendwo
hinterlegt sein. Kann das nicht in einem Array passieren?

Heißt also: Das Spielfeld ist ein Array von, sagen wir
mal 1000 x 1000, dann kann ich doch Wege und Hindernisse
optimal festlegen, in dem ich jeweils Teile des Array's als begehbar oder nicht begehbar bestimme.

Gruß
Loriot







Lieber BWA
Vielen vielen dank für die mühe die du dir gemacht hast das hat mir wirklich weitergeholfen.
Ich habe erst mal eine weile gebraucht um deine formeln zu verstehen aber nachdem ich verstanden habe das du gleich den ganzen winkel berechnst statt wie bei meinem ansatz erst den winkel der figur ausgehend von einem fiktiven "norden" und dann den winkel des zielpunkts zu diesem "norden".
Dann hattest du auch noch einen zahlenverwechsler wo du 2 statt 1 geschrieben hast bei der vereinfachung.
Naja kurz gesagt hat gedauert aber ich habs gerafft.
Jetzt liegt ein schönes stück programmmierarbeit vor mir um das wissen in die tat umzusetzen.
Also vielen dank nochmal  :D:D:D

ps. das thema ist zwar sehr speziel aber wen es interessiert ich hab die formel von bwa noch mal  hier online gestellt:
 http://home.arcor.de/utakirschner/bot/Bot.htm

p.p.s danke loriot für die denkanstöße aber mir wurde wie erwähnt ja schon geholfen 8)

Ich hab mir zwar nicht aslles durchgelesen, aber mal folgende Frage: Welche Klasse bist du?
Weil man im Mathe ab Klasse 11 lernt, wie man den Winkel eines Punktes im bezug auf einen anderen Punkt errechnet. Das nennt man dann Vektorrechnung. Dami brauchst du nur noch 2 Punkte3 eines 2d/3d-raumes und du kannst alles mögliche machen. Auch Winkel berechnen. Wenn du intere3sse hast, dann schreib mir ne Mail, dann helf ich dir weiter.


« Join Problemdas Spiel „Hangman“ bzw. „Galgenmännchen in C »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Autoresponder
Ein Autoresponder, auch Autoreply genannt, ist eine E-Mail Funktion, mit denen man automatische Antwortnachrichten erstellen und versenden kann. Der Autoresponder kann in...

E Book Reader
Als E Book Reader bezeichnet man eine spezielle Hardware, um E-Books auch ohne den klassischen Computer zu lesen. E-Book-Reader bestehen meist nur aus einem Flach-Bildsch...

Eingabefelder
Als Eingabefelder werden in einem Programm oder in Online-Formularen die Stellen bezeichnet, an denen Informationen eingetippt werden können. Die Beschriftung neben ...