diff options
| Commit | 2a17c8d1a276baafab373d8a40771a365a96864d (patch) | |
|---|---|---|
| Author | 2024-03-14 10:19:34 +0200 | |
| Committer | 2024-03-14 10:19:34 +0200 | |
| Files | 42616b3129415fef5cd768407d83b0b4e23b3e77 /src | |
| syndamia.com-2a17c8d1a276baafab373d8a40771a365a96864d.tar syndamia.com-2a17c8d1a276baafab373d8a40771a365a96864d.tar.gz syndamia.com-2a17c8d1a276baafab373d8a40771a365a96864d.zip | ||
| Parent | 0e3952ad2952b2f396f3969c6dc1e0e025a60cfa (diff) | |
(te/oop-2023/w4) Added hard exercise
2 files changed, 30 insertions, 1 deletions
| -rw-r--r-- | src/teaching/oop-2023/week4/img/Rotation_matrix.png | bin | 0 -> 12305 bytes | |||
| -rw-r--r-- | src/teaching/oop-2023/week4/index.md | 31 |
diff --git a/src/teaching/oop-2023/week4/img/Rotation_matrix.png b/src/teaching/oop-2023/week4/img/Rotation_matrix.png Binary files differnew file mode 100644 index 0000000..76faa6f --- /dev/null +++ b/src/teaching/oop-2023/week4/img/Rotation_matrix.png diff --git a/src/teaching/oop-2023/week4/index.md b/src/teaching/oop-2023/week4/index.md index db15412..ac0190c 100644 --- a/src/teaching/oop-2023/week4/index.md +++ b/src/teaching/oop-2023/week4/index.md @@ -68,4 +68,33 @@ ## Трудни задачи -*Ще бъдат попълнени в бъдеще* +### Задача 6 + +Ще разработим (изключително груба) симулация на вселената. +За нас, гравитацията няма да бъде сила, която просто привлича тела към себе си, а сила която кара телата около нея да се въртят ("орбитират") в перфектен кръг. +Имаме много звезди и една планета, като звездите са винаги неподвижни, а планетата се влияе от тях. + +Гравитационното привличане на звезда в своя център се определя от ъгъла θ<sub>max</sub> (в градуси). +Планетата се върти около една звезда, използвайки стандартната матрица за ротация: + + + +Ъгълът на въртене θ, спрямо разстоянието до една звезда, се определя чрез [закона на обратните квадрати](https://en.wikipedia.org/wiki/Inverse-square_law), тоест в зависимост от разстоянието `d` между центъра на звездата и центъра на планетата, то истинският ъгъл на завъртане е θ = θ<sub>max</sub> * 1 / d^2. + +Допълнително, ако имаме повече от една звезда, тогава ще използваме θ' = max(θ<sub>i</sub> - average(θ<sub>1</sub>, ..., θ<sub>n</sub>)), където θ<sub>i</sub> е намереният ъгъл θ за i-тата звезда и имаме n на брой звезди. + +Ефектът на това е, че ако имаме две звезди на еднакво разстояние с еднакъв ъгъл, тогава планетата е неподвижна, а ако някоя планета е с малко по-близка, тогава се върти около нея и то съвсем бавно. + +Приемаме, че отнема единица време планетата да се завърти с ъгъл θ', без значение размера на ъгъла. +Целта на задачата е да върнете при коя звезда и за колко единици време планетата е успяла да извърши пълна ротация (разбира се, θ' и планетата може да се измени след всяка ротация). + +Имплементирайте структури: + +- `Matrix2x2` и `Matrix2x1`, чиито стойности са числа с плаваща запетая, и с член функции за събиране и умножение (не оператор+, оператор\*) +- `Coordinate`, която запазва (**не наследява**) точките в пространството като `Matrix2x1` и имплементира събиране, умножение и разстояние между координати и матрици +- `Star`, запазваща координатата на своя център (`Matrix2x1`) и ъгълът θ<sub>max</sub> като число с плаваща запетая. + Имплементирайте и метод, който приема планета и връща ъгълът θ. +- `Planet`, запазваща своите координати (`Matrix2x1`) и изминалото време (тоест колко пъти се е движела от началото на симулацията). + Имплементирайте метод `OrbitPlanet`, която приема планета и ъгъл θ', и се завърта около нея. +- `Universe`, запазваща всички звездите и планетата. + Имплементирайте метод `FullOrbit`, която връща звездата около която планетата е успяла да извърши пълна ротация и времето за което това се е случило. |