###### tags: `patronackie_2021_22` # Lista z geometrii obliczeniowej ### UWAGA Ze względu na to, że komputer przechowuje liczby niecałkowite na skończonej liczbie bitów, nie są one przechowywane precyzyjnie. To znaczy, że kiedy zrobicie: $$\mathbb{double \ a = 2.0;}$$ to wartość zmiennej $\mathbb{a}$ może być równa 2, ale może też być równa 2.0000000001 lub 1.9999999999. Dlatego też jeśli linijkę niżej zrobicie $$\mathbb{if(a == 2.0)}$$ to warunek ten może raz być prawdziwy, a raz nie. Dlatego też zamiast niego lepiej zawsze robić coś takiego: $$\mathbb{if(abs(a - 2.0) < 0.0000001)}$$ Powyższy warunek mówi, że a nie jest zbyt daleko od 2. Podobnie zamiast $$\mathbb{if(a + b > c)}$$ lepiej zrobić $$\mathbb{if(abs(a + b - c) > 0.0000001)}$$ Tyczy się to wszystkich zadań, które robicie z użyciem double na tej liście i w przyszłości. Bez tego Wasze programy mogą czasem działać, a czasem nie. ### Odległość od prostej 1 Na początku wczytujemy trzy liczby $A, B, C$. Potem dla każdego z $n$ punktów wczytujemy jego współrzędne $(x_0, y_0)$ i liczymy wynik ze wzoru: $$d = \cfrac{|A \cdot x_0 + B \cdot y_0 + C|}{\sqrt{A^2 + B^2}}$$ Przydatne funkcje w C++: wartość oczekiwaną $|z|$ zapisujemy $abs(z)$, natomiast pierwiastek $\sqrt{z}$ zapisujemy $sqrt(z)$. Na koniec wypisujemy $d$. Wszystkie zmienne poza $n$ powinny być typu double lub long double. ### Trójkąt prostokątny Wczytujemy trzy liczby $a, b, c$ i sprawdzamy warunek z twierdzenia Pitagorasa: $a^2 = b^2 + c^2$. ### Zadanie z odcinkiem Wczytujemy współrzędne dwóch punktów w przestrzeni trójwymiarowej $x_0, y_0, z_0, x_1, y_1, z_1$. Następnie liczymy długości odcinka w każdej współrzędnej: $a = |x_0 - x_1|$ oraz $b = |y_0 - y_1|$ oraz $c = |z_0 - z_1|$. Zastanówmy się teraz jak wyglądają współrzędne punktów na tym odcinku. Weźmy dowolny ułamek $\cfrac{1}{d}$ z przedziału od $0$ do $1$. Wówczas współrzędne punktu, który leży w $\cfrac{1}{d}$ odcinka od $(x_0, y_0, z_0)$ do $(x_1, y_1, z_1)$ są równe $$(x_0 + \cfrac{1}{d} \cdot a, y_0 + \cfrac{1}{d} \cdot b, z_0 + \cfrac{1}{d} \cdot c)$$ Zauważmy, że żeby ten punkt miał wszystkie współrzędne całkowite, wszystkie ułamki $\cfrac{a}{d}$, $\cfrac{b}{d}$, $\cfrac{c}{d}$ muszą być liczbami całkowitymi, a zatem $d$ musi być dzielnikiem $a, b$ oraz $c$. Dlatego wystarczy policzyć $wyn = NWD(a, NWD(b, c))$ i wypisać $wyn + 1$. ### Przecięcie okręgów Mamy na wejściu współrzędne środków okręgów $(x_0, y_0)$, $(x_1, y_1)$ oraz ich promienie $p_1, p_2$. Na początku chcemy obliczyć odległość między środkami z twierdzenia Pitagorasa: $$odl = \sqrt{(x_0 - x_1)^2 + (y_0 - y_1)^2}$$ Następnie wystarczy rozważyć pięć przypadków, do każdego wystarczy użyć jednej instrukcji if: 1. Jeden okrąg jest w całości wewnątrz drugiego, nie dotykają się. 2. Jeden okrąg jest wewnątrz drugiego, ale stykają się w jednym punkcie. 3. Okręgi przecinają się w dwóch punktach. 4. Okręgi stykają się zewnętrznie w jednym punkcie. 5. Okręgi w ogóle nie dotykają się, są daleko od siebie. W przypadkach tych trzeba wypisać kolejno 0, 1, 2, 1, 0