Główna zawartość
Programowanie
Kurs: Programowanie > Rozdział 5
Lekcja 5: Siły- Zasady dynamiki Newtona
- Wyzwanie: unoszący się balon
- Ruch wielu obiektów
- Wyzwanie: Piłeczki obijające się od ścian
- Modelowanie grawitacji i tarcia
- Wyzwanie: Progi zwalniające
- Opór powietrza i cieczy
- Wyzwanie: Tonące kłody
- Przyciąganie grawitacyjne
- Wyzwanie: Generator grafiki
- Wzajemne przyciąganie
- Wyzwanie: wzajemne odpychanie
- Projekt: Stworzenie pociesza a stworek tremuje
© 2023 Khan AcademyWarunki użytkowaniapolitykę prywatnościInformacja o plikach cookie
Ruch wielu obiektów
W prawdziwym świecie, na którym się wzorujemy, mamy więcej niż jeden przemieszczający się obiekt - jesteśmy otoczeni przez wiele obiektów z różną masą i położeniem. Sprawdźmy, jak możemy sprawić, by nasz
Mover
lepiej odwzorowywał prawdziwy świat.Aby to zrobić, potrzebujemy szybkiego przeglądu zagadnień programowania obiektowego. Ponownie, nie zamierzamy opisać wszystkich podstaw programowania obiektowego. Jednak biorąc pod uwagę, że koncept tworzenia świata wypełnionego obiektami jest podstawą wszystkich przykładów w tym kursie, warto poświęcić chwilę by nauczyć się obsługi więcej niż jednego obiektu.
Dla przypomnienia, oto jak nasz aktualny
Mover
wygląda. Jest on identyczny do obiektu Mover
, który stworzyliśmy wprowadzając wektory, lecz z dwoma dodatkami—masą(mass)
i nową metodą applyForce()
:Teraz, gdy nasz obiekt jest ustalony, możemy stworzyć, dajmy na to, dwanaście instancji obiektu
Mover
w tablicy, inicjalizując je za pomocą pętlivar movers = [];
for (var i = 0; i < 20; i++) {
movers[i] = new Mover();
}
Ale teraz mamy mały problem. Jeśli odwołamy się do konstruktora obiektu
Mover
…var Mover = function() {
this.mass = 1;
this.position = new PVector(30, 30);
this.velocity = new PVector(0, 0);
this.acceleration = new PVector(0, 0);
};
…odkryjemy, że każdy obiekt typu
Mover
jest tworzony dokładnie tak samo. Chcemy, aby różne obiekty typu Mover
różniły się masą i zaczynały w różnych położeniach. Musimy teraz zwiększyć złożoność naszego konstruktora dodając argumenty.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);
};
Zauważ, że masa i położenie nie są już na sztywno wpisanymi wartościami, lecz inicjalizowane są przez argumenty przekazane do konstruktora. Oznacza to, że możemy stworzyć wiele różnych obiektów typu
Mover
: dużych, małych, znajdujących się po lewej stronie ekranu, znajdujących się po prawej stronie ekranu, itp.// Duży Mover po lewej stronie okna
var m1 = new Mover(10, 0, height/2);
// Mały Mover po prawej stronie okna
var m2 = new Mover(0.1, width, height/2);
W tablicy chcielibyśmy jednak zainicjować wszystkie obiekty za pomocą pętli.
for (var i = 0; i < 20; i++) {
movers[i] = new Mover(random(0.1, 5), 0, 0);
}
Dla każdego utworzonego Movera, masa jest losową wartością pomiędzy 0.1 a 5. Współrzędna x położenia początkowego ma wartość 0, początkowa współrzędna y również ma wartość zero. Oczywiście, istnieje znacznie więcej sposobów by zainicjować obiekty; te przykłady to tylko przedstawienie jednej z możliwych opcji.
Gdy już tablica obiektów zostanie zadeklarowana, stworzona i zainicjowana, reszta kodu jest prosta. Wywołujemy każdy z obiektów, dodajemy do nich siły występujące w środowisku i cieszymy się widowiskiem.
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();
}
};
Oto jak wygląda program w całości. Zauważ, że w tym programie mniejsze kółka docierają na prawy koniec ekranu szybciej niż większe. Wynika to z naszego wzoru: przyspieszenie = siła podzielić przez masę. Im większa masa, tym mniejsze przyspieszenie.
Ten kurs "Symulacje Natury" jest pochodną z "Natury Kodu " stworzonej przez Daniela Shiffmana, użytej pod licencją Creative Commons Attribution-NonCommercial 3.0 Unported License.
Chcesz dołączyć do dyskusji?
Na razie brak głosów w dyskusji