Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 11:19

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Kursberechnung (Matheknobelei)
BeitragVerfasst: Mi Jan 04, 2006 16:46 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Dez 28, 2005 17:43
Beiträge: 18
Hallo, Leute. Ich möchte ein Spiel programmieren, in dem ein Raumschiff einen bestimmten Punkt in einem 2D Raum anfliegt. Aber damit das etwas schöner aussieht, soll das Schiff erst eine Kurve fliegen und dann zum Ziel (z.B. wenn die ursprüngliche Richtung des Schiffs nach oben geht und das Ziel unten ist). Das Problem ist, dass ich nur den Kurvenradius (bzw den Durchmesser des ganzen Kreises habe), sowie X/Y-Koordinaten von Schiff und Ziel. Siehe Bild:
Bild

Was ich suche und einfach nicht herausfinde, ist die Formel, um den Winkel a(alpha) rauszufinden. Bitte nicht auslachen, ich weiß, dass das Mathe aus dem 8./9. Schuljahr ist, aber ich komm trotzdem nicht drauf :oops:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 04, 2006 19:02 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Du musst ne Tangente Berechnen auf der das Ziel liegt. Dann fliegst du auf der Kreisbahn bis zur "Tangentenwurzel" und dann auf der weiter.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 05, 2006 02:41 
Offline
DGL Member

Registriert: Fr Dez 19, 2003 14:27
Beiträge: 107
Wohnort: Indianapolis, USA
Man koennte auch ne Bezier Kurve verwenden hier...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 05, 2006 15:15 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Dez 28, 2005 17:43
Beiträge: 18
Gibt es dazu irgendeine Erklärung? Weil ich versteh das nicht ganz. Auch hier im Tutorial für Curved Surfaces wird mit Formeln wild um sich geschmissen ohne richtig zu erlären, wodrum es sich bei den einzelnen Formelzeichen etc handelt. Und im restlichen Internet ist das gleiche Problem.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 05, 2006 15:24 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
stimmt. Ich blick die Materie auch net so ganz ;)
Wahrscheinlich ist es im Grunde allerdings ganz einfach und mich interessiert das Thema auch ziemlich.

Kennt wer von euch Metal Fatigue? Da gibt es Jets, die haben extrem coole Flugmanöver drauf ;) Deren Flugbahnen wollte ich schon immer mal berechnen. Das sind nämlich auch solche Kurven.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 05, 2006 15:39 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Was mir fehlt ist die Richtung, in die das Schiff "kuckt".
Dann könnte man es theoretisch berechnen.
Dann würde ich nämlich "einfach" solnage im Kreis fliegen (ob nach links oder rechts müsste man berechnen. Je nachdem, ob das Schiff links oder rechts von einem liegt), bis die Richtung mehr oder weniger auf den Punkt zeigt. Mehr oder weniger deshalb, weil durch das Timebased Movement eine so genaue Genauigkeit nich möglich ist. Aber die Genauigkeit in diesem Fall reicht voll aus und ist IMHO immernoch allzu krass, als das ein normaler Mensch so fliegen würde! :wink:

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 05, 2006 16:07 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Falls die Frage nach Alpha immer noch besteht:

Wenn V^ (^ für Vektor) die Flugrichtung ist, S^ der Startpunkt und E^ das Ziehl, dann geht als Annäherung:

Cos Alpha = (V^ . (E^ - S^)) / (V * |(E^ - S^)|)

ist wie gesagt nur ne Näherung wenn d im Vergleich zum Abstand relativ klein ist.

Ums genau zu berechnen hab ich auch noch was. Dafür hab ich mal ne Skizze gemacht - mit Paint :roll:

d^ ist ja relativ einfach. Einfach von S^ aus im rechten Winkel zu V^ (Komponenten vertauschen und n "-" einbauen) mit der Länge d (Radius). Darüber kommt man dann auch einfach an den Mittelpunkt des Kreises, und kann d2^ berechnen (Vom Mittelpunkt des Kreises zum Endpunkt). So dann kann ja der Spaß beginnen:

Beta kann man über den Cosinuss bekommen :

Cos(180 - Beta) = d / d2

Gamma über das Punktprodukt:

Cos(Gamma) = (-d^ . d2^) / (d * d2)

Und Alpha ist dann einfach nur noch:

Gamma = Alpha + Beta


So in etwa....


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 05, 2006 17:55 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Dez 28, 2005 17:43
Beiträge: 18
Mal noch ne gaaaaaanz dumme Frage zu dem Punktprodukt: Wie war das gemeint? Und heißt das "^", dass ich die Zahl quadrieren muss?

Sagen wir mal ich hab d=2 und d2=3 (nur beispielzahlen zur verdeutlichung). heißt das dann

cos(gamma) = (-2².3²) / (2 * 3) [-2² = -4; 3² = 9]
cos(gamma) = (-4.9) / (2 * 3)

?

Bitte um Entschuldigung, aber die Schreibweise kenne ich net und Punktprodukte gabs in unserer Schule nicht :oops:
Danke für die Hilfe


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 05, 2006 18:05 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
mit ^ meinte ich, dass es der Vektor ist. Da schreibt man normalerweise nen Pfeil drüber, aber das geht hier so schlecht. Punktprodukt ist mathematisch gesehen:

a^, b^ e |R^n (und da meine ich dann wirklich hoch n)

a^ . b^ = Sigma i = 1 bis n über ai * bi

also für Nichtmathematiker: alle entsprechenden Komponenten multiplizieren und die Produkte dann addieren.

Wenn du z.B. 2 Vektoren hast: a^ = ( ax ay az ) und b^ = ( bx by bz ) dann ist a^ . b^ = ax*bx + ay*by + az*bz

Eine immer wieder nützliche Eigenschaft des Punktproduktes ist diese hier:

a^ . b^ = a * b * cos(alpha) (= Länge von a * Länge von b * Cos(Winkel zwischen den beiden) )

Wenn man das umstellt kann man sehr einfch den Winkel zwischen den Vektoren berechnen.


Vllt solltest du dir mal n paar Seiten zu Vektorrechnung anschauen, das vereinfacht einem hinterher das Leben.

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 05, 2006 18:17 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Schreibs auf ein Blatt, scans ein, und hängs als jpg an.

Und wenns fertig ist und Toll, stells als Anleitung ins Wiki!!!! ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 05, 2006 18:44 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
*nach links auf den Schreibtisch guck; das Blatt Papier mit wirschen Notizen anseh*

Glaub mir, bei meiner Handschrift schließen "schreibs auf ein Blatt" und "wenns toll ist" einander aus...

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 05, 2006 18:47 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Dez 28, 2005 17:43
Beiträge: 18
Okay, ich versuche mal es soweit ich kann zusammenzufassen. Sagt mir bitte, ob ichs verstanden hab :mrgreen: Also das mit dem Punktprodukt mein ich.

Ein Vektor ist eine Gerade im Raum. Ihre Länge wird mit x, y und z angegeben in die einzelnen Richtungen angegeben. Da ich in diesem Fall alles auf einer Z Ebene habe, ist z=0. Jetzt hab ich meinetwegen die Vektoren a^und b^. Somit hätte ich z.B. beim Vektor a^ ax, ay und az.
Jetzt kommt das Punktprodukt. Ich multipliziere alle x, y und z Längen miteinander und addiere die Ergebnisse.

a^.b^ = ax*bx + ay*by (z hab ich weggelassen, weils 0 ist)

Dementsprechend ist die Formel für gamma:
cos(gamma) = (ax*bx + ay*by) / (a * b) [Ich hoffe, ich liege damit Richtig, dass a und b hier diesmal die "richtigen" Längen der Vektoren sind]
gamma = acos((ax*bx + ay*by) / (a * b))

Auf mein geliebtes FPC müsste das also so ungefähr aussehen:
gamma:= arccos((ax*bx + ay*by) / (a * b)));

Ich hoffe ich habs jetzt... :?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 05, 2006 20:23 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
eine Gerade ist mathematisch gesehen was anderes, man bezeichnet es eigentlich lieber als Pfeil (darum auch die Pfeilspitzen in meiner Zeichnung).

Die Rechnung hast du allerdings richtig verstanden.
bei meiner Skizze wäre dann a^ = -d^ und b^ = d2^

Ich denke ich mach mal ein Beispiel für meine gesammte Rechnung, dann wirds vielleicht klarer, was ich meine:

Nehmen wir mal an, dein Schiff ist bei S^ = ( 1 2 ) und bewegt sich in Richtung V^ = ( 1 1 ). Der Zielpunkt ist E^ = ( 5 -4 )
Für den Radius des Kreises nehme ich jetzt mal 1

So, der Zielpunkt liegt rechts vom Schiff also muss der Mittelpunkt des Kreises auch rechts liegen. Den Vektor d^ vom Schiff zum Mittelpunkt bekommst du also, indem du V^ rechtsherum um 90° drehst und die Länge auf den Radius anpasst.

Drehen:

v^ = (1 1)

( 1 -1 ) (x und y vertauschen und beim neuen y das Vorzeichen ändern)

Länge anpassen:

( 1 -1 ) * 1/|( 1 -1 )| = ( 0.707 -0.707 ) (Normalisieren)

( 0.707 -0.707 ) * 1 = ( 0.707 -0.707 ) = d^ (mit Radius multiplizieren)


Das heißt der Mittelpunkt M^ = S^ + d^ = (1.707 1.29)

d2^ ist dann: d2^ = E^ - M^ = (3.293 -2.71)

Gamma = ArcCos( (-d^ . d2^) / (d * d2)) = ArcCos( ((-0.707)*3.293 + 0.707*(-2.71)) / (1 * 4.26)) = 175.05°

Hier tritt jetzt noch ein Problem auf, das ich anfangs nicht bedacht habe: Der Trick mit dem Punktprodukt liefert immer den kleinsten Winkel zurück. Darum sollte man an dieser Stelle noch überprüfen, ob v^ . d2^ <0. Wenn dies der Fall ist, dann muss der errechnete Wert halt noch von 360 abgezogen werden.

v^ . d2^ = 1*3.29 + 1*(-2.71) = 0.58 > 0 also in diesem Fall kein Problem

so, da haben wir schon mal Gamma. Jetzt brauchen wir noch Beta:

An dieser Stelle hab ich oben in der Eile Müll geschrieben, ich meinte nicht Cos sonder Sin und von den 180 Grad Winkelsumme fallen ja bereits 90 an den rechten Winkel ab. Sry deswegen....

Beta = 90 - ArcSin(d / d2) = 90 - ArcSin(1 / 4.26) = 76.42

und jetzt noch Alpha:

Alpha = Gamma - Beta = 175.05 - 76.42 = 98.63 (Mit vielen schlecht gerundeten Werten auf dem Weg...)

Hoffe ich hab mich nicht verrechnet, ich rechne normalerweise lieber mit Variablen und tippe am ende alles in den Taschenrechner ^^

Allerdings komme ich mit der Annäherung auf einen ähnlichen Wert:
Alpha = ArcCos( (v^.(E^-S^)) / (v*|(E^-S^)|) ) = ArcCos( (1*4 + 1*(-6)) / (1 * 7.211) ) = 106.10
also wirds schon passen...

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 15 Queries | GZIP : On ]