If you're seeing this message, it means we're having trouble loading external resources on our website.

Jeżeli jesteś za filtrem sieci web, prosimy, upewnij się, że domeny *.kastatic.org i *.kasandbox.org są odblokowane.

Główna zawartość

Prędkość kątowa

Pamiętasz to?
położenie = położenie + prędkość
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
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 obiektuMover. 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
Rozumiesz angielski? Kliknij tutaj, aby zobaczyć więcej dyskusji na angielskiej wersji strony Khan Academy.