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
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 initialisierenvar 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.