Summary Files Commits Branches @commit @diff @stats
path: root / src
diff options
context:
space:
mode:
Commit2a17c8d1a276baafab373d8a40771a365a96864d (patch)
Author
 Syndamia <kamen@syndamia.com>
2024-03-14 10:19:34 +0200
Committer
 Syndamia <kamen@syndamia.com>
2024-03-14 10:19:34 +0200
Files42616b3129415fef5cd768407d83b0b4e23b3e77 /src
syndamia.com-2a17c8d1a276baafab373d8a40771a365a96864d.tar
syndamia.com-2a17c8d1a276baafab373d8a40771a365a96864d.tar.gz
syndamia.com-2a17c8d1a276baafab373d8a40771a365a96864d.zip
Parent0e3952ad2952b2f396f3969c6dc1e0e025a60cfa (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.pngbin0 -> 12305 bytes
-rw-r--r--src/teaching/oop-2023/week4/index.md31
diff --git a/src/teaching/oop-2023/week4/img/Rotation_matrix.png b/src/teaching/oop-2023/week4/img/Rotation_matrix.png
new file mode 100644
index 0000000..76faa6f
--- /dev/null
+++ b/src/teaching/oop-2023/week4/img/Rotation_matrix.png
Binary files differ
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
+
+Ще разработим (изключително груба) симулация на вселената.
+За нас, гравитацията няма да бъде сила, която просто привлича тела към себе си, а сила която кара телата около нея да се въртят ("орбитират") в перфектен кръг.
+Имаме много звезди и една планета, като звездите са винаги неподвижни, а планетата се влияе от тях.
+
+Гравитационното привличане на звезда в своя център се определя от ъгъла &theta;<sub>max</sub> (в градуси).
+Планетата се върти около една звезда, използвайки стандартната матрица за ротация:
+
+![](./img/Rotation_matrix.png)
+
+Ъгълът на въртене &theta;, спрямо разстоянието до една звезда, се определя чрез [закона на обратните квадрати](https://en.wikipedia.org/wiki/Inverse-square_law), тоест в зависимост от разстоянието `d` между центъра на звездата и центъра на планетата, то истинският ъгъл на завъртане е &theta; = &theta;<sub>max</sub> * 1 / d^2.
+
+Допълнително, ако имаме повече от една звезда, тогава ще използваме &theta;' = max(&theta;<sub>i</sub> - average(&theta;<sub>1</sub>, ..., &theta;<sub>n</sub>)), където &theta;<sub>i</sub> е намереният ъгъл &theta; за i-тата звезда и имаме n на брой звезди.
+
+Ефектът на това е, че ако имаме две звезди на еднакво разстояние с еднакъв ъгъл, тогава планетата е неподвижна, а ако някоя планета е с малко по-близка, тогава се върти около нея и то съвсем бавно.
+
+Приемаме, че отнема единица време планетата да се завърти с ъгъл &theta;', без значение размера на ъгъла.
+Целта на задачата е да върнете при коя звезда и за колко единици време планетата е успяла да извърши пълна ротация (разбира се, &theta;' и планетата може да се измени след всяка ротация).
+
+Имплементирайте структури:
+
+- `Matrix2x2` и `Matrix2x1`, чиито стойности са числа с плаваща запетая, и с член функции за събиране и умножение (не оператор+, оператор\*)
+- `Coordinate`, която запазва (**не наследява**) точките в пространството като `Matrix2x1` и имплементира събиране, умножение и разстояние между координати и матрици
+- `Star`, запазваща координатата на своя център (`Matrix2x1`) и ъгълът &theta;<sub>max</sub> като число с плаваща запетая.
+ Имплементирайте и метод, който приема планета и връща ъгълът &theta;.
+- `Planet`, запазваща своите координати (`Matrix2x1`) и изминалото време (тоест колко пъти се е движела от началото на симулацията).
+ Имплементирайте метод `OrbitPlanet`, която приема планета и ъгъл &theta;', и се завърта около нея.
+- `Universe`, запазваща всички звездите и планетата.
+ Имплементирайте метод `FullOrbit`, която връща звездата около която планетата е успяла да извърши пълна ротация и времето за което това се е случило.