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

Gegenseitige Anziehung

Hoffentlich findest du es hilfreich, dass wir mit einer einfachen Version, bei der ein Objekt ein anderes anzieht, angefangen haben und erst dann zur komplexen Version in der ein Objekt viele andere Objekte anzieht gegangen sind. Es ist jedoch wahrscheinlich, dass du dich bald in einer noch komplexeren Simulation befindest: viele Objekte ziehen sich gegenseitig an. Mit anderen Worten, jedes Objekt in einem System zieht jedes andere Objekt (außer sich selbst) in diesem System an.
Wir haben aber schon fast die ganze Arbeit dafür gemacht. Betrachten wir ein Programm mit einem Array von Movern:
var movers = [];

for (var i = 0; i < 5; i++) {
    movers[i] = new Mover(
        random(0.1, 2),
        random(width),
        random(height));
}

draw = function() {
    background(255, 255, 255);
    for (var i = 0; i < movers.length; i++) {
        movers[i].update();
        movers[i].display();
    }
};
In der Funktion draw() müssen wir aber ein paar Modifikationen machen. Derzeit sagen wir: “Für jeden Mover i, aktualisiere ihn und stelle ihn dar.” Was wir jetzt aber tun müssen ist: “Für jeden Mover i, berechne die Anziehungskraft mit allen anderen Movern j und aktualisiere ihn und stelle ihn dar.”
for (var i = 0; i < movers.length; i++) {
    // For every Mover, check every Mover!
    for (var j = 0; j < movers.length; j++) {
        var force = movers[j].calculateAttraction(movers[i]);
        movers[i].applyForce(force);
    }
}

for (var i = 0; i < movers.length; i++) {
    movers[i].update();
    movers[i].display();
}
Beachte, dass wir eine völlig neue for-Schleife über der Update- und Displayschleife erstellt haben. Das liegt daran, dass wir sicherstellen wollen, dass wir alle Anziehungskräfte berechnen, bevor wir die einzelnen Mover aktualisieren. Wenn wir versehentlich jeden Mover in dieser ersten for-Schleife aktualisieren würden, würde das die Berechnung der Anziehungskräfte danach beeinflussen, und sie wären nicht genau.
Unser Code wird noch nicht funktionieren, da jeder Mover eine Methode calculateAttraction() braucht. Im vorherigen Beispiel hatten wir einen Attractor mit einer Methode calculateAttraction(). Da nun Mover andere Mover anziehen, können wir diese Methode in das Objekt Mover kopieren:
Mover.prototype.calculateAttraction = function(m) {
  var force = PVector.sub(this.position, m.position);
  var distance = force.mag();
  distance = constrain(distance, 5{,}0, 25{,}0);                        
  force.normalize();

  var strength = (G * this.mass * m.mass) / (distance * distance);
  force.mult(strength);
  return force;
};
Natürlich gibt es ein kleines Problem. Wenn wir nun jeden Mover i und jeden Mover j anschauen, ist i mal j richtig? Soll zum Beispiel Mover #3 den Mover #3 anziehen? Natürlich ist die Antwort nein! Wenn es fünf Objekte gibt, soll Mover #3 nur 0, 1, 2 und 4 anziehen. Wir wollen aber beide Kräfte, die von Mover #3 auf Mover #1 und die von Mover#1 auf Mover#3 berechnen und anwenden. Die Kräfte werden für dieses Paar gleich sein, aber die daraus resultierende Beschleunigung wird je nach Masse unterschiedlich sein, da ja die Masse der beiden nicht unbedingt gleich ist. Unsere Tabelle der Anziehung sieht so aus:
0 ⇢ 1, 2, 3, 4
1 ⇢ 0, 2, 3, 4
2 ⇢ 0, 1, 3, 4
3 ⇢ 0, 1, 2, 4
Daher beenden wir das Beispiel mit einer kleinen Modifikation in der for-Schleife, damit die innere Schleife verhindert, dass Objekte sich selbst anziehen:
for (var i = 0; i < movers.length; i++) {
    for (var j = 0; j < movers.length; j++) {
       if (i !== j) {
         var force = movers[j].calculateAttraction(movers[i]);
         movers[i].applyForce(force);
       }
    }
}
Fügen wir nun alles in einem Programm zusammen.

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.