From 2a17c8d1a276baafab373d8a40771a365a96864d Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 14 Mar 2024 10:19:34 +0200 Subject: (te/oop-2023/w4) Added hard exercise --- .../oop-2023/week4/img/Rotation_matrix.png | Bin 0 -> 12305 bytes src/teaching/oop-2023/week4/index.md | 31 ++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 src/teaching/oop-2023/week4/img/Rotation_matrix.png (limited to 'src') 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 Binary files /dev/null and b/src/teaching/oop-2023/week4/img/Rotation_matrix.png 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 + +Ще разработим (изключително груба) симулация на вселената. +За нас, гравитацията няма да бъде сила, която просто привлича тела към себе си, а сила която кара телата около нея да се въртят ("орбитират") в перфектен кръг. +Имаме много звезди и една планета, като звездите са винаги неподвижни, а планетата се влияе от тях. + +Гравитационното привличане на звезда в своя център се определя от ъгъла θmax (в градуси). +Планетата се върти около една звезда, използвайки стандартната матрица за ротация: + +![](./img/Rotation_matrix.png) + +Ъгълът на въртене θ, спрямо разстоянието до една звезда, се определя чрез [закона на обратните квадрати](https://en.wikipedia.org/wiki/Inverse-square_law), тоест в зависимост от разстоянието `d` между центъра на звездата и центъра на планетата, то истинският ъгъл на завъртане е θ = θmax * 1 / d^2. + +Допълнително, ако имаме повече от една звезда, тогава ще използваме θ' = max(θi - average(θ1, ..., θn)), където θi е намереният ъгъл θ за i-тата звезда и имаме n на брой звезди. + +Ефектът на това е, че ако имаме две звезди на еднакво разстояние с еднакъв ъгъл, тогава планетата е неподвижна, а ако някоя планета е с малко по-близка, тогава се върти около нея и то съвсем бавно. + +Приемаме, че отнема единица време планетата да се завърти с ъгъл θ', без значение размера на ъгъла. +Целта на задачата е да върнете при коя звезда и за колко единици време планетата е успяла да извърши пълна ротация (разбира се, θ' и планетата може да се измени след всяка ротация). + +Имплементирайте структури: + +- `Matrix2x2` и `Matrix2x1`, чиито стойности са числа с плаваща запетая, и с член функции за събиране и умножение (не оператор+, оператор\*) +- `Coordinate`, която запазва (**не наследява**) точките в пространството като `Matrix2x1` и имплементира събиране, умножение и разстояние между координати и матрици +- `Star`, запазваща координатата на своя център (`Matrix2x1`) и ъгълът θmax като число с плаваща запетая. + Имплементирайте и метод, който приема планета и връща ъгълът θ. +- `Planet`, запазваща своите координати (`Matrix2x1`) и изминалото време (тоест колко пъти се е движела от началото на симулацията). + Имплементирайте метод `OrbitPlanet`, която приема планета и ъгъл θ', и се завърта около нея. +- `Universe`, запазваща всички звездите и планетата. + Имплементирайте метод `FullOrbit`, която връща звездата около която планетата е успяла да извърши пълна ротация и времето за което това се е случило. -- cgit v1.3.1-23-gd82d