W rozważaniach pomijamy opór
powietrza. Chcemy otrzymać odpowiedź na następujące pytania:
ile minie sekund do momentu osiągnięcia maksymalnej wysokości?
ile minie sekund do osiągnięcia wysokości 5 metrów?
jaka jest maksymalna wysokość rzutu kamienia?
Tego typu proste zadania można rozwiązywać posługując się rozwiązaniami
analitycznymi (dokładne rozwiązania).
Rozpatrywany ruch jest ruchem ze stałym przyspieszeniem, a = -g, gdzie g
jest przyspieszeniem ziemskim, g = 9.81 m/s2. Taki ruch opisany jest
pokazanym uprzednio zestawem pięciu równań.
80
Fizyka dla programistów gier
Rozwiązując zadanie, najpierw wyliczymy ile minie sekund do momentu
osiągnięcia maksymalnej wysokości. Na podstawie wzoru nr (1) oraz wiedząc,
że v = 0 w najwyższym punkcie obliczamy czas:
Widzimy, że potrzeba 1.22 sekundy, aby osiągnąć maksimum rzutu. Kolejno
obliczamy maksymalną wysokość rzutu kamienia.
Na podstawie wzoru (3) oraz faktu, że punkt wyrzucenia kamienia x0 = 0, oraz
że v = 0 gdy kamień osiągnie maksymalna wysokość, maksymalna wysokość
wynosi:
Kamień wzniesie się na wysokość 7.33 m.
Na koniec chcemy ustalić ile minie sekund do osiągnięcia wysokości 5 metrów?
Korzystamy z równania (2), oraz wiedząc, że x0 = 0,oraz v = 0 , x = 2 m, mamy:
Po wstawieniu danych liczbowych:
i uporządkowaniu, otrzymujemy równanie kwadratowe:
Po rozwiązaniu mamy wartości t = 0.52 s oraz t = 1.9 s.
Nie zawsze można otrzymać rozwiązanie zadania w postaci analitycznej. W
takim przypadku musimy wykonać symulacje komputerowe. Aby pokazać
metodę, posłużymy sie ponownie rzutem pionowym do góry, przyjmujemy, że
prędkość początkowa kamienia wyniosła 12 m/s. Będziemy mogli także
wykazać poprawność rozwiązania przybliżonego (otrzymanego z symulacji).
Kamień rzucony w górę porusza się ze stałym przyspieszeniem, a = -g. W takim
ruchu prędkość maleje, w punkcie największego wzniesienia prędkość kamienia
v = 0. Do opisania ruchu wykorzystujemy zależności:
4. Ruch obiektów w polu grawitacyjnym
81
Mamy następujące zadanie do rozwiązania: napisać program symulujący ruch
kamienia rzuconego pionowo do góry z daną prędkością początkową.
Dla kolejnych wartości upływającego czasu, z chwilą początkową t = 0, w
kolejnych krokach czasowych (z ustalonym przyrostem czasu) obliczamy
prędkość obiektu i przebytą drogę. Obliczenia prowadzimy do momentu, gdy
prędkość obiektu spadnie do zera. Schemat obliczeń ma następująca postać:
W kolejnych momentach czasowych obliczamy prędkość i przebytą drogę
obiektu, aż do chwili, gdy jego prędkość osiągnie zero. W systemach
komputerowych unikamy porównywania liczb zmiennoprzecinkowych z zerem,
w zamian wykorzystujemy liczbę dostatecznie małą, oznaczamy ją, jako
zmienna eps, wyznacza on dokładność obliczeń (obok kroku czasowego dt).
W programie kroki iteracyjne wykonuje funkcja o nazwie simulate(), której
prototyp ma postać:
double simulate (double (*f)(double), double v0,double dt, double eps);
Funkcja simulate() otrzymuje wskaźnik do funkcji f = gt, prędkość początkową, wartość kroku czasowego oraz wartość eps.
Listing 4.1. implementacja funkcji fx() oraz simulate()
double fx(double t)
{ // v = - gt, m/s , predkosc w ruchu opoznionym
// g = 9.81 m/s*s, przyspieszenie ziemskie
return -9.81*t ;
}
double simulate (double (*f)(double), double v0,double dt, double eps)
{ double v=v0, s=0, t=0;
while(v > eps)
{ printf("\n t= %5.2f \t v= %5.2f \t s= %5.2f ",t,v,s);
t = t + dt ;
v = v0 + f(t) ;
s = 0.5 * (v0 + v) * t ;
}
return t;
}
82
Fizyka dla programistów gier
Wykorzystując opracowane funkcje, w wyniku otrzymujemy wartości prędkości
obiektu oraz przebytą drogę w funkcji czasu.
Listing 4.2. Modelowanie ruchu obiektu, rzut pionowy
// włączyć definicje fx() oraz simulate()
#include <stdio.h>
#include<conio.h>
double fx(double t);
double simulate (double (*f)(double), double v0,double dt, double eps);
int main()
{ // v0 dt eps
simulate(fx, 12.0, 0.1, 0.01);
getche();
return 0;
}
W wyniku działania programu (dla kroku czasowego 0.1 sekundy) otrzymujemy
dane pokazane w tabeli 4.1. Maksimum wysokości obiekt osiągnie po 1.2
sekundy i wzniesie się na wysokość 7.34 m. Na dokładność obliczeń wpływa
krok czasowy i ustalony błąd (w naszym przypadku zakładamy błąd na poziomie
1 procenta (eps = 0.01). Gdy krok czasowy zmniejszymy do 0.01 sekundy
otrzymamy następujący wynik: t = 1.22, v= 0.03, s= 7.34.
Tabela 4.1. Droga i czas w rzucie pionowym, program 4.2
t(czas)
v(prędkość) s(droga)
0.00
12.00
0.00
0.10
11.02
1.15
0.20
10.04
2.20
0.30
9.06
3.16
0.40
8.08
4.02
0.50
7.09
4.77
0.60
6.11
5.43
0.70
5.13
6.00
0.80
4.15
6.46
0.90
3.17
6.83
1.00
2.19
7.09
1.10.
1.21
7.26
1.20
0.23
7.34
4. Ruch obiektów w polu grawitacyjnym
83
4.4. Rzut poziomy i ukośny
W polu grawitacyjnym Ziemi ruch obiektów jest ruchem krzywoliniowym. Pod
wpływem siły ciężkości ciało będzie spadało (rys.4.1oraz 4.2). Wyróżniamy
ruch poziomy i ruch ukośny. Rzut poziomy jest to ruch, w którym ciału
nadajemy prędkość skierowaną równolegle do poziomu. Przykładem takiego
ruchu może być ruch pocisku wystrzelonego z poziomo ustawionej strzelby. W
ogólnym przypadku ruch taki odbywa się w przestrzeni trójwymiarowej, często
jednak dla potrzeb grafiki komputerowej można rozważać kinetykę punktu
materialnego w przestrzeni dwuwymiarowej.
Rys.4.2. Ruch obiektu w polu grawitacyjnym, v0 jest to prędkość
początkowa, wektor v0 tworzy kąt z dodatnim kierunkiem osi x.
W rzucie poziomym (rys. 4.3) kąt ma wartość zero, zwrot wektora prędkości
v0 w chwili początkowej jest skierowany wzdłuż osi x, ciało znajduje się na
wysokości y = h.
Rys. 4.3. Rzut poziomy, prędkość początkowa wynosi vx
W celu wyznaczenia kształtu toru obiektu w rzucie poziomym musimy
rozwiązać równania ruchu. Wiemy, że ruch w poziomie jest niezależny od ruchu
|