Prosta kinematyka w dwóch wymiarach¶
Stwórz hierarchię klas, które umożliwią proste symulacje fizyczne w dwóch wymiarach
Potrzebne elementy składowe (klasy)¶
- operacje matematyczne¶
napisz klasę
Vec2udostępniającą podstawowe operacje matematyczne w 2 wymiarach- reprezentacja obiektów¶
potrzebna będzie hierarchia obiektów, które będą symulowane; np klasa
CircleorazPolygon- system¶
klasa
Systempowinna zawierać w sobie listę obiektów: ruchomych elementów sceny, obiekty nieruchome oraz zapewniać warunki brzegowe- solver¶
rozwiązuje równanie ruchu; tu akurat jest to klasa całkująca wg schematu Eulera
- observer¶
odpowiada(ją) za wydruk wyników na ekran
0. Algebra w 2D¶
Napisz klasę Vec2, która będzie miała pola prywatne __x oraz __y, do których dostęp zapewnią settery i gettery
zaimplementowane jako dekoratory @property oraz @x.setter. Zerknij na przykład dekoratorów w Pythonowe to i owo II.
Klasa powinna posiadać też operatory : += -=, metodę dp() liczącą iloczyn skalarny, metody length() i normalize()
Napisz też funkcję point_on_segment_projection(), która znajduje najkrótszą odległość
punktu do odcinka oraz miejsce przecięcia odcinka z linią prostopadłą, przechodzącą przez dany punkt.
Powyższa interaktywna grafika ilustruje oczekiwany wynik obliczeń. Parametr t wyznaczający rzut punktu p
na odcinek pomiędzy b i e obliczamy ze wzoru:
1. Napisz klasy Atom oraz Polygon¶
Klasa Atom będzie reprezentowała koła - elementarne obiekty poruszające się na scenie,
dziedzicząca po niej klasa Polygon - wielokąty (trójkąty, prostokąty, itp).
Załóż, że każdy wielokąt jest łamaną zamkniętą, którą można przechowywać jako listę kolejnych wierzchołków.
2. Napisz klasę System¶
Na początku klasa System będzie zawierała tylko listę kół oraz wielokątów. Wg. jednej z możliwych implementacji,
będą to dwie oddzielne listy: jedna przechowująca obiekty poruszające się, druga zaś nieruchome, w tym także pudełko
zawierające symulację.
3. Napisz klasę Solver¶
Klasa Solver będzie elementem odpowiedzialnym za przeprowadzenie symulacji.
Odpowiedzialna ona będzie za:
aktualizację położeń wg wzoru \(\vec{x}_{i+1} = \vec{x}_{i} + dt \vec{v}_{i}\)
rozwiązywanie zderzeń pomiędzy kołem a bokami wielokąta, przede wszystkim ze ściankami pudełka
rozwiązywanie zderzeń pomiędzy kołami
Zderzeń pomiędzy kołem a bokiem wielokąta wymaga wyznaczenia odległości pomiędzy tymi obiektami a także
punktu przecięcia t na odcinku, przez który przechodzi prosta prostopadła do odcinka.
Wykorzystaj do obliczeń wzór podany powyżej. Zauważ, że koło zderza się z odcinkiem
wtedy i tylko wtedy, kiedy \(0 \le t \le 1\). Oznaczając przez \(\vec{n}\) normalną do odcinka a przez
\(\vec{v}\) vektor prędkości koła przed zderzeniem, nowy wektor prędkości \(\vec{v_n}\) obliczamy ze wzorów:
gdzie \(\bullet\) oznacza iloczyn skalarny, np. \(\vec{n} \bullet \vec{n}\) to po prostu kwadrat długości wektora \(\vec{n}\)
Zderzenia pomiędzy dwoma kołami rozpatrujemy wg poniższych wzorów:
(patrz strona na Wikipedii )
Przy implementacji powyższych wzorów można wprowadzić spore uproszczenie. Ostatecznie wyrażenia te można sprowadzić do: