Chapter 29 first version

This commit is contained in:
Antti H S Laaksonen 2017-01-29 17:55:04 +02:00
parent 1f0c8e66af
commit 5121718338
1 changed files with 295 additions and 301 deletions

View File

@ -1,17 +1,17 @@
\chapter{Geometry} \chapter{Geometry}
\index{geometria@geometria} \index{geometry}
Geometrian tehtävissä on usein haasteena keksiä, In geometric problems, a usual challenge is
mistä suunnasta ongelmaa kannattaa lähestyä, to realize how to approach the problem so that
jotta ratkaisun saa koodattua mukavasti ja the solution can be conveniently implemented
erikoistapauksia tulee mahdollisimman vähän. and the number of special cases is small.
Tarkastellaan esimerkkinä tehtävää, As an example, consider a problem where
jossa annettuna on nelikulmion kulmapisteet we are given the vertices of a quadrilateral
ja tehtävänä on laskea sen pinta-ala. (a polygon that has four vertices),
Esimerkiksi syötteenä voi olla and our task is to calculate its area.
seuraavanlainen nelikulmio: For example, a possible input for the problem is as follows:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.45] \begin{tikzpicture}[scale=0.45]
@ -23,9 +23,9 @@ seuraavanlainen nelikulmio:
\draw[thick] (6,2) -- (5,6) -- (2,5) -- (1,1) -- (6,2); \draw[thick] (6,2) -- (5,6) -- (2,5) -- (1,1) -- (6,2);
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Yksi tapa lähestyä tehtävää on jakaa nelikulmio One way to approach the problem is to divide
kahdeksi kolmioksi vetämällä jakoviiva kahden the quadrilateral into two triangles by a straight
vastakkaisen kulmapisteen välille: line between two opposite vertices:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.45] \begin{tikzpicture}[scale=0.45]
@ -38,21 +38,23 @@ vastakkaisen kulmapisteen välille:
\draw[dashed,thick] (2,5) -- (6,2); \draw[dashed,thick] (2,5) -- (6,2);
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Tämän jälkeen riittää laskea yhteen kolmioiden After this, it suffices to sum the areas
pinta-alat. Kolmion pinta-alan voi laskea of the triangles.
esimerkiksi \key{Heronin kaavalla} The area of a triangle can be calculated,
for example, using \key{Heron's formula}
\[ \sqrt{s (s-a) (s-b) (s-c)},\] \[ \sqrt{s (s-a) (s-b) (s-c)},\]
kun kolmion sivujen pituudet ovat where $a$, $b$ and $c$ are the lengths
$a$, $b$ ja $c$ ja $s=(a+b+c)/2$. of the triangle's sides and
\index{Heronin kaava@Heronin kaava} $s=(a+b+c)/2$.
\index{Heron's formula}
Tämä on mahdollinen tapa ratkaista tehtävä, This is a possible way to solve the problem,
mutta siinä on ongelma: but there is one pitfall:
miten löytää kelvollinen tapa vetää jakoviiva? how to divide the quadrilateral into triangles?
Osoittautuu, että It turns out that sometimes we can't pick
mitkä tahansa vastakkaiset pisteet eivät kelpaa. arbitrary opposite vertices.
Esimerkiksi seuraavassa nelikulmiossa For example, in the following quadrilateral,
jakoviiva menee nelikulmion ulkopuolelle: the division line is outside the quadrilateral:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.45] \begin{tikzpicture}[scale=0.45]
@ -65,7 +67,7 @@ jakoviiva menee nelikulmion ulkopuolelle:
\draw[dashed,thick] (2,5) -- (6,2); \draw[dashed,thick] (2,5) -- (6,2);
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Toinen tapa vetää jakoviiva on kuitenkin toimiva: However, another way to draw the line works:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.45] \begin{tikzpicture}[scale=0.45]
@ -78,39 +80,38 @@ Toinen tapa vetää jakoviiva on kuitenkin toimiva:
\draw[dashed,thick] (3,2) -- (1,1); \draw[dashed,thick] (3,2) -- (1,1);
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Ihmiselle on selvää, kumpi jakoviiva jakaa nelikulmion For a human, it is clear which of the lines is the correct
kahdeksi kolmioksi, mutta tietokoneen kannalta choice, but for a computer the situation is difficult.
tilanne on hankala.
However, it turns out that we can solve the problem using
Osoittautuu, että tehtävän ratkaisuun on olemassa another method which is much easier to implement
paljon helpommin toteutettava tapa, and doesn't contain any special cases.
jossa ei tarvitse miettiä erikoistapauksia. There is a general formula
Nelikulmion pinta-alan laskemiseen
on nimittäin yleinen kaava
\[x_1y_2-x_2y_1+x_2y_3-x_3y_2+x_3y_4-x_4y_3+x_4y_1-x_1y_4,\] \[x_1y_2-x_2y_1+x_2y_3-x_3y_2+x_3y_4-x_4y_3+x_4y_1-x_1y_4,\]
kun kulmapisteet ovat that calculates the area of a quadrilateral
whose vertices are
$(x_1,y_1)$, $(x_1,y_1)$,
$(x_2,y_2)$, $(x_2,y_2)$,
$(x_3,y_3)$ ja $(x_3,y_3)$ and
$(x_4,y_4)$. $(x_4,y_4)$.
Tämä kaava on helppo laskea, siinä ei ole erikoistapauksia This formula is easy to calculate, there are no special
ja osoittautuu, että kaava on mahdollista yleistää cases, and it turns out that we can generalize the formula
\textit{kaikille} monikulmioille. for \emph{all} polygons.
\section{Kompleksiluvut} \section{Complex numbers}
\index{kompleksiluku@kompleksiluku} \index{complex number}
\index{piste@piste} \index{point}
\index{vektori@vektori} \index{vector}
\key{Kompleksiluku} on luku muotoa $x+y i$, missä $i = \sqrt{-1}$ A \key{complex number} is a number of the form $x+y i$,
on \key{imaginääriyksikkö}. where $i = \sqrt{-1}$ is the \key{imaginary unit}.
Kompleksiluvun luonteva geometrinen tulkinta on, A geometric interpretation for a complex number is
että se esittää kaksiulotteisen tason pistettä $(x,y)$ that it represents a two-dimensional point $(x,y)$
tai vektoria origosta pisteeseen $(x,y)$. or a vector from the origin to point $(x,y)$.
Esimerkiksi luku $4+2i$ tarkoittaa seuraavaa For example, $4+2i$ corresponds to the
pistettä ja vektoria: following point and vector:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.45] \begin{tikzpicture}[scale=0.45]
@ -127,17 +128,16 @@ pistettä ja vektoria:
\index{complex@\texttt{complex}} \index{complex@\texttt{complex}}
C++:ssa on kompleksilukujen käsittelyyn luokka \texttt{complex}, The complex number class \texttt{complex} in C++ is
josta on hyötyä geometriassa. useful when solving geometry problems.
Luokan avulla voi esittää pisteen tai vektorin Using the class, we can store points and vectors
kompleksilukuna, ja luokassa on valmiita as complex numbers, and the class also contains tools
geometriaan soveltuvia työkaluja. that are useful in geometry.
Seuraavassa koodissa \texttt{C} on koordinaatin tyyppi In the following code, \texttt{C} is the type of
ja \texttt{P} on pisteen tai vektorin tyyppi. a coordinate, and \texttt{P} is the type of a point or vector.
Lisäksi koodi määrittelee In addition, the code defines shortcuts \texttt{X} and \texttt{Y}
lyhennysmerkinnät \texttt{X} ja \texttt{Y}, that can be used to refer to x and y coordinates.
joiden avulla pystyy viittaamaan x- ja y-koordinaatteihin.
\begin{lstlisting} \begin{lstlisting}
typedef long long C; typedef long long C;
@ -146,16 +146,16 @@ typedef complex<C> P;
#define Y imag() #define Y imag()
\end{lstlisting} \end{lstlisting}
Esimerkiksi seuraava koodi määrittelee pisteen $p=(4,2)$ For example, the following code defines a point $p=(4,2)$
ja ilmoittaa sen x- ja y-koordinaatin: and prints its x and y coordinates:
\begin{lstlisting} \begin{lstlisting}
P p = {4,2}; P p = {4,2};
cout << p.X << " " << p.Y << "\n"; // 4 2 cout << p.X << " " << p.Y << "\n"; // 4 2
\end{lstlisting} \end{lstlisting}
Seuraava koodi määrittelee vektorit $v=(3,1)$ The following code defines vectors $v=(3,1)$ and $u=(2,2)$,
ja $u=(2,2)$ ja laskee sitten niiden summan $s=v+u$: and after that calculates the sum $s=v+u$.
\begin{lstlisting} \begin{lstlisting}
P v = {3,1}; P v = {3,1};
@ -164,59 +164,57 @@ P s = v+u;
cout << s.X << " " << s.Y << "\n"; // 5 3 cout << s.X << " " << s.Y << "\n"; // 5 3
\end{lstlisting} \end{lstlisting}
Sopiva koordinaatin tyyppi \texttt{C} on tilanteesta The appropriate type for \texttt{C} is
riippuen \texttt{long long} (kokonaisluku) \texttt{long long} (integer) or \texttt{long double}
tai \texttt{long double} (liukuluku). (real number), depending on the situation.
Kokonaislukuja kannattaa käyttää aina kun mahdollista, It is a good idea to use integers whenever possible,
koska silloin laskenta on tarkkaa. because the integer calculations are exact.
Jos koordinaatit ovat liukulukuja, If coordinates are real numbers,
niiden vertailussa täytyy ottaa huomioon epätarkkuus. precision error should be taken into account
Turvallinen tapa tarkistaa, when comparing them.
ovatko liukuluvut $a$ ja $b$ samat A safe way to check if numbers $a$ and $b$ are equal
on käyttää vertailua $|a-b|<\epsilon$, jossa $\epsilon$ is the comparison $|a-b|<\epsilon$,
on pieni luku (esimerkiksi $\epsilon=10^{-9}$). where $\epsilon$ is a small number (for example, $\epsilon=10^{-9}$).
\subsubsection*{Funktioita} \subsubsection*{Functions}
Seuraavissa esimerkeissä koordinaatin tyyppinä on In the following examples, the coordinate type is
\texttt{long double}. \texttt{long double}.
Funktio \texttt{abs(v)} laskee vektorin $v=(x,y)$ The function \texttt{abs(v)} calculates the length
pituuden $|v|$ kaavalla $\sqrt{x^2+y^2}$. $|v|$ of a vector $v=(x,y)$
Sillä voi laskea myös pisteiden $(x_1,y_1)$ using the formula $\sqrt{x^2+y^2}$.
ja $(x_2,y_2)$ etäisyyden, The function can also be used for
koska pisteiden etäisyys calculating the distance between points
on sama kuin vektorin $(x_2-x_1,y_2-y_1)$ pituus. $(x_1,y_1)$ and $(x_2,y_2)$,
Joskus hyödyllinen on myös funktio \texttt{norm(v)}, because that distance equals the length
joka laskee vektorin $v=(x,y)$ pituuden neliön $|v|^2$. of the vector $(x_2-x_1,y_2-y_1)$.
Seuraava koodi laskee The following code calculates the distance
pisteiden $(4,2)$ ja $(3,-1)$ etäisyyden: of points $(4,2)$ and $(3,-1)$:
\begin{lstlisting} \begin{lstlisting}
P a = {4,2}; P a = {4,2};
P b = {3,-1}; P b = {3,-1};
cout << abs(b-a) << "\n"; // 3.60555 cout << abs(b-a) << "\n"; // 3.60555
\end{lstlisting} \end{lstlisting}
Funktio \texttt{arg(v)} laskee vektorin $v=(x,y)$ The function \texttt{arg(v)} calculates the
kulman radiaaneina suhteessa x-akseliin. angle of a vector $v=(x,y)$ with respect to the x axel.
Radiaaneina ilmoitettu kulma $r$ vastaa asteina The function gives the angle in radians,
kulmaa $180 r/\pi$ astetta. where $r$ radians equals $180 r/\pi$ degrees.
Jos vektori osoittaa suoraan oikealle, The angle of a vector that points to the right is 0,
sen kulma on 0. and the angle decreases clockwise and increases
Kulma kasvaa vastapäivään ja vähenee myötäpäivään counterclockwise.
liikuttaessa.
Funktio \texttt{polar(s,a)} muodostaa vektorin, The function \texttt{polar(s,a)} constructs a vector
jonka pituus on $s$ ja joka osoittaa kulmaan $a$. whose length is $s$ and that points to angle $a$.
Lisäksi vektoria pystyy kääntämään kulman $a$ In addition, a vector can be rotated by angle $a$
verran kertomalla se vektorilla, by multiplying it by a vector with length 1 and angle $a$.
jonka pituus on 1 ja kulma on $a$.
Seuraava koodi laskee vektorin $(4,2)$ kulman, The following code calculates the angle of
kääntää sitä sitten $1/2$ radiaania vastapäivään the vector $(4,2)$, rotates it $1/2$ radians
ja laskee uuden kulman: counterclockwise, and then calculates the angle again:
\begin{lstlisting} \begin{lstlisting}
P v = {4,2}; P v = {4,2};
@ -225,19 +223,17 @@ v *= polar(1.0,0.5);
cout << arg(v) << "\n"; // 0.963648 cout << arg(v) << "\n"; // 0.963648
\end{lstlisting} \end{lstlisting}
\section{Pisteet ja suorat} \section{Points and lines}
\index{ristitulo@ristitulo} \index{cross product}
Vektorien
$a=(x_1,y_1)$ ja $b=(x_2,y_2)$ \key{ristitulo} $a \times b$
lasketaan kaavalla $x_1 y_2 - x_2 y_1$.
Ristitulo ilmaisee, mihin suuntaan vektori $b$
kääntyy, jos se laitetaan vektorin $a$ perään.
Positiivinen ristitulo tarkoittaa käännöstä vasemmalle,
negatiivinen käännöstä oikealle, ja nolla tarkoittaa,
että vektorit ovat samalla suoralla.
Seuraava kuva näyttää kolme esimerkkiä ristitulosta: The \key{cross product} $a \times b$ of vectors
$a=(x_1,y_1)$ and $b=(x_2,y_2)$ equals $x_1 y_2 - x_2 y_1$.
The cross product indicates whether the vector $b$
turns to the left (positive value) or to the right (negative value)
when it is placed directly after the vector $a$.
The following picture shows three examples:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.45] \begin{tikzpicture}[scale=0.45]
@ -268,10 +264,10 @@ Seuraava kuva näyttää kolme esimerkkiä ristitulosta:
\end{center} \end{center}
\noindent \noindent
Esimerkiksi vasemmassa kuvassa For example, in the left picture
$a=(4,2)$ ja $b=(1,2)$. $a=(4,2)$ and $b=(1,2)$.
Seuraava koodi laskee vastaavan ristitulon The following code calculates the cross product
luokkaa \texttt{complex} käyttäen: using the class \texttt{complex}:
\begin{lstlisting} \begin{lstlisting}
P a = {4,2}; P a = {4,2};
@ -279,23 +275,23 @@ P b = {1,2};
C r = (conj(a)*b).Y; // 6 C r = (conj(a)*b).Y; // 6
\end{lstlisting} \end{lstlisting}
Tämä perustuu siihen, että funktio \texttt{conj} The function \texttt{conj} negates the y coordinate
muuttaa vektorin y-koordinaatin käänteiseksi of a vector,
ja kompleksilukujen kertolaskun seurauksena and when the vectors $(x_1,-y_1)$ and $(x_2,y_2)$
vektorien $(x_1,-y_1)$ ja $(x_2,y_2)$ are multiplied together, the y coordinate
kertolaskun y-koordinaatti on $x_1 y_2 - x_2 y_1$. of the result is $x_1 y_2 - x_2 y_1$.
\subsubsection{Pisteen sijainti suoraan nähden} \subsubsection{Point location}
Ristitulon avulla voi selvittää, The cross product can be used for testing
kummalla puolella suoraa tutkittava piste sijaitsee. whether a point is located on the left or right
Oletetaan, että suora kulkee pisteiden side of a line.
$s_1$ ja $s_2$ kautta, katsontasuunta on Assume that the line goes through points
pisteestä $s_1$ pisteeseen $s_2$ ja $s_1$ and $s_2$, we are looking from $s_1$
tutkittava piste on $p$. to $s_2$ and the point is $p$.
Esimerkiksi seuraavassa kuvassa piste $p$ For example, in the following picture,
on suoran vasemmalla puolella: $p$ is on the left side of the line:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.45] \begin{tikzpicture}[scale=0.45]
\draw[dashed,thick,->] (0,-3)--(12,6); \draw[dashed,thick,->] (0,-3)--(12,6);
@ -308,29 +304,31 @@ on suoran vasemmalla puolella:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Nyt ristitulo $(p-s_1) \times (p-s_2)$ Now the cross product $(p-s_1) \times (p-s_2)$
kertoo, kummalla puolella suoraa piste $p$ sijaitsee. indicates the location of the point $p$.
Jos ristitulo on positiivinen, If the cross product is positive,
piste $p$ on suoran vasemmalla puolella, $p$ is located on the left side,
ja jos ristitulo on negatiivinen, and if the cross product is negative,
piste $p$ on suoran oikealla puolella. $p$ is located on the right side.
Jos taas ristitulo on nolla, Finally, if the cross product is zero,
piste $p$ on pisteiden $s_1$ ja $s_2$ points $s_1$, $s_2$ and $p$ are on the same line.
kanssa suoralla.
\subsubsection{Janojen leikkaaminen} \subsubsection{Line segment intersection}
\index{leikkauspiste@leikkauspiste} \index{line segment intersection}
Tarkastellaan tilannetta, jossa tasossa on kaksi Consider a problem where we are given two line segments
janaa $ab$ ja $cd$ ja tehtävänä on selvittää, $ab$ and $cd$ and our task is to check whether they
leikkaavatko janat. Mahdolliset tapaukset ovat seuraavat: intersect. The possible cases are:
\textit{Tapaus 1:} \textit{Case 1:}
Janat ovat samalla suoralla ja ne sivuavat toisiaan. The line segments are on the same line
Tällöin janoilla on ääretön määrä leikkauspisteitä. and they overlap each other.
Esimerkiksi seuraavassa kuvassa janat leikkaavat In this case, there is an infinite number of
pisteestä $c$ pisteeseen $b$: intersection points.
For example, in the following picture,
all points between $c$ and $b$ are
intersection points:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9] \begin{tikzpicture}[scale=0.9]
\draw (1.5,1.5)--(6,3); \draw (1.5,1.5)--(6,3);
@ -346,16 +344,16 @@ pisteestä $c$ pisteeseen $b$:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Tässä tapauksessa ristitulon avulla voi tarkastaa, In this case, we can use cross products to
ovatko kaikki pisteet samalla suoralla. check if all points are on the same line.
Tämän jälkeen riittää järjestää pisteet ja After this, we can sort the points and check
tarkastaa, menevätkö janat toistensa päälle. whether the line segments overlap each other.
\textit{Tapaus 2:} \textit{Case 2:}
Janoilla on yhteinen päätepiste, joka on The line segments have a common vertex
ainoa leikkauspiste. that is the only intersection point.
Esimerkiksi seuraavassa kuvassa For example, in the following picture the
janat leikkaavat pisteessä $b=c$: intersection point is $b=c$:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9] \begin{tikzpicture}[scale=0.9]
@ -371,15 +369,15 @@ janat leikkaavat pisteessä $b=c$:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Tämä tapaus on helppoa tarkastaa, This case is easy to test because the
koska mahdolliset vaihtoehdot possibilities for the common intersection point
yhteiselle päätepisteelle ovat are $a=c$, $a=d$, $b=c$ and $b=d$.
$a=c$, $a=d$, $b=c$ ja $b=d$.
\textit{Tapaus 3:} \textit{Case 3:}
Janoilla on yksi leikkauspiste, There is exactly one intersection point
joka ei ole mikään janojen päätepisteistä. that is not a vertex of any line segment.
Seuraavassa kuvassa leikkauspiste on $p$: In the following picture, the point $p$
is the intersection point:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9] \begin{tikzpicture}[scale=0.9]
\draw (0,1)--(6,3); \draw (0,1)--(6,3);
@ -397,34 +395,25 @@ Seuraavassa kuvassa leikkauspiste on $p$:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Tässä tapauksessa janat leikkaavat In this case, the line segments intersect
tarkalleen silloin, kun samaan aikaan exactly when both points $c$ and $d$ are
pisteet $c$ ja $d$ ovat eri puolilla on different sides of a line through $a$ and $b$,
$a$:sta $b$:hen kulkevaa suoraa and points $a$ and $b$ are on different
ja pisteet $a$ ja $b$ sides of a line through $c$ and $d$.
ovat eri puolilla Hence, we can use cross products to check this.
$c$:stä $d$:hen kulkevaa suoraa.
Niinpä janojen leikkaamisen voi tarkastaa
ristitulon avulla.
% Janojen leikkauspiste $p$ selviää etsimällä \subsubsection{Point distance from a line}
% parametrit $t$ ja $u$ niin, että
%
% \[ p = a+t(b-a) = c+u(d-c). \]
The area of a triangle can be calculated
\subsubsection{Pisteen etäisyys suorasta} using the formula
Kolmion pinta-ala voidaan lausua
ristitulon avulla
\[\frac{| (a-c) \times (b-c) |}{2},\] \[\frac{| (a-c) \times (b-c) |}{2},\]
missä $a$, $b$ ja $c$ ovat kolmion kärkipisteet. where $a$, $b$ and $c$ are the vertices of the triangle.
Tämän kaavan avulla on mahdollista laskea, Using this formula, it is possible to calculate the
kuinka kaukana annettu piste on suorasta. shortest distance of a point from a line.
Esimerkiksi seuraavassa kuvassa $d$ For example, in the following picture $d$ is the
on lyhin etäisyys pisteestä $p$ suoralle, shortest distance between point $p$ and the line
jonka määrittävät pisteet $s_1$ ja $s_2$: that is defined by points $s_1$ and $s_2$:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.75] \begin{tikzpicture}[scale=0.75]
\draw (-2,-1)--(6,3); \draw (-2,-1)--(6,3);
@ -439,22 +428,23 @@ jonka määrittävät pisteet $s_1$ ja $s_2$:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Pisteiden $s_1$, $s_2$ ja $p$ muodostaman kolmion The area of the triangle whose vertices are
pinta-ala on toisaalta $\frac{1}{2} |s_2-s_1| d$ ja toisaalta $s_1$, $s_2$ and $p$ can be calculated in two ways:
it is both
$\frac{1}{2} |s_2-s_1| d$ and
$\frac{1}{2} ((s_1-p) \times (s_2-p))$. $\frac{1}{2} ((s_1-p) \times (s_2-p))$.
Niinpä haluttu etäisyys on Thus, the shortest distance is
\[ d = \frac{(s_1-p) \times (s_2-p)}{|s_2-s_1|} .\] \[ d = \frac{(s_1-p) \times (s_2-p)}{|s_2-s_1|} .\]
\subsubsection{Point inside a polygon}
\subsubsection{Piste monikulmiossa} Let us now consider a problem where our task is to
find out whether a point is located inside or outside
Tarkastellaan sitten tehtävää, jossa a polygon.
tulee selvittää, onko annettu piste For example, in the following picture point $a$
monikulmion sisäpuolella vai ulkopuolella. is inside the polygon and point $b$ is outside
Esimerkiksi seuraavassa kuvassa piste $a$ on the polygon.
sisäpuolella ja piste $b$ on
ulkopuolella.
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.75] \begin{tikzpicture}[scale=0.75]
@ -468,18 +458,17 @@ ulkopuolella.
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Kätevä ratkaisu tehtävään A convenient way to solve the problem is to
on lähettää pisteestä säde send a ray from the point to an arbitrary direction
satunnaiseen suuntaan ja laskea, and calculate the number of times it touches
montako kertaa se osuu monikulmion reunaan. the border of the polygon.
Jos kertoja on pariton määrä, If the number is odd,
niin piste on sisäpuolella, the point is inside the polygon,
ja jos taas kertoja on parillinen määrä, and if the number is even,
niin piste on ulkopuolella. the point is outside the polygon.
\begin{samepage} \begin{samepage}
Äskeisessä tilanteessa säteitä For example, we could send the following rays:
voisi lähteä seuraavasti:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.75] \begin{tikzpicture}[scale=0.75]
\draw (0,0)--(2,2)--(5,1)--(2,3)--(1,2)--(-1,2)--(1,4)--(-2,4)--(-2,1)--(-3,3)--(-4,0)--(0,0); \draw (0,0)--(2,2)--(5,1)--(2,3)--(1,2)--(-1,2)--(1,4)--(-2,4)--(-2,1)--(-3,3)--(-4,0)--(0,0);
@ -498,26 +487,27 @@ voisi lähteä seuraavasti:
\end{center} \end{center}
\end{samepage} \end{samepage}
Pisteestä $a$ lähtevät säteet osuvat 1 ja 3 The rays from $a$ touch 1 and 3 times
kertaa monikulmion reunaan, the border of the polygon,
joten piste on sisäpuolella. so $a$ is inside the polygon.
Vastaavasti pisteestä $b$ lähtevät Correspondingly, the rays from $b$
säteet osuvat 0 ja 2 kertaa monikulmion reunaan, touch 0 and 2 times the border of the polygon,
joten piste on ulkopuolella. so $b$ is outside the polygon.
\section{Monikulmion pinta-ala} \section{Polygon are}
Yleinen kaava monikulmion pinta-alan laskemiseen on A general formula for calculating the area
of a polygon is
\[\frac{1}{2} |\sum_{i=1}^{n-1} (p_i \times p_{i+1})| = \[\frac{1}{2} |\sum_{i=1}^{n-1} (p_i \times p_{i+1})| =
\frac{1}{2} |\sum_{i=1}^{n-1} (x_i y_{i+1} - x_{i+1} y_i)|, \] \frac{1}{2} |\sum_{i=1}^{n-1} (x_i y_{i+1} - x_{i+1} y_i)|, \]
kun kärkipisteet ovat when the vertices are
$p_1=(x_1,y_1)$, $p_2=(x_2,y_2)$, $\ldots$, $p_n=(x_n,y_n)$ $p_1=(x_1,y_1)$, $p_2=(x_2,y_2)$, $\ldots$, $p_n=(x_n,y_n)$
järjestettynä niin, sorted so that
että $p_i$ ja $p_{i+1}$ ovat vierekkäiset kärkipisteet $p_i$ and $p_{i+1}$ are adjacent vertices on the border
monikulmion reunalla of the polygon,
ja ensimmäinen ja viimeinen kärkipiste ovat samat eli $p_1=p_n$. and the first and last vertex is the same, i.e., $p_1=p_n$.
Esimerkiksi monikulmion For example, the area of the polygon
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.7] \begin{tikzpicture}[scale=0.7]
\filldraw (4,1.4) circle (2pt); \filldraw (4,1.4) circle (2pt);
@ -533,11 +523,13 @@ Esimerkiksi monikulmion
\path[draw] (4,1.4) -- (7,3.4) -- (5,5.4) -- (2,4.4) -- (4,3.4) -- (4,1.4); \path[draw] (4,1.4) -- (7,3.4) -- (5,5.4) -- (2,4.4) -- (4,3.4) -- (4,1.4);
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
pinta-ala on is
\[\frac{|(2\cdot5-4\cdot5)+(5\cdot3-5\cdot7)+(7\cdot1-3\cdot4)+(4\cdot3-1\cdot4)+(4\cdot4-3\cdot2)|}{2} = 17/2.\] \[\frac{|(2\cdot5-4\cdot5)+(5\cdot3-5\cdot7)+(7\cdot1-3\cdot4)+(4\cdot3-1\cdot4)+(4\cdot4-3\cdot2)|}{2} = 17/2.\]
Kaavassa on ideana käydä läpi puolisuunnikkaita,
joiden yläreuna on yksi monikulmion sivuista ja The idea in the formula is to go through trapezoids
alareuna on vaakataso. Esimerkiksi: where one side is a side of the polygon,
and another side is on the horizontal line $y=0$.
For example:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.7] \begin{tikzpicture}[scale=0.7]
\path[draw,fill=lightgray] (5,5.4) -- (7,3.4) -- (7,0) -- (5,0) -- (5,5.4); \path[draw,fill=lightgray] (5,5.4) -- (7,3.4) -- (7,0) -- (5,0) -- (5,5.4);
@ -555,37 +547,35 @@ alareuna on vaakataso. Esimerkiksi:
\draw (0,0) -- (10,0); \draw (0,0) -- (10,0);
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Tällaisen puolisuunnikkaan pinta-ala on The are of such a trapezoid is
\[(x_{i+1}-x_{i}) \frac{y_i+y_{i+1}}{2},\] \[(x_{i+1}-x_{i}) \frac{y_i+y_{i+1}}{2},\]
kun kärkipisteet ovat $p_i$ ja $p_{i+1}$. when the vertices of the polygon are $p_i$ and $p_{i+1}$.
Jos $x_{i+1}>x_{i}$, niin pinta-ala on positiivinen, If $x_{i+1}>x_{i}$, the area is positive,
ja jos $x_{i+1}<x_{i}$, niin pinta-ala on negatiivinen. and if $x_{i+1}<x_{i}$, the area is negative.
Monikulmion pinta-ala saadaan laskemalla yhteen kaikkien The area of the polygon is the sum of areas of
tällaisten puolisuunnikkaiden pinta-alat, mistä tulee: all such trapezoids, which yields the formula
\[|\sum_{i=1}^{n-1} (x_{i+1}-x_{i}) \frac{y_i+y_{i+1}}{2}| = \[|\sum_{i=1}^{n-1} (x_{i+1}-x_{i}) \frac{y_i+y_{i+1}}{2}| =
\frac{1}{2} |\sum_{i=1}^{n-1} (x_i y_{i+1} - x_{i+1} y_i)|.\] \frac{1}{2} |\sum_{i=1}^{n-1} (x_i y_{i+1} - x_{i+1} y_i)|.\]
Huomaa, että pinta-alan kaavassa on itseisarvo, Note that the absolute value of the sum is calculated,
koska monikulmion kiertosuunnasta (myötä- tai vastapäivään) because the value of the sum may be positive or negative
riippuen tuloksena oleva pinta-ala on joko depending on whether we walk clockwise or counterclockwise
positiivinen tai negatiivinen. along the sides of the the polygon.
\subsubsection{Pickin lause} \subsubsection{Pick's theorem}
\index{Pickin lause@Pickin lause} \index{Pick's theorem}
\key{Pickin lause} on vaihtoehtoinen tapa laskea \key{Pick's theorem} provides another way to calculate
monikulmion pinta-ala, the area of a polygon where are vertices have integer coordinates.
kun kaikki monikulmion kärkipisteet According to Pick's theorem, the area of the polygon is
ovat kokonaislukupisteissä.
Pickin lauseen mukaan monikulmion pinta-ala on
\[ a + b/2 -1,\] \[ a + b/2 -1,\]
missä $a$ on kokonaislukupisteiden määrä monikulmion sisällä where $a$ is the number of integer points inside the polygon
ja $b$ on kokonaislukupisteiden määrä monikulmion reunalla. and $b$ is the number of integer points on the border of the polygon.
Esimerkiksi monikulmion For example, the area of the polygon
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.7] \begin{tikzpicture}[scale=0.7]
\filldraw (4,1.4) circle (2pt); \filldraw (4,1.4) circle (2pt);
@ -615,25 +605,27 @@ Esimerkiksi monikulmion
\filldraw (5,2.4) circle (2pt); \filldraw (5,2.4) circle (2pt);
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
pinta-ala on $6+7/2-1=17/2$. is $6+7/2-1=17/2$.
\section{Etäisyysmitat} \section{Distance functions}
\index{etxisyysmitta@etäisyysmitta} \index{distance function}
\index{Euklidinen etxisyys@Euklidinen etäisyys} \index{Euklidean distance}
\index{Manhattan-etäisyys} \index{Manhattan distance}
\key{Etäisyysmitta} määrittää tavan laskea kahden pisteen etäisyys. A \key{distance function} defines the distance between
Tavallisimmin geometriassa käytetty etäisyysmitta on two points.
\key{euklidinen etäisyys}, jolloin pisteiden The usual distance function in geometry is the
$(x_1,y_1)$ ja $(x_2,y_2)$ etäisyys on \key{Euclidean distance} where the distance between
points $(x_1,y_1)$ and $(x_2,y_2)$ is
\[\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}.\] \[\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}.\]
Vaihtoehtoinen etäisyysmitta on \key{Manhattan-etäisyys}, An alternative distance function is the
jota käyttäen pisteiden \key{Manhattan distance}
$(x_1,y_1)$ ja $(x_2,y_2)$ etäisyys on where the distance between points
$(x_1,y_1)$ and $(x_2,y_2)$ is
\[|x_1-x_2|+|y_1-y_2|.\] \[|x_1-x_2|+|y_1-y_2|.\]
\begin{samepage} \begin{samepage}
Esimerkiksi kuvaparissa For example, consider the following picture:
\begin{center} \begin{center}
\begin{tikzpicture} \begin{tikzpicture}
@ -654,75 +646,75 @@ Esimerkiksi kuvaparissa
\draw[dashed] (5+2,1) -- (5+2,2); \draw[dashed] (5+2,1) -- (5+2,2);
\draw[dashed] (5+2,2) -- (5+5,2); \draw[dashed] (5+2,2) -- (5+5,2);
\node at (3.5,-0.5) {euklidinen etäisyys}; \node at (3.5,-0.5) {Euclidean distance};
\node at (5+3.5,-0.5) {Manhattan-etäisyys}; \node at (5+3.5,-0.5) {Manhattan distance};
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
\end{samepage} \end{samepage}
pisteiden euklidinen etäisyys on The Euclidean distance between the points is
\[\sqrt{(5-2)^2+(2-1)^2}=\sqrt{10}\] \[\sqrt{(5-2)^2+(2-1)^2}=\sqrt{10}\]
ja pisteiden Manhattan-etäisyys on and the Manhattan distance is
\[|5-2|+|2-1|=4.\] \[|5-2|+|2-1|=4.\]
Seuraava kuvapari näyttää alueen, joka on pisteestä etäisyyden 1 The following picture shows regions that are within a distance of 1
sisällä käyttäen euklidista ja Manhattan-etäisyyttä: from the center point, using Euclidean and Manhattan distances:
\begin{center} \begin{center}
\begin{tikzpicture} \begin{tikzpicture}
\draw[fill=gray!20] (0,0) circle [radius=1]; \draw[fill=gray!20] (0,0) circle [radius=1];
\draw[fill] (0,0) circle [radius=0.05]; \draw[fill] (0,0) circle [radius=0.05];
\node at (0,-1.5) {euklidinen etäisyys}; \node at (0,-1.5) {Euclidean distance};
\draw[fill=gray!20] (5+0,1) -- (5-1,0) -- (5+0,-1) -- (5+1,0) -- (5+0,1); \draw[fill=gray!20] (5+0,1) -- (5-1,0) -- (5+0,-1) -- (5+1,0) -- (5+0,1);
\draw[fill] (5,0) circle [radius=0.05]; \draw[fill] (5,0) circle [radius=0.05];
\node at (5,-1.5) {Manhattan-etäisyys}; \node at (5,-1.5) {Manhattan distance};
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
\subsubsection{Kaukaisimmat pisteet} \subsubsection{Furthest points}
Joidenkin ongelmien ratkaiseminen on helpompaa, jos käytössä on Some problems are easier to solve if we use the
Manhattan-etäisyys euklidisen etäisyyden sijasta. Manhattan distance instead of the Euclidean distance.
Tarkastellaan esimerkkinä tehtävää, jossa annettuna For example, consider a problem where we are given
on $n$ pistettä $(x_1,y_1),(x_2,y_2),\ldots,(x_n,y_n)$ $n$ points $(x_1,y_1),(x_2,y_2),\ldots,(x_n,y_n)$
ja tehtävänä on laskea, mikä on suurin mahdollinen etäisyys and our task is to calculate the maximum distance
kahden pisteen välillä. between any two points.
Tämän tehtävän ratkaiseminen tehokkaasti on vaikeaa, This is a difficult problem if we should maximize
jos laskettavana on euklidinen etäisyys. the Euclidean distance,
Sen sijaan suurin Manhattan-etäisyys on helppoa selvittää, but calculating
koska se on suurempi etäisyyksistä the maximum Manhattan distance is easy
\[\max A - \min A \hspace{20px} \textrm{ja} \hspace{20px} \max B - \min B,\] because it either
missä \[\max A - \min A \hspace{20px} \textrm{or} \hspace{20px} \max B - \min B,\]
where
\[A = \{x_i+y_i : i = 1,2,\ldots,n\}\] \[A = \{x_i+y_i : i = 1,2,\ldots,n\}\]
ja and
\[B = \{x_i-y_i : i = 1,2,\ldots,n\}.\] \[B = \{x_i-y_i : i = 1,2,\ldots,n\}.\]
\begin{samepage} \begin{samepage}
Tämä johtuu siitä, että Manhattan-etäisyys The reason for this is that the Manhattan distance
\[|x_a-x_b|+|y_a-y_b]\] \[|x_a-x_b|+|y_a-y_b]\]
voidaan ilmaista muodossa can be written
\begin{center} \begin{center}
\begin{tabular}{cl} \begin{tabular}{cl}
& $\max(x_a-x_b+y_a-y_b,\,x_a-x_b-y_a+y_b)$ \\ & $\max(x_a-x_b+y_a-y_b,\,x_a-x_b-y_a+y_b)$ \\
$=$ & $\max(x_a+y_a-(x_b+y_b),\,x_a-y_a-(x_b-y_b))$ $=$ & $\max(x_a+y_a-(x_b+y_b),\,x_a-y_a-(x_b-y_b))$
\end{tabular} \end{tabular}
\end{center} \end{center}
olettaen, että $x_a \ge x_b$. assuming that $x_a \ge x_b$.
\end{samepage} \end{samepage}
\begin{samepage} \begin{samepage}
\subsubsection{Koordinaatiston kääntäminen} \subsubsection{Rotating coordinates}
Kätevä tekniikka Manhattan-etäisyyden yhteydessä on myös A useful technique related to the Manhattan distance
kääntää koordinaatistoa 45 astetta is to rotate all coordinates 45 degrees so that
niin, että pisteestä $(x,y)$ tulee piste $(a(x+y),a(y-x))$, a point $(x,y)$ becomes $(a(x+y),a(y-x))$,
missä $a=1/\sqrt{2}$. where $a=1/\sqrt{2}$.
Kerroin $a$ on valittu niin, että The multiplier $a$ is so chosen that
pisteiden etäisyydet säilyvät samana käännöksen jälkeen. the distances of the points remain the same.
Tämän seurauksena pisteestä etäisyydellä $d$ oleva alue After the rotation, the region within a distance of $d$
on neliö, jonka sivut ovat vaaka- ja pystysuuntaisia, from a point is a square with horizontal and vertical sides:
mikä helpottaa alueen käsittelyä.
\begin{center} \begin{center}
\begin{tikzpicture} \begin{tikzpicture}
\draw[fill=gray!20] (0,1) -- (-1,0) -- (0,-1) -- (1,0) -- (0,1); \draw[fill=gray!20] (0,1) -- (-1,0) -- (0,-1) -- (1,0) -- (0,1);
@ -736,3 +728,5 @@ mikä helpottaa alueen käsittelyä.
\end{center} \end{center}
\end{samepage} \end{samepage}
Implementing many algorithms is easier when we may assume that all
objects are squares with horizontal and vertical sides.