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ść

Trygonometria i siły: wahadło

Pamiętasz prawa ruchu Newtona, które dyskutowaliśmy kilka rozdziałów wcześniej? W tamtej sytuacji korzystaliśmy z praw Newtona aby obliczyć przyspieszenie naszego obiektu i na tej podstawie wyznaczyć jego nową pozycję. Tutaj zrobimy to samo z wahadłem - obliczymy przyspieszenie wahadła i z tego wyznaczymy jego nową pozycję. Okaże się także, że będziemy potrzebować znajomości trygonometrii, aby rozwiązać to zadanie.
Wahadło to kulka zawieszona na sztywnym pręcie, którego drugi koniec umocowany jest na sworzniu w taki sposób, że może się swobodnie obracać. Oczywiście prawdziwe wahadło znajduje się w przestrzeni trójwymiarowej, ale na razie skupmy się na prostszym scenariuszu, wahadle w przestrzeni dwuwymiarowej—płótnie programu. .
Schemat wahadła z kątami
W sekcji poświęconej Siłom, nauczyliśmy się jak używać sił (takich jak siła grawitacji na powyższym wykresie), dzięki którym obiekty przyspieszają: F=MA, lub A=F/M.
W tym przypadku, kulka nie spada swobodnie w dół, ponieważ zawieszona jest na ramieniu wahadła, na sztywnym, lekkim pręcie umocowanym do trzpienia, na którym może się swobodnie obracać. Zamiast tego, kulka waha się wokół swojego położenia równowagi, a naszym zadaniem jest obliczenie przyspieszenia kulki w tym ruchu. Nazwiemy to przyspieszenie przyspieszeniem kątowym, ponieważ w swoim ruchu wahadło zmienia kąt, pod jakim jest w danej chwili nachylone w stosunku do pionu.
Aby wyznaczyć przyspieszenie kątowe wahadła rozłożymy siłę grawitacji działającą na kulkę na dwie prostopadłe składowe. Jedna składowa działa wzdłuż ramienia wahadła. Możemy ją zignorować, bo nie ma wpływu na ruch kulki - jest całkowicie równoważona przez siłę, z jaką ramię wahadła przytrzymuje kulkę. Druga składowa jest prostopadła do ramienia wahadła. To dzięki tej składowej wahadło zyskuje przyspieszenie skierowane "do boku", co powoduje, że się waha. Przyjrzyjmy się dokładnie składowym siły grawitacji:
Siłą grawitacji Fg działa zawsze pionowo w dół. Fp jest składową siły grawitacji skierowaną prostopadle do ramienia wahadła i skierowaną zawsze w kierunku położenia równowagi, w którym wahadło wisi pionowo. Składowa Fa jest skierowana wzdłuż ramienia wahadła i nie odgrywa roli przy obliczaniu przyspieszenia kątowego.
Jak obliczyć Fp? Pomoże nam trygonometria. Jeśli spojrzymy na powyższy rysunek, to zobaczymy że Fg pełni rolę przeciwprostokątnej w trójkącie prostokątnym, w którym Fp pełni w tym trójkącie rolę przyprostokątnej przeciwległej, a kąt θ jest kątem, pod jakim ramię wahadła jest odchylone od pionu. Korzystając z tego, że sinus kąta jest równy stosunkowi przyprostokątnej przeciwległej do przeciwprostokątnej, dostajemy:
sin(θ)=FpFg
Dlatego też:
Fp=Fgsin(θ)
Znakomicie, mamy proste wyrażenie na Fp. Powróćmy teraz do naszego podstawowego pytania: ile wynosi kątowe przyspieszenie wahadła? Jeśli obliczymy przyspieszenie kątowe, będziemy mogli zastosować nasze .zakodowane prawa ruchu i wyznaczyć nową wartość kąta wahadła.
prędkość kątowa = prędkość kątowa + przyspieszenie kątowe
kąt = kąt + prędkość kątowa
Dzięki drugiej zasadzie dynamiki Newtona wiemy, że istnieje związek między siła F a przyspieszeniem A, dokładniej F=MA, lub A=F/M i możemy wstawić powyższy wzór do tego związku i obliczyć nasze przyspieszenie kątowe. Zobaczcie, czy będziecie w stanie to ogarnąć:
Zacznijmy od tego:
siła, działająca na wahadło w kierunku ruchu = siła grawitacji * sin(θ)
Następnie dzielimy prawą stronę przez masę, aby otrzymać przyspieszenie, zgodnie z drugą zasadą dynamiki Newtona:
przyspieszenie kątowe wahadła = (siła grawitacji * sin(θ)) / masa
Ale chwileczkę! Siła grawitacji przez masę daje nam przyspieszenie ziemskie, tak więc możemy przekształcić nasze równanie na przyspieszenie kątowe w taki sposób:
przyspieszenie kątowe wahadła = przyspieszenie ziemskie * sin(θ)
Ta-da! Mamy teraz sposób, aby obliczać przyspieszenie kątowe.
Możemy jeszcze bardziej uprościć to wyrażenie, skoro jesteśmy programistami ProcessingJS, a nie fizykami. Tak, wiemy, że przyspieszenie ziemskie wynosi 9,8 metra na sekundę kwadrat. Ale ta liczba nie jest dla nas istotna. To, co my tutaj mamy to po prostu narzucona stałą(nazwiemy ją grawitacją), której możemy użyć do skalowania przyspieszenia do wartości, która wydaje się rozsądna.
przyspieszenie kątowe = grawitacja * sin(θ)
Niesamowite. Spójrz, jak prosty jest ten końcowy wzór. Zastanawiasz się może, po co były te wszystkie obliczenia? Znaczy, wiadomo, warto się uczyć, ale czy nie prościej byłoby po prostu powiedzieć, "Hej, wiemy że przyspieszenie kątowe wahadła równa się stałej pomnożonej przez sinus kąta wychylenia."
W tym momencie warto sobie przypomnieć, że celem tego kursu nie jest nauczenie się w jaki sposób wahają się wahadła lub jak działa grawitacja. Naszym celem jest nauczenie się myśleć kreatywnie w jaki sposób obiekty mogą przemieszczać się na ekranie w komputerowym systemie graficznym. Wahadło to po prostu studium przypadku. Jeżeli możecie zrozumieć podejście do programowania wahadła, będziecie mogli użyć tych samych technik podczas tworzenia swojego własnego świata.
Oczywiście, jeszcze nie skończyliśmy. Możemy być zadowoleni z naszego prostego, eleganckiego wzoru, ale wciąż czeka nas implementacja go w kodzie. To bardzo dobry moment, aby przećwiczyć naszego programowania obiektowego poprzez stworzenie obiektu Pendulum. Pomyślmy o wszystkich właściwościach na które natknęliśmy się w naszej rozprawie na temat wahadeł, które musimy śledzić:
  • długość ramienia
  • kąt
  • prędkość kątowa
  • przyspieszenie kątowe
Chcielibyśmy również móc określić miejsce, z którego wisi wahadło. Dobrym początkiem byłby więc następujący konstruktor:
var Pendulum  = function(origin, armLength) {
    this.origin = origin;
    this.armLength = armLength;

    this.angle = PI/4;
    this.aVelocity = 0.0;
    this.aAcceleration = 0.0;
};
Będziemy również potrzebowali metody update() do aktualizacji kąta wahadła na podstawie naszego wzoru…
Pendulum.prototype.update = function() {
  // Narzucona stała
  var gravity = 0.4;
  // Oblicz przyspieszenie
  this.aAcceleration = -1 * gravity * sin(this.angle);
  // Zwiększ prędkość
  this.aVelocity += this.aAcceleration;
  // Zwiększ kąt
  this.angle += this.aVelocity;
};
…jak również metody display() do rysowania wahadła na ekranie. Nasuwa się pytanie: “Gdzie powinniśmy narysować wahadło?” Znamy kąt i długośc ramienia, ale skąd mamy znać koordynate (Kartezjańskie!) x,y zarówno dla punktu przyłożenia wahadła(nazwijmy go źródłem) jak i położenia kulki(nazwijmy go po prostu położeniem)? To może być trochę męczące, ale ponownie odpowiedzią jest trygonometria. Przyjrzyjmy się wykresowi po lewej.
Źródło to coś, co po prostu wymyślamy, tak samo jak długość ramienia. Powiedzmy, że konstruktor naszego wahadła wygląda tak:
var p = new Pendulum(new PVector(100, 10), 125);
Przechowujemy aktualny kąt we właściwości angle. Więc w odniesieniu do źródła, pozycja wahadła jest współrzędną biegunową: (r, angle). A potrzebujemy ją w postaci współrzędnych kartezjańskich. Na szczęście dla nas, spędziliśmy pewien czas w sekcji o Kątach wyliczając wzór na konwersję współrzędnych biegunowych na kartezjańskie. W tamtym rozdziale nasz kąt był zależny od osi poziomej, ale tutaj jest zależny od osi pionowej, więc będziemy używać sin() dla współrzędnej x i cos() dla współrzędnej y, w przeciwieństwie do odpowiednio cos() i sin() używanych wcześniej. Tak więc możemy obliczyć pozycję względną do źródła za pomocą wzoru konwersji, a następnie dodać do niej pozycję źródła:
this.position = new PVector(
   this.armLength * sin(this.angle),
   this.armLength * cos(this.angle));
this.position.add(this.origin);
stroke(0, 0, 0);
fill(175, 175, 175);
line(this.origin.x, this.origin.y, this.position.x, this.position.y);
ellipse(this.position.x, this.position.y, 16, 16);
Zanim wszystko to zapakujemy w całość, pozostaje ostatni szczegół o którym zapomniałem wspomnieć. Pomyślmy przez chwilę o ramieniu wahadła. Czy to metalowy pręt? Struna? Gumka? Jak jest przyczepiona do punktu przyłożenia? Jak długi jest? Jaka jest jego masa? Czy akurat wieje wiatr? Istnieje wiele pytań, opisujących rzeczy, które miałyby wpływ na tą symulację, które możemy zadać. Żyjemy jednak, oczywiście, w fantastycznym świecie, gdzie ramię wahadła jest idealnym prętem który nigdy się nie zgina,a masa kulki jest skupiona w jednym, nieskończenie małym punkcie.
Niemniej jednak nawet jeżeli nie chcemy martwić się tymi wszystkimi kwestiami, powinniśmy dodać jedną dodatkową zmienną do naszych obliczeń przyspieszenia kątowego. Aby uprościć sprawy, w naszym wyliczeniu przyspieszenia wahadła, zakładaliśmy, że długość ramienia wahadła wynosi 1. Tak na prawdę, długość ramienia wahadła znacząco wpływa na przyspieszenie: im dłuższe ramie, tym mniejsze przyspieszenie. Aby dokładnie zasymulować wahadło, dzielimy przez tą długość, w tym wypadku armLength. W celu uzyskania dokładniejszego wytłumaczenia, odwiedźcie stronę The Single Pendulum.
this.aAcceleration = (-1 * gravity / this.armLength) * sin(this.angle);
Na sam koniec należy wspomnieć, że prawdziwe wahadło ma również styczność z siłą tarcia(w punkcie przyłożenia) i oporem powietrza. W takiej wersji naszego kodu wahadło będzie się zawsze huśtać, więc aby uczynić nasze dzieło bardziej realistycznym, możemy użyć sztuczki do “tłumienia”. Napisałem sztuczki, ponieważ zamiast modelować siły oporu z pewnym stopniem dokładności(tak jak to robiliśmy w dziale poświęconych siłom), możemy uzyskać podobny efekt po prostu zmniejszając prędkość kątową w każdym cyklu. Poniższy kod zmniejsza prędkość o 1% (lub mnożymy ją o 99%) podczas każdej ramki animacji:
this.aVelocity *= this.damping;
Zbierając wszystko w spójną całość, mamy następujący przykład. Dodaliśmy trochę funkcjonalności aby ułatwić przeciąganie kulki i zrzucanie jej z różnych wysokości. Wypróbujcie je!

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.