If you're seeing this message, it means we're having trouble loading external resources on our website.

Wenn du hinter einem Webfilter bist, stelle sicher, dass die Domänen *. kastatic.org und *. kasandbox.org nicht blockiert sind.

Hauptinhalt

Bewegung von vielen Objekten

In der realen Welt, die uns immer wieder inspiriert, haben wir mehr als ein bewegtes Objekt. Wir sind von vielen Objekten unterschiedlicher Masse und Position umgeben. Schauen wir uns an wie wir unseren Mover dazu bringen diesen Aspekt der realen Welt besser zu simulieren.
Dazu machen wir eine kurze Wiederholung der objektorientierten Programmierung. Wir werden hier nicht alle Grundlagen der OO-Programmierung wiederholen. Da aber die Idee der Erschaffung einer Welt voller Objekte ziemlich grundlegend für alle Beispiele in diesem Kurs ist, lohnt es sich, kurz die einzelnen Schritte für die Transformation von einem zu vielen Objekten einzeln anzuschauen.
Zur Erinnerung, unser Mover sieht momentan so aus: Er ist identisch mit dem Mover den wir bei der Einführung zu Vektoren erstellt haben, wurde aber um das Konzept Masse und eine neue Methode applyForce() ergänzt.
Nun, da unser Objekt geschrieben ist, können wir z.B. zwanzig Instanzen von Mover in einem Array erzeugen und diese mit einer Schleife initialisieren
var movers = [];

for (var i = 0; i < 20; i++) {
    movers[i] = new Mover();
}
Hier haben wir aber ein kleines Problem. Wenn wir uns nochmals den Konstruktor von Mover anschauen…
var Mover = function() {
    this.mass = 1;
    this.position = new PVector(30, 30);
    this.velocity = new PVector(0, 0);
    this.acceleration = new PVector(0, 0);
};
…entdecken wir, dass jedes Mover-Objekt genau gleich erzeugt wird. Wir wollen aber Mover, welche mit unterschiedlichen Massen und an verschiedenen Positionen starten. Hier müssen wir unseren Konstruktor nun mit zusätzlichen Parametern etwas erweitern.
var Mover = function(m, x, y) {
    this.mass = m;
    this.position = new PVector(x, y);
    this.velocity = new PVector(0, 0);
    this.acceleration = new PVector(0, 0);
};
Beachte, wie nun die Masse und Position nicht mehr mit hartcodierten Zahlen, sondern durch die übergebenen Parameter initialisiert werden. Das bedeutet, dass wir eine Vielzahl von Mover erzeugen können: große, kleine, solche die auf der linken Seite starten und andere welche auf der rechten Seite starten, usw.
// Ein großer Mover auf der linken Seite des Fensters
var m1 = new Mover(10, 0, height/2);
// Ein kleiner Mover auf der rechten Seite des Fensters
var m2 = new Mover(0{,}1, width, height/2);
Wir wollen aber alle Objekte des Arrays mit einer Schleife initialisieren.
for (var i = 0; i < 20; i++) {
    movers[i] = new Mover(random(0.1, 5), 0, 0);
}
Die Masse wird für jeden Mover mit einem Zufallswert zwischen 0.1 und 5, die x-Position mit 0 und die y-Position mit 0 initialisiert. Es gibt sicherlich noch ganz viele andere Möglichkeiten die Objekte zu initialisieren. Dies ist nur ein Beispiel.
Sobald das Array von Objekten deklariert, erstellt und initialisiert ist, ist der Rest des Codes einfach. Wir gehen durch jedes Objekt, übergeben ihm die Kräfte und genießen die Show.
draw = function() {
  background(50, 50, 50);

  for (var i = 0; i < movers.length; i++) {
    var wind = new PVector(0{,}01, 0);
    var gravity = new PVector(0, 0{,}1);
    movers[i].applyForce(wind);
    movers[i].applyForce(gravity);
    movers[i].update();
    movers[i].display();
    movers[i].checkEdges();
  }
};
Schlussendlich sieht das Programm so aus. Beachte, wie die kleineren Kreise den rechten Rand des Fensters schneller als die Großen erreichen. Dies kommt von der Formel: Beschleunigung = Kraft dividiert durch Masse. Je größer die Masse, desto geringer die Beschleunigung.

Der Kurs "Natürliche Simulationen" ist eine Bearbeitung von "The Nature of Code" von Daniel Shiffman, und wird unter der Creative Commons Attribution-NonCommercial 3,0 Unported Lizenz verwendet.

Willst du an der Diskussion teilnehmen?

Noch keine Beiträge.
Verstehst du Englisch? Klick hier, um weitere Diskussionen auf der englischen Khan Academy Seite zu sehen.