Zielen für Fortgeschrittene

Aus Spieleprogrammierer-Wiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
[gesichtete Version][gesichtete Version]
(Implementierung in C++)
K ("biquadratisch" durch "quartisch" ersetzt)
Zeile 66: Zeile 66:
 
: <math>\left((\vec p_T + t_H \cdot \vec v_T) - \tfrac{1}{2} \vec g \cdot {t_H}^2\right)^2 = (t_H \cdot v_0)^2</math>
 
: <math>\left((\vec p_T + t_H \cdot \vec v_T) - \tfrac{1}{2} \vec g \cdot {t_H}^2\right)^2 = (t_H \cdot v_0)^2</math>
  
Jetzt muss diese Gleichung nach <math>t_H</math> aufgelöst werden. Die Arbeit besteht im Wesentlichen im Ausmultiplizieren der Quadrate. Wenn man anschließend die verschiedenen Potenzen von <math>t_H</math> ausklammert, ergibt sich folgende biquadratische Gleichung:
+
Jetzt muss diese Gleichung nach <math>t_H</math> aufgelöst werden. Die Arbeit besteht im Wesentlichen im Ausmultiplizieren der Quadrate. Wenn man anschließend die verschiedenen Potenzen von <math>t_H</math> ausklammert, ergibt sich folgende quartische Gleichung:
  
 
: <math>{t_H}^4 \cdot (\tfrac{1}{4} \vec g^2) + {t_H}^3 \cdot (-\vec v_T \cdot \vec g) + {t_H}^2 \cdot (\vec {v_T}^2 - {v_0}^2 - \vec p_T \cdot \vec g) + t_H \cdot (2 \vec p_T \cdot \vec v_T) + \vec {p_T}^2 = 0</math>
 
: <math>{t_H}^4 \cdot (\tfrac{1}{4} \vec g^2) + {t_H}^3 \cdot (-\vec v_T \cdot \vec g) + {t_H}^2 \cdot (\vec {v_T}^2 - {v_0}^2 - \vec p_T \cdot \vec g) + t_H \cdot (2 \vec p_T \cdot \vec v_T) + \vec {p_T}^2 = 0</math>
  
So wie es die "pq-Formel" zum Lösen quadratischer Gleichungen gibt, existieren auch für biquadratische Gleichungen direkte Lösungsverfahren, allerdings sind diese bei weitem nicht so einfach. Wir nehmen für den Moment einmal an, dass wir die Gleichung bereits lösen können. Dann können folgende Fälle auftreten:
+
So wie es die "pq-Formel" zum Lösen quadratischer Gleichungen gibt, existieren auch für quartische Gleichungen direkte Lösungsverfahren, allerdings sind diese bei weitem nicht so einfach. Wir nehmen für den Moment einmal an, dass wir die Gleichung bereits lösen können. Dann können folgende Fälle auftreten:
  
 
# Die Gleichung besitzt keine positive reelle Lösung. Für unseren Fall bedeutet das, dass das Ziel schlichtweg nicht getroffen werden kann, sofern es seinen momentanen Kurs beibehält (und auf dieser Annahme beruht das Verfahren).
 
# Die Gleichung besitzt keine positive reelle Lösung. Für unseren Fall bedeutet das, dass das Ziel schlichtweg nicht getroffen werden kann, sofern es seinen momentanen Kurs beibehält (und auf dieser Annahme beruht das Verfahren).
Zeile 103: Zeile 103:
 
== Implementierung in C++ ==
 
== Implementierung in C++ ==
  
In der folgenden Beispielimplementierung wird zum Lösen der biquadratischen Gleichung die Funktion <tt>magnet::math::quarticSolve</tt> verwendet, deren Implementierung unter der unten angegebenen Referenz<ref>[http://marcusbannerman.co.uk/index.php/component/content/article/42-articles/87-quartic-and-cubic-root-finder-in-c.html ''Quartic and cubic root finder in C++'']. Marcus Bannerman. MarcusBannerman.co.uk. 11. Oktober 2011.</ref> zu finden ist. Es wird außerdem davon ausgegangen, dass <tt>Vector</tt> eine Vektorklasse ist, auf der die üblichen Operationen definiert sind. Die statische Methode <tt>dot</tt> muss das Skalarprodukt zweier Vektoren berechnen, die Methode <tt>lengthSq()</tt> das Quadrat der Vektorlänge (das Skalarprodukt mit sich selbst).
+
In der folgenden Beispielimplementierung wird zum Lösen der quartischen Gleichung die Funktion <tt>magnet::math::quarticSolve</tt> verwendet, deren Implementierung unter der unten angegebenen Referenz<ref>[http://marcusbannerman.co.uk/index.php/component/content/article/42-articles/87-quartic-and-cubic-root-finder-in-c.html ''Quartic and cubic root finder in C++'']. Marcus Bannerman. MarcusBannerman.co.uk. 11. Oktober 2011.</ref> zu finden ist. Es wird außerdem davon ausgegangen, dass <tt>Vector</tt> eine Vektorklasse ist, auf der die üblichen Operationen definiert sind. Die statische Methode <tt>dot</tt> muss das Skalarprodukt zweier Vektoren berechnen, die Methode <tt>lengthSq()</tt> das Quadrat der Vektorlänge (das Skalarprodukt mit sich selbst).
  
 
<sourcecode lang=cpp tab=4>
 
<sourcecode lang=cpp tab=4>
Zeile 135: Zeile 135:
 
const Vector targetRelVelocity = targetVelocity - shooterVelocity;
 
const Vector targetRelVelocity = targetVelocity - shooterVelocity;
  
// Koeffizienten der biquadratischen Gleichung berechnen.
+
// Koeffizienten der quartischen Gleichung berechnen.
 
const double A = 0.25 * gravity.lengthSq();
 
const double A = 0.25 * gravity.lengthSq();
 
const double B = -Vector::dot(targetRelVelocity, gravity);
 
const double B = -Vector::dot(targetRelVelocity, gravity);

Version vom 19. Oktober 2016, 10:43 Uhr

Klicke hier, um diese Version anzusehen.

Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
Werkzeuge