public function calcSpeed( nextCar:Car, distanceToKeep:Number ):Number {
Die erste Zeile der Funktion berechnet die Distanz zum nächsten Fahrzeug aus der eigenen Position (x und y) sowie der Position des nächsten Fahrzeugs (nextCar.x und nextCar.y); die mathematische Grundlage dieser Berechnung ist die Bestimmung der Länge eines Vektors (diesmal ist der mathematische Vektor gemeint) – hier der Vektor, der die beiden Positionen verbindet. Der Wert 10 wird von der Distanz abgezogen, da die Fahrzeuge 10 (Pixel) lang sind und die Fahrzeuglänge natürlich nicht mit berücksichtigt werden soll:
var distToNext:Number = Math.sqrt( ( nextCar.x - x ) * ( nextCar.x - x ) + ( nextCar.y - y ) * ( nextCar.y - y ) ) - 10;
Nun erfolgt die eigentliche Bestimmung der Geschwindigkeit. Wenn sich das Fahrzeug weiter als die Minimaldistanz vom nächsten entfernt befindet (distToNext > distanceToKeep) und zusätzlich noch nicht schneller als 0.5 (Pixel Grad pro Frame) ist, so wird die Geschwindigkeit erhöht. Die Erhöhung erfolgt dabei in Abhängigkeit der reactionTime (die damit eigentlich keine Reaktionszeit ist, sondern eine Beschleunigungsverzögerung – zur Simulation der Reaktionszeit ist da aber ausreichend):
if ( distToNext > distanceToKeep ) { if ( speed < 0.5 ) speed += 0.01 * reactionTime; }
Befindet sich das Fahrzeug dagegen zu nah am nächsten (distToNext < distanceToKeep), so wird (wieder in Abhängigkeit der Reaktionszeit) gebremst. Die weiteren Abfragen in den folgenden Zeilen dienen nur dazu, die Geschwindigkeit nicht negativ werden zu lassen:
else if ( distToNext < distanceToKeep ) { if ( speed > 0 ) speed -= 0.02 * reactionTime; if ( speed < 0 ) speed = 0; }
Damit wäre die Geschwindigkeit angepasst. Die folgende Zeile ist nur optischer Natur und ändert die Farbe des Fahrzeugs in Abhängigkeit zur Geschwindigkeit (je langsamer, desto röter – bei Interesse kann ich diese Formel auch noch erklären):
color.color = ( ( 255 * ( 1 - speed ) ) << 16 | ( 255 * speed ) << 8 );
Eine Sicherheitsprüfung brauchen wir noch: befindet sich das Fahrzeug zu nah am nächsten Fahrzeug, so setzen wir die Geschwindigkeit direkt auf 0 und stoppen es damit also. Der Wert von 12 entspricht dabei der Länge der Fahrzeuge plus einer kleinen zusätzlichen Distanz:
if ( distToNext + 10 < 12 ) speed = 0;
Die letzte Zeile der Funktion gibt nun lediglich noch die neu berechnete Geschwindigkeit als Ergebnis der Funktionsberechnung zurück:
return speed;
Und damit alles seine syntaktische Richtigkeit hat, müssen alle geöffneten Klammern natürlich noch geschlossen werden:
} } }
Und das war es auch schon. Diese (relativ gesehen) geringe Menge an Code reicht, um unsere kleine Stau-Simulation vom Anfang des Artikels zu programmieren. Man sieht: selbst mit geringen Mitteln kann bereits eine (zugegeben relativ einfache) Simulation programmiert werden, die dennoch einen Aspekt der Wirklichkeit realitätsnah wiedergeben kann.1 Um die Simulation zu erweitern, könnten nun noch verschiedene weitere Aspekte eingebracht werden, zum Beispiel fahrzeugabhängige Variationen bei den eingehaltenen Sicherheitsabständen, eine erweiterte künstliche Intelligenz oder auch ein erweitertes Modell der Simulation, bei welchem nicht auf eine Kreisbahn gesetzt , sondern eine reale Straße simuliert wird. Die Möglichkeiten sind – dank der Computertechnologie – beinahe unbegrenzt. Der große Vorteil von Simulationen gegenüber realen Experimenten liegt darin, dass außer den Ressourcen für die Programmierung und Durchführung der Berechnungen keine weiteren Mittel benötigt werden; sie sind damit in der Regel bedeutend günstiger und schneller/einfacher durchführbar als reale Experimente (im Falle von zum Beispiel Simulationen im Bereich der Astrophysik gibt es manchmal sogar überhaupt keine Möglichkeit für reale Experimente). Und wie wir in diesem Artikel gesehen haben, steckt hinter einer Simulation auch keineswegs Magie, sondern pure Logik. Natürlich gilt es hierbei zu bedenken, dass eine Simulation auch Fehler enthalten kann; die Ergebnisse müssen also in der Regel auch gegen die Wirklichkeit geprüft werden. Und wie wir im Falle des Stau-Experiments gesehen haben, haben wir zumindest bei unserer Stau-Simulation alles richtig gemacht, denn die Ergebnisse der Simulation werden durch das Experiment bestätigt.
Kommentare (18)