next up previous
Nächste Seite: Was benötigen wir also Aufwärts: Visual C++ Vorlesung Vorherige Seite: Wohin schreiben wir die

Wie finden wir den Kollisionszeitpunkt zweier Kugeln?

Unser Ziel ist es eine einfache Billard-Animation zu programmieren.

Annahme: Kugeln bewegen sich zwischen zwei Kollisionen mit konstanter, ungedämpfter Geschwindigkeit auf geradliniger Bahn.

Zwei Kugeln treffen sich, wenn sie gerade soweit zusammen kommen, dass der Abstand der beiden Mittelpunkte gleich der Summe der Radien ist.

Gegeben:

$t_0$ Ausgangszeitpunkt
$p_0(t_0)$ Position Kugel 0 zum Ausgangszeitpunkt
$v_0$ Geschwindigkeit Kugel 0
$r_0$ Radius Kugel 0
$p_1(t_0)$ Position Kugel 1 zum Ausgangszeitpunkt
$v_1$ Geschwindigkeit Kugel 1
$r_1$ Radius Kugel 1

Bewegungsgleichungen (sind Vektorgleichungen):

\begin{eqnarray*}
p_0(t) &=& p_0(t_0)+t\cdot v_0 \\
p_1(t) &=& p_1(t_0)+t\cdot v_1
\end{eqnarray*}



z.B. im 2-Dimensionalen für die erste Gleichung:

\begin{eqnarray*}
{x_0(t) \choose y_0(t)} &=& {x_0(t_0) \choose y_0(t_0)}
+t\cdot {v_x \choose v_y}
\end{eqnarray*}



Kollisionsbedingungen:

\begin{eqnarray*}
\vert p_0(t_c)-p_1(t_c)\vert &=& r_0+r_1 \\
t_c &>& t_0 \\
t_c & & \mbox{minimal}
\end{eqnarray*}



d.h. Zeitpunkt $t_c$ liegt in der Zukunft und ist der erste Zeitpunkt, an dem sich beide Kugeln gerade berühren.

Wir kennen Zusammenhang zwischen Betrag und Skalarprodukt:

\begin{displaymath}\vert v\vert = \sqrt{
\langle v,v\rangle
} \end{displaymath}

Einsetzen:

\begin{eqnarray*}
\lefteqn{\vert p_0(t_c)-p_1(t_c)\vert} \\
&=& \vert(p_0(t_0)+...
..._c\cdot(v_0-v_1),(p_0(t_0)-p_1(t_0))+t_c\cdot(v_0-v_1)\rangle
}
\end{eqnarray*}



Verwenden:

\begin{eqnarray*}
\Delta p &=& p_0(t_0)-p_1(t_0) \\
\Delta v &=& v_0-v_1 \\
R &=& r_0+r_1
\end{eqnarray*}



Lösen:

\begin{eqnarray*}
\sqrt{
\langle\Delta p + t_c\Delta v,\Delta p + t_c\Delta v\r...
...a v\rangle
+(
\langle\Delta p,\Delta p\rangle
-R^2) &=& 0 \\
\end{eqnarray*}



Verwenden:

\begin{eqnarray*}
a_0 &=&
\langle\Delta p,\Delta p\rangle
- R^2 \\
a_1 &=& ...
...Delta v\rangle
\\
a_2 &=&
\langle\Delta v,\Delta v\rangle\end{eqnarray*}



Also Lösen der quadratischen Gleichung


\begin{displaymath}a_2\cdot t_c^2 + a_1\cdot t_c + a_0 = 0 \end{displaymath}

liefert bei existierender minimaler Lösung größer $t_0$ den Kollisionszeitpunkt.

Schreiben wir das Skalarprodukt mit einem einfachen Punkt statt mit der Klammernotation, erhalten wir die quadratische Gleichung in $t_c$:

\begin{eqnarray*}
t_c^2 \cdot \Delta v\cdot\Delta v
+ 2\cdot t_c \cdot \Delta p\cdot\Delta v
+ (\Delta p\cdot\Delta p - R^2) &=& 0
\end{eqnarray*}




next up previous
Nächste Seite: Was benötigen wir also Aufwärts: Visual C++ Vorlesung Vorherige Seite: Wohin schreiben wir die

1999-12-13