Główna zawartość
Programowanie
Kurs: Programowanie > Rozdział 5
Lekcja 6: Obroty- Kąty i jednostki
- Wyzwanie: Kręcąca się pałeczka
- Prędkość kątowa
- Wyzwanie: Staczający się głaz
- Trygonometria
- Stosunki trygonometryczne w trójkątach prostokątnych
- Ruch zgodnie z wektorem prędkości
- Wyzwanie: Skręcający samochód
- Współrzędne biegunowe
- Wyzwanie: Malujący spiralę
- Projekt: Niszczyciel asteroid
© 2023 Khan AcademyWarunki użytkowaniapolitykę prywatnościInformacja o plikach cookie
Prędkość kątowa
Pamiętasz to?
położenie = położenie + prędkość
prędkość = prędkość + przyspieszenie
prędkość = prędkość + przyspieszenie
Jest to wiedza na którą poświęciliśmy dwie ostatnie sekcje. Okazuje się, że dokładnie taką samą logikę możemy zastosować do obracającego się obiektu.
kąt = kąt + prędkość kątowa
prędkość kątowa = prędkość kątowa + przyspieszenie kątowe
prędkość kątowa = prędkość kątowa + przyspieszenie kątowe
W zasadzie to jest to prostsze niż w przypadku zwykłego położenia i prędkości ponieważ kąt jest wartością skalarną—liczbą a nie wektorem!
Używając odpowiedzi z poprzedniego zadania, załóżmy że chcemy obrócić pałeczkę w ProcessingJS o jakiś kąt. Musielibyśmy napisać następujący kod podobny do tego poniżej:
translate(width/2, height/2);
rotate(angle);
line(-50, 0, 50, 0);
ellipse(50, 0, 8, 8);
ellipse(-50, 0, 8, 8);
Po dodaniu naszych zasad ruchu mamy poniższy program. Pałeczka rozpoczyna od pojawienia się na ekranie bez rotacji i zaczyna obracać się coraz szybciej wraz ze wzrostem kąta rotacji:
Ten schemat może zostać włączony do naszego obiektu
Mover
. Dla przykładu, możemy dodać właściwości powiązane z naszym ruchem kątowym do konstruktora naszego obiektuMover
.var Mover = function(m, x, y) {
this.position = new PVector(x, y);
this.mass = m;
this.angle = 0;
this.aVelocity = 0;
this.aAcceleration = 0;
this.velocity = new PVector(random(-1, 1), random(-1, 1));
this.acceleration = new PVector(0, 0);
};
A następnie w funkcji
update()
aktualizujemy zarówno położenie jak i kąt według tego samego algorytmu!Mover.prototype.update = function () {
this.velocity.add(this.acceleration);
this.position.add(this.velocity);
this.aVelocity += this.aAcceleration;
this.angle += this.aVelocity;
this.acceleration.mult(0);
};
Oczywiście, żeby to miało jakieś znaczenie nasz obiekt powinien się obracać podczas wyświetlania na ekranie.
Mover.prototype.display = function () {
stroke(0, 0, 0);
fill(175, 175, 175, 200);
rectMode(CENTER);
// pushMatrix i popMatrix są wymagane żeby obrót kształtu
// nie wpływał na resztę otoczenia
pushMatrix();
// Ustaw położenie początkowe na położeniu kształtu
translate(this.location.x, this.location.y);
// Obróć o kąt
rotate(this.angle);
rect(0, 0, this.mass*16, this.mass*16);
popMatrix();
};
Gdybyśmy uruchomili nasz kod w tym momencie nie zobaczylibyśmy nic nowego. Nie zobaczylibyśmy nic nowego ponieważ przyspieszenie kątowe (this.aAcceleration = 0;) jest inicjalizowane z wartością zero. Żeby obiekt zaczął się obracać musimy nadać mu przypieszenie! Oczywiście moglibyśmy wstawić do kodu dowolną liczbę:
this.aAcceleration = 0.01;
Oto, jak ten program wygląda z powyższą logiką, obliczając siłę przyciągania z obiektem centralnym:
To niezły start, ale możemy stworzyć znacznie lepszy efekt dynamicznie przypisując przyspieszenie kątowe do sił w środowisku - w końcu obiekty zwykle nie kręcą się z własnej woli! Możemy całkiem nieźle rozwinąć te funkcje, próbując modelować fizyki przyspieszenia kątowego za pomocą momentu siły i momentu bezwładności. Ten poziom symulacji jest jednak poza zakresem tego kursu - ale jeszcze trochę skomplikujemy sprawę.
Na razie, szybkie i prowizoryczne rozwiązanie wystarczy. Możemy stworzyć rozsądne wyniki poprzez banalne obliczenia przyspieszenia kątowego jako funkcję wektora przyspieszenia obiektu. Oto przykład takiego podejścia:
this.aAcceleration = this.acceleration.x;
Tak, jest to całkowicie arbitralne. Ale to już coś. Jeżeli obiekt przyspiesza w prawo, jego przyspieszenie kątowe zwiększa się w kierunku zgodnym z ruchem wskazówek zegara, przyspieszenie w lewą stronę skutkuje w obrocie w stronę przeciwną do ruchu wskazówek zegara. Oczywiście w tym przypadku warto pomyśleć o skali. Wartość x wektora przyspieszenia może być zbyt duży, przez co nasz obiekt będzie kręcił się w sposób, który będzie śmieszny lub mało realistyczny. Tak wiec dzielenie wartości x przez pewną wartość, albo na przykład ograniczenie prędkości kątowej do rozsądnych granic może nam bardzo pomóc. Oto cała metoda
update()
z tymi poprawkami.Mover.prototype.update = function () {
this.velocity.add(this.acceleration);
this.position.add(this.velocity);
// Policzmy przyspieszenie kątowe na podstawie przyspieszenia poziomego,
// i podzielmy je, aby nie było zbyt dużen this.aAcceleration = this.acceleration.x / 10.0;
this.aVelocity += this.aAcceleration;
// Użyjmy ograniczenia, aby upewnić się, że prędkość nie wyjdzie poza zakresl
this.aVelocity = constrain(this.aVelocity, -0.1, 0.1);
this.angle += this.aVelocity;
this.acceleration.mult(0);
};
Oto jak wygląda cały program, po wprowadzeniu tych zmian:
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