---
# System prepended metadata

title: Lista z geometrii obliczeniowej
tags: [patronackie_2021_22]

---

###### 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