[I]Kommentar: Ich verwende den Dateityp "Vektor". Es handelt sich dabei um ein
eindimensionales Array von Realzahlen. Der Index kann dabei nur die Werte 1 oder 2
annehmen.[/I]
Funktion Skalarprodukt(x, y: Vektor): Real
{
Skalarprodukt := x(1) * y(1) + x(2) * y(2)
}
Funktion Betrag (x: Vektor): Real
{
Betrag := Wurzel(Skalarprodukt(x,x))
}
Funktion Abstand (x, y: Vektor): Real
{
Abstand := Betrag(y-x)
}
Unterprogramm Stoß (Var x, y, vx, vy: Vektor)
[I]Kommentar: Beachte, dass die Parameter [U]hier[/U] mit Call-by-reference übergeben werden.[/I]
Dif,eDiv,vx_ax, vy_ax, vx_tan, vy_tan: Vektor
[I]Kommentar: Dif ist der Differenzvektor der übergebenen Parameter x und y.
Er ist wichtig für die Bestimmung der Richtung, in der sich die Kugeln berühren.
eDif ist ein Einheitsvektor in Richtung von Dif. Den brauchen wir, um die
Komponentenzerlegung durchführen zu können.
vx_ax und vy_ax sind die Geschwindigkeitsvektoren in axialer Richtung,
vx_tan und vy_tan in tangentialer Richtung.[/I]
{
Dif := y - x
eDif := Dif * (1/Betrag(Dif))
vx_ax := Skalarprodukt(eDif,vx) * eDif
vy_ax := Skalarprodukt(eDif,vy) * eDif
vx_tan := vx - vx_ax
vy_tan := vy - vy_ax
[I]Kommentar: Das war die Komponentenzerlegung[/I]
vx := vx_tan + vy_ax
vy := vy_tan + vx_ax
[I]Kommentar: Die tangentialen Komponenten werden beibehalten, die axialen
Komponenten ausgetauscht.[/I]
}
Hauptprogramm
{
t := 0
Eingabe Pos1, Pos2, v1, v2: Vektor
Eingabe DeltaT,Dauer: Real
Eingabe Radius: Real
Wiederhole solange t<Dauer
{
t := t + DeltaT
Pos1 := Pos1 + v1*DeltaT
Pos2 := Pos2 + v2*DeltaT
Falls Abstand(Pos1, Pos2) <= 2*Radius
{
Stoß (Pos1, Pos2, v1, v2)
}
Ausgabe Pos1, Pos2
}
}