Hauptinhalt
Programmierung
Kurs: Programmierung > Lerneinheit 5
Lektion 5: Kräfte- Newtonsche Bewegungsgesetze
- Challenge: Schwebender Ballon
- Bewegung von vielen Objekten
- Challenge: Wandbälle
- Gravitation und Reibung modellieren
- Challenge: Liegende Polizisten
- Widerstand in Luft und Flüssigkeit
- Challenge: Sinkendes Treibholz
- Anziehungskraft der Gravitation
- Challenge: Kunstwerk-Generator
- Gegenseitige Anziehung
- Challenge: Gegenseitige Abstoßung
- Projekt: Angenehmes und fürchterliche Räuber
© 2023 Khan AcademyNutzungsbedingungenDatenschutzerklärungCookie-Meldung
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
Mover
n: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
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.