cphb/luku29.tex

732 lines
21 KiB
TeX
Raw Normal View History

2016-12-28 23:54:51 +01:00
\chapter{Geometry}
2017-01-29 16:55:04 +01:00
\index{geometry}
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
In geometric problems, a usual challenge is
to realize how to approach the problem so that
the solution can be conveniently implemented
and the number of special cases is small.
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
As an example, consider a problem where
we are given the vertices of a quadrilateral
(a polygon that has four vertices),
and our task is to calculate its area.
For example, a possible input for the problem is as follows:
2016-12-28 23:54:51 +01:00
\begin{center}
\begin{tikzpicture}[scale=0.45]
\draw[fill] (6,2) circle [radius=0.1];
\draw[fill] (5,6) circle [radius=0.1];
\draw[fill] (2,5) circle [radius=0.1];
\draw[fill] (1,1) circle [radius=0.1];
\draw[thick] (6,2) -- (5,6) -- (2,5) -- (1,1) -- (6,2);
\end{tikzpicture}
\end{center}
2017-01-29 16:55:04 +01:00
One way to approach the problem is to divide
the quadrilateral into two triangles by a straight
line between two opposite vertices:
2016-12-28 23:54:51 +01:00
\begin{center}
\begin{tikzpicture}[scale=0.45]
\draw[fill] (6,2) circle [radius=0.1];
\draw[fill] (5,6) circle [radius=0.1];
\draw[fill] (2,5) circle [radius=0.1];
\draw[fill] (1,1) circle [radius=0.1];
\draw[thick] (6,2) -- (5,6) -- (2,5) -- (1,1) -- (6,2);
\draw[dashed,thick] (2,5) -- (6,2);
\end{tikzpicture}
\end{center}
2017-01-29 16:55:04 +01:00
After this, it suffices to sum the areas
of the triangles.
The area of a triangle can be calculated,
for example, using \key{Heron's formula}
2016-12-28 23:54:51 +01:00
\[ \sqrt{s (s-a) (s-b) (s-c)},\]
2017-01-29 16:55:04 +01:00
where $a$, $b$ and $c$ are the lengths
of the triangle's sides and
$s=(a+b+c)/2$.
\index{Heron's formula}
This is a possible way to solve the problem,
but there is one pitfall:
how to divide the quadrilateral into triangles?
It turns out that sometimes we can't pick
arbitrary opposite vertices.
For example, in the following quadrilateral,
the division line is outside the quadrilateral:
2016-12-28 23:54:51 +01:00
\begin{center}
\begin{tikzpicture}[scale=0.45]
\draw[fill] (6,2) circle [radius=0.1];
\draw[fill] (3,2) circle [radius=0.1];
\draw[fill] (2,5) circle [radius=0.1];
\draw[fill] (1,1) circle [radius=0.1];
\draw[thick] (6,2) -- (3,2) -- (2,5) -- (1,1) -- (6,2);
\draw[dashed,thick] (2,5) -- (6,2);
\end{tikzpicture}
\end{center}
2017-01-29 16:55:04 +01:00
However, another way to draw the line works:
2016-12-28 23:54:51 +01:00
\begin{center}
\begin{tikzpicture}[scale=0.45]
\draw[fill] (6,2) circle [radius=0.1];
\draw[fill] (3,2) circle [radius=0.1];
\draw[fill] (2,5) circle [radius=0.1];
\draw[fill] (1,1) circle [radius=0.1];
\draw[thick] (6,2) -- (3,2) -- (2,5) -- (1,1) -- (6,2);
\draw[dashed,thick] (3,2) -- (1,1);
\end{tikzpicture}
\end{center}
2017-01-29 16:55:04 +01:00
For a human, it is clear which of the lines is the correct
choice, but for a computer the situation is difficult.
However, it turns out that we can solve the problem using
another method which is much easier to implement
and doesn't contain any special cases.
There is a general formula
2016-12-28 23:54:51 +01:00
\[x_1y_2-x_2y_1+x_2y_3-x_3y_2+x_3y_4-x_4y_3+x_4y_1-x_1y_4,\]
2017-01-29 16:55:04 +01:00
that calculates the area of a quadrilateral
whose vertices are
2016-12-28 23:54:51 +01:00
$(x_1,y_1)$,
$(x_2,y_2)$,
2017-01-29 16:55:04 +01:00
$(x_3,y_3)$ and
2016-12-28 23:54:51 +01:00
$(x_4,y_4)$.
2017-01-29 16:55:04 +01:00
This formula is easy to calculate, there are no special
cases, and it turns out that we can generalize the formula
for \emph{all} polygons.
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
\section{Complex numbers}
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
\index{complex number}
\index{point}
\index{vector}
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
A \key{complex number} is a number of the form $x+y i$,
where $i = \sqrt{-1}$ is the \key{imaginary unit}.
A geometric interpretation for a complex number is
that it represents a two-dimensional point $(x,y)$
or a vector from the origin to point $(x,y)$.
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
For example, $4+2i$ corresponds to the
following point and vector:
2016-12-28 23:54:51 +01:00
\begin{center}
\begin{tikzpicture}[scale=0.45]
\draw[->,thick] (-5,0)--(5,0);
\draw[->,thick] (0,-5)--(0,5);
\draw[fill] (4,2) circle [radius=0.1];
\draw[->,thick] (0,0)--(4-0.1,2-0.1);
\node at (4,2.8) {$(4,2)$};
\end{tikzpicture}
\end{center}
\index{complex@\texttt{complex}}
2017-01-29 16:55:04 +01:00
The complex number class \texttt{complex} in C++ is
useful when solving geometry problems.
Using the class, we can store points and vectors
as complex numbers, and the class also contains tools
that are useful in geometry.
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
In the following code, \texttt{C} is the type of
a coordinate, and \texttt{P} is the type of a point or vector.
In addition, the code defines shortcuts \texttt{X} and \texttt{Y}
that can be used to refer to x and y coordinates.
2016-12-28 23:54:51 +01:00
\begin{lstlisting}
typedef long long C;
typedef complex<C> P;
#define X real()
#define Y imag()
\end{lstlisting}
2017-01-29 16:55:04 +01:00
For example, the following code defines a point $p=(4,2)$
and prints its x and y coordinates:
2016-12-28 23:54:51 +01:00
\begin{lstlisting}
P p = {4,2};
cout << p.X << " " << p.Y << "\n"; // 4 2
\end{lstlisting}
2017-01-29 16:55:04 +01:00
The following code defines vectors $v=(3,1)$ and $u=(2,2)$,
and after that calculates the sum $s=v+u$.
2016-12-28 23:54:51 +01:00
\begin{lstlisting}
P v = {3,1};
P u = {2,2};
P s = v+u;
cout << s.X << " " << s.Y << "\n"; // 5 3
\end{lstlisting}
2017-01-29 16:55:04 +01:00
The appropriate type for \texttt{C} is
\texttt{long long} (integer) or \texttt{long double}
(real number), depending on the situation.
It is a good idea to use integers whenever possible,
because the integer calculations are exact.
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
If coordinates are real numbers,
precision error should be taken into account
when comparing them.
A safe way to check if numbers $a$ and $b$ are equal
is the comparison $|a-b|<\epsilon$,
where $\epsilon$ is a small number (for example, $\epsilon=10^{-9}$).
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
\subsubsection*{Functions}
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
In the following examples, the coordinate type is
2016-12-28 23:54:51 +01:00
\texttt{long double}.
2017-01-29 16:55:04 +01:00
The function \texttt{abs(v)} calculates the length
$|v|$ of a vector $v=(x,y)$
using the formula $\sqrt{x^2+y^2}$.
The function can also be used for
calculating the distance between points
$(x_1,y_1)$ and $(x_2,y_2)$,
because that distance equals the length
of the vector $(x_2-x_1,y_2-y_1)$.
The following code calculates the distance
of points $(4,2)$ and $(3,-1)$:
2016-12-28 23:54:51 +01:00
\begin{lstlisting}
P a = {4,2};
P b = {3,-1};
cout << abs(b-a) << "\n"; // 3.60555
\end{lstlisting}
2017-01-29 16:55:04 +01:00
The function \texttt{arg(v)} calculates the
angle of a vector $v=(x,y)$ with respect to the x axel.
The function gives the angle in radians,
where $r$ radians equals $180 r/\pi$ degrees.
The angle of a vector that points to the right is 0,
and the angle decreases clockwise and increases
counterclockwise.
The function \texttt{polar(s,a)} constructs a vector
whose length is $s$ and that points to angle $a$.
In addition, a vector can be rotated by angle $a$
by multiplying it by a vector with length 1 and angle $a$.
The following code calculates the angle of
the vector $(4,2)$, rotates it $1/2$ radians
counterclockwise, and then calculates the angle again:
2016-12-28 23:54:51 +01:00
\begin{lstlisting}
P v = {4,2};
cout << arg(v) << "\n"; // 0.463648
v *= polar(1.0,0.5);
cout << arg(v) << "\n"; // 0.963648
\end{lstlisting}
2017-01-29 16:55:04 +01:00
\section{Points and lines}
\index{cross product}
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
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$.
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
The following picture shows three examples:
2016-12-28 23:54:51 +01:00
\begin{center}
\begin{tikzpicture}[scale=0.45]
\draw[->,thick] (0,0)--(4,2);
\draw[->,thick] (4,2)--(4+1,2+2);
\node at (2.5,0.5) {$a$};
\node at (5,2.5) {$b$};
\node at (3,-2) {$a \times b = 6$};
\draw[->,thick] (8+0,0)--(8+4,2);
\draw[->,thick] (8+4,2)--(8+4+2,2+1);
\node at (8+2.5,0.5) {$a$};
\node at (8+5,1.5) {$b$};
\node at (8+3,-2) {$a \times b = 0$};
\draw[->,thick] (16+0,0)--(16+4,2);
\draw[->,thick] (16+4,2)--(16+4+2,2-1);
\node at (16+2.5,0.5) {$a$};
\node at (16+5,2.5) {$b$};
\node at (16+3,-2) {$a \times b = -8$};
\end{tikzpicture}
\end{center}
\noindent
2017-01-29 16:55:04 +01:00
For example, in the left picture
$a=(4,2)$ and $b=(1,2)$.
The following code calculates the cross product
using the class \texttt{complex}:
2016-12-28 23:54:51 +01:00
\begin{lstlisting}
P a = {4,2};
P b = {1,2};
C r = (conj(a)*b).Y; // 6
\end{lstlisting}
2017-01-29 16:55:04 +01:00
The function \texttt{conj} negates the y coordinate
of a vector,
and when the vectors $(x_1,-y_1)$ and $(x_2,y_2)$
are multiplied together, the y coordinate
of the result is $x_1 y_2 - x_2 y_1$.
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
\subsubsection{Point location}
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
The cross product can be used for testing
whether a point is located on the left or right
side of a line.
Assume that the line goes through points
$s_1$ and $s_2$, we are looking from $s_1$
to $s_2$ and the point is $p$.
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
For example, in the following picture,
$p$ is on the left side of the line:
2016-12-28 23:54:51 +01:00
\begin{center}
\begin{tikzpicture}[scale=0.45]
\draw[dashed,thick,->] (0,-3)--(12,6);
\draw[fill] (4,0) circle [radius=0.1];
\draw[fill] (8,3) circle [radius=0.1];
\draw[fill] (5,3) circle [radius=0.1];
\node at (4,-1) {$s_1$};
\node at (8,2) {$s_2$};
\node at (5,4) {$p$};
\end{tikzpicture}
\end{center}
2017-01-29 16:55:04 +01:00
Now the cross product $(p-s_1) \times (p-s_2)$
indicates the location of the point $p$.
If the cross product is positive,
$p$ is located on the left side,
and if the cross product is negative,
$p$ is located on the right side.
Finally, if the cross product is zero,
points $s_1$, $s_2$ and $p$ are on the same line.
\subsubsection{Line segment intersection}
\index{line segment intersection}
Consider a problem where we are given two line segments
$ab$ and $cd$ and our task is to check whether they
intersect. The possible cases are:
\textit{Case 1:}
The line segments are on the same line
and they overlap each other.
In this case, there is an infinite number of
intersection points.
For example, in the following picture,
all points between $c$ and $b$ are
intersection points:
2016-12-28 23:54:51 +01:00
\begin{center}
\begin{tikzpicture}[scale=0.9]
\draw (1.5,1.5)--(6,3);
\draw (0,1)--(4.5,2.5);
\draw[fill] (0,1) circle [radius=0.05];
\node at (0,0.5) {$a$};
\draw[fill] (1.5,1.5) circle [radius=0.05];
\node at (6,2.5) {$d$};
\draw[fill] (4.5,2.5) circle [radius=0.05];
\node at (1.5,1) {$c$};
\draw[fill] (6,3) circle [radius=0.05];
\node at (4.5,2) {$b$};
\end{tikzpicture}
\end{center}
2017-01-29 16:55:04 +01:00
In this case, we can use cross products to
check if all points are on the same line.
After this, we can sort the points and check
whether the line segments overlap each other.
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
\textit{Case 2:}
The line segments have a common vertex
that is the only intersection point.
For example, in the following picture the
intersection point is $b=c$:
2016-12-28 23:54:51 +01:00
\begin{center}
\begin{tikzpicture}[scale=0.9]
\draw (0,0)--(4,2);
\draw (4,2)--(6,1);
\draw[fill] (0,0) circle [radius=0.05];
\draw[fill] (4,2) circle [radius=0.05];
\draw[fill] (6,1) circle [radius=0.05];
\node at (0,0.5) {$a$};
\node at (4,2.5) {$b=c$};
\node at (6,1.5) {$d$};
\end{tikzpicture}
\end{center}
2017-01-29 16:55:04 +01:00
This case is easy to test because the
possibilities for the common intersection point
are $a=c$, $a=d$, $b=c$ and $b=d$.
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
\textit{Case 3:}
There is exactly one intersection point
that is not a vertex of any line segment.
In the following picture, the point $p$
is the intersection point:
2016-12-28 23:54:51 +01:00
\begin{center}
\begin{tikzpicture}[scale=0.9]
\draw (0,1)--(6,3);
\draw (2,4)--(4,0);
\draw[fill] (0,1) circle [radius=0.05];
\node at (0,0.5) {$c$};
\draw[fill] (6,3) circle [radius=0.05];
\node at (6,2.5) {$d$};
\draw[fill] (2,4) circle [radius=0.05];
\node at (1.5,3.5) {$a$};
\draw[fill] (4,0) circle [radius=0.05];
\node at (4,-0.4) {$b$};
\draw[fill] (3,2) circle [radius=0.05];
\node at (3,1.5) {$p$};
\end{tikzpicture}
\end{center}
2017-01-29 16:55:04 +01:00
In this case, the line segments intersect
exactly when both points $c$ and $d$ are
on different sides of a line through $a$ and $b$,
and points $a$ and $b$ are on different
sides of a line through $c$ and $d$.
Hence, we can use cross products to check this.
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
\subsubsection{Point distance from a line}
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
The area of a triangle can be calculated
using the formula
2016-12-28 23:54:51 +01:00
\[\frac{| (a-c) \times (b-c) |}{2},\]
2017-01-29 16:55:04 +01:00
where $a$, $b$ and $c$ are the vertices of the triangle.
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
Using this formula, it is possible to calculate the
shortest distance of a point from a line.
For example, in the following picture $d$ is the
shortest distance between point $p$ and the line
that is defined by points $s_1$ and $s_2$:
2016-12-28 23:54:51 +01:00
\begin{center}
\begin{tikzpicture}[scale=0.75]
\draw (-2,-1)--(6,3);
\draw[dashed] (1,4)--(2.40,1.2);
\node at (0,-0.5) {$s_1$};
\node at (4,1.5) {$s_2$};
\node at (0.5,4) {$p$};
\node at (2,2.7) {$d$};
\draw[fill] (0,0) circle [radius=0.05];
\draw[fill] (4,2) circle [radius=0.05];
\draw[fill] (1,4) circle [radius=0.05];
\end{tikzpicture}
\end{center}
2017-01-29 16:55:04 +01:00
The area of the triangle whose vertices are
$s_1$, $s_2$ and $p$ can be calculated in two ways:
it is both
$\frac{1}{2} |s_2-s_1| d$ and
2016-12-28 23:54:51 +01:00
$\frac{1}{2} ((s_1-p) \times (s_2-p))$.
2017-01-29 16:55:04 +01:00
Thus, the shortest distance is
2016-12-28 23:54:51 +01:00
\[ d = \frac{(s_1-p) \times (s_2-p)}{|s_2-s_1|} .\]
2017-01-29 16:55:04 +01:00
\subsubsection{Point inside a polygon}
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
Let us now consider a problem where our task is to
find out whether a point is located inside or outside
a polygon.
For example, in the following picture point $a$
is inside the polygon and point $b$ is outside
the polygon.
2016-12-28 23:54:51 +01:00
\begin{center}
\begin{tikzpicture}[scale=0.75]
%\draw (0,0)--(2,-2)--(3,1)--(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);
\draw[fill] (-3,1) circle [radius=0.05];
\node at (-3,0.5) {$a$};
\draw[fill] (1,3) circle [radius=0.05];
\node at (1,2.5) {$b$};
\end{tikzpicture}
\end{center}
2017-01-29 16:55:04 +01:00
A convenient way to solve the problem is to
send a ray from the point to an arbitrary direction
and calculate the number of times it touches
the border of the polygon.
If the number is odd,
the point is inside the polygon,
and if the number is even,
the point is outside the polygon.
2016-12-28 23:54:51 +01:00
\begin{samepage}
2017-01-29 16:55:04 +01:00
For example, we could send the following rays:
2016-12-28 23:54:51 +01:00
\begin{center}
\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[fill] (-3,1) circle [radius=0.05];
\node at (-3,0.5) {$a$};
\draw[fill] (1,3) circle [radius=0.05];
\node at (1,2.5) {$b$};
\draw[dashed,->] (-3,1)--(-6,0);
\draw[dashed,->] (-3,1)--(0,5);
\draw[dashed,->] (1,3)--(3.5,0);
\draw[dashed,->] (1,3)--(3,4);
\end{tikzpicture}
\end{center}
\end{samepage}
2017-01-29 16:55:04 +01:00
The rays from $a$ touch 1 and 3 times
the border of the polygon,
so $a$ is inside the polygon.
Correspondingly, the rays from $b$
touch 0 and 2 times the border of the polygon,
so $b$ is outside the polygon.
2016-12-28 23:54:51 +01:00
2017-01-29 16:57:02 +01:00
\section{Polygon area}
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
A general formula for calculating the area
of a polygon is
2016-12-28 23:54:51 +01:00
\[\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)|, \]
2017-01-29 16:55:04 +01:00
when the vertices are
2016-12-28 23:54:51 +01:00
$p_1=(x_1,y_1)$, $p_2=(x_2,y_2)$, $\ldots$, $p_n=(x_n,y_n)$
2017-01-29 16:55:04 +01:00
sorted so that
$p_i$ and $p_{i+1}$ are adjacent vertices on the border
of the polygon,
and the first and last vertex is the same, i.e., $p_1=p_n$.
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
For example, the area of the polygon
2016-12-28 23:54:51 +01:00
\begin{center}
\begin{tikzpicture}[scale=0.7]
\filldraw (4,1.4) circle (2pt);
\filldraw (7,3.4) circle (2pt);
\filldraw (5,5.4) circle (2pt);
\filldraw (2,4.4) circle (2pt);
\filldraw (4,3.4) circle (2pt);
\node (1) at (4,1) {(4,1)};
\node (2) at (7.2,3) {(7,3)};
\node (3) at (5,5.8) {(5,5)};
\node (4) at (2,4) {(2,4)};
\node (5) at (3.5,3) {(4,3)};
\path[draw] (4,1.4) -- (7,3.4) -- (5,5.4) -- (2,4.4) -- (4,3.4) -- (4,1.4);
\end{tikzpicture}
\end{center}
2017-01-29 16:55:04 +01:00
is
2016-12-28 23:54:51 +01:00
\[\frac{|(2\cdot5-4\cdot5)+(5\cdot3-5\cdot7)+(7\cdot1-3\cdot4)+(4\cdot3-1\cdot4)+(4\cdot4-3\cdot2)|}{2} = 17/2.\]
2017-01-29 16:55:04 +01:00
The idea in the formula is to go through trapezoids
where one side is a side of the polygon,
and another side is on the horizontal line $y=0$.
For example:
2016-12-28 23:54:51 +01:00
\begin{center}
\begin{tikzpicture}[scale=0.7]
\path[draw,fill=lightgray] (5,5.4) -- (7,3.4) -- (7,0) -- (5,0) -- (5,5.4);
\filldraw (4,1.4) circle (2pt);
\filldraw (7,3.4) circle (2pt);
\filldraw (5,5.4) circle (2pt);
\filldraw (2,4.4) circle (2pt);
\filldraw (4,3.4) circle (2pt);
\node (1) at (4,1) {(4,1)};
\node (2) at (7.2,3) {(7,3)};
\node (3) at (5,5.8) {(5,5)};
\node (4) at (2,4) {(2,4)};
\node (5) at (3.5,3) {(4,3)};
\path[draw] (4,1.4) -- (7,3.4) -- (5,5.4) -- (2,4.4) -- (4,3.4) -- (4,1.4);
\draw (0,0) -- (10,0);
\end{tikzpicture}
\end{center}
2017-01-29 16:55:04 +01:00
The are of such a trapezoid is
2016-12-28 23:54:51 +01:00
\[(x_{i+1}-x_{i}) \frac{y_i+y_{i+1}}{2},\]
2017-01-29 16:55:04 +01:00
when the vertices of the polygon are $p_i$ and $p_{i+1}$.
If $x_{i+1}>x_{i}$, the area is positive,
and if $x_{i+1}<x_{i}$, the area is negative.
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
The area of the polygon is the sum of areas of
all such trapezoids, which yields the formula
2016-12-28 23:54:51 +01:00
\[|\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)|.\]
2017-01-29 16:55:04 +01:00
Note that the absolute value of the sum is calculated,
because the value of the sum may be positive or negative
depending on whether we walk clockwise or counterclockwise
along the sides of the the polygon.
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
\subsubsection{Pick's theorem}
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
\index{Pick's theorem}
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
\key{Pick's theorem} provides another way to calculate
the area of a polygon where are vertices have integer coordinates.
According to Pick's theorem, the area of the polygon is
2016-12-28 23:54:51 +01:00
\[ a + b/2 -1,\]
2017-01-29 16:55:04 +01:00
where $a$ is the number of integer points inside the polygon
and $b$ is the number of integer points on the border of the polygon.
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
For example, the area of the polygon
2016-12-28 23:54:51 +01:00
\begin{center}
\begin{tikzpicture}[scale=0.7]
\filldraw (4,1.4) circle (2pt);
\filldraw (7,3.4) circle (2pt);
\filldraw (5,5.4) circle (2pt);
\filldraw (2,4.4) circle (2pt);
\filldraw (4,3.4) circle (2pt);
\node (1) at (4,1) {(4,1)};
\node (2) at (7.2,3) {(7,3)};
\node (3) at (5,5.8) {(5,5)};
\node (4) at (2,4) {(2,4)};
\node (5) at (3.5,3) {(4,3)};
\path[draw] (4,1.4) -- (7,3.4) -- (5,5.4) -- (2,4.4) -- (4,3.4) -- (4,1.4);
\filldraw (2,4.4) circle (2pt);
\filldraw (3,4.4) circle (2pt);
\filldraw (4,4.4) circle (2pt);
\filldraw (5,4.4) circle (2pt);
\filldraw (6,4.4) circle (2pt);
\filldraw (4,3.4) circle (2pt);
\filldraw (5,3.4) circle (2pt);
\filldraw (6,3.4) circle (2pt);
\filldraw (7,3.4) circle (2pt);
\filldraw (4,2.4) circle (2pt);
\filldraw (5,2.4) circle (2pt);
\end{tikzpicture}
\end{center}
2017-01-29 16:55:04 +01:00
is $6+7/2-1=17/2$.
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
\section{Distance functions}
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
\index{distance function}
\index{Euklidean distance}
\index{Manhattan distance}
2016-12-28 23:54:51 +01:00
2017-01-29 16:55:04 +01:00
A \key{distance function} defines the distance between
two points.
The usual distance function in geometry is the
\key{Euclidean distance} where the distance between
points $(x_1,y_1)$ and $(x_2,y_2)$ is
2016-12-28 23:54:51 +01:00
\[\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}.\]
2017-01-29 16:55:04 +01:00
An alternative distance function is the
\key{Manhattan distance}
where the distance between points
$(x_1,y_1)$ and $(x_2,y_2)$ is
2016-12-28 23:54:51 +01:00
\[|x_1-x_2|+|y_1-y_2|.\]
\begin{samepage}
2017-01-29 16:55:04 +01:00
For example, consider the following picture:
2016-12-28 23:54:51 +01:00
\begin{center}
\begin{tikzpicture}
\draw[fill] (2,1) circle [radius=0.05];
\draw[fill] (5,2) circle [radius=0.05];
\node at (2,0.5) {$(2,1)$};
\node at (5,1.5) {$(5,2)$};
\draw[dashed] (2,1) -- (5,2);
\draw[fill] (5+2,1) circle [radius=0.05];
\draw[fill] (5+5,2) circle [radius=0.05];
\node at (5+2,0.5) {$(2,1)$};
\node at (5+5,1.5) {$(5,2)$};
\draw[dashed] (5+2,1) -- (5+2,2);
\draw[dashed] (5+2,2) -- (5+5,2);
2017-01-29 16:55:04 +01:00
\node at (3.5,-0.5) {Euclidean distance};
\node at (5+3.5,-0.5) {Manhattan distance};
2016-12-28 23:54:51 +01:00
\end{tikzpicture}
\end{center}
\end{samepage}
2017-01-29 16:55:04 +01:00
The Euclidean distance between the points is
2016-12-28 23:54:51 +01:00
\[\sqrt{(5-2)^2+(2-1)^2}=\sqrt{10}\]
2017-01-29 16:55:04 +01:00
and the Manhattan distance is
2016-12-28 23:54:51 +01:00
\[|5-2|+|2-1|=4.\]
2017-01-29 16:55:04 +01:00
The following picture shows regions that are within a distance of 1
from the center point, using Euclidean and Manhattan distances:
2016-12-28 23:54:51 +01:00
\begin{center}
\begin{tikzpicture}
\draw[fill=gray!20] (0,0) circle [radius=1];
\draw[fill] (0,0) circle [radius=0.05];
2017-01-29 16:55:04 +01:00
\node at (0,-1.5) {Euclidean distance};
2016-12-28 23:54:51 +01:00
\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];
2017-01-29 16:55:04 +01:00
\node at (5,-1.5) {Manhattan distance};
2016-12-28 23:54:51 +01:00
\end{tikzpicture}
\end{center}
2017-01-29 16:55:04 +01:00
\subsubsection{Furthest points}
Some problems are easier to solve if we use the
Manhattan distance instead of the Euclidean distance.
For example, consider a problem where we are given
$n$ points $(x_1,y_1),(x_2,y_2),\ldots,(x_n,y_n)$
and our task is to calculate the maximum distance
between any two points.
This is a difficult problem if we should maximize
the Euclidean distance,
but calculating
the maximum Manhattan distance is easy
because it either
\[\max A - \min A \hspace{20px} \textrm{or} \hspace{20px} \max B - \min B,\]
where
2016-12-28 23:54:51 +01:00
\[A = \{x_i+y_i : i = 1,2,\ldots,n\}\]
2017-01-29 16:55:04 +01:00
and
2016-12-28 23:54:51 +01:00
\[B = \{x_i-y_i : i = 1,2,\ldots,n\}.\]
\begin{samepage}
2017-01-29 16:55:04 +01:00
The reason for this is that the Manhattan distance
2016-12-28 23:54:51 +01:00
\[|x_a-x_b|+|y_a-y_b]\]
2017-01-29 16:55:04 +01:00
can be written
2016-12-28 23:54:51 +01:00
\begin{center}
\begin{tabular}{cl}
& $\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))$
\end{tabular}
\end{center}
2017-01-29 16:55:04 +01:00
assuming that $x_a \ge x_b$.
2016-12-28 23:54:51 +01:00
\end{samepage}
\begin{samepage}
2017-01-29 16:55:04 +01:00
\subsubsection{Rotating coordinates}
A useful technique related to the Manhattan distance
is to rotate all coordinates 45 degrees so that
a point $(x,y)$ becomes $(a(x+y),a(y-x))$,
where $a=1/\sqrt{2}$.
The multiplier $a$ is so chosen that
the distances of the points remain the same.
After the rotation, the region within a distance of $d$
from a point is a square with horizontal and vertical sides:
2016-12-28 23:54:51 +01:00
\begin{center}
\begin{tikzpicture}
\draw[fill=gray!20] (0,1) -- (-1,0) -- (0,-1) -- (1,0) -- (0,1);
\draw[fill] (0,0) circle [radius=0.05];
\node at (2.5,0) {$\Rightarrow$};
\draw[fill=gray!20] (5-0.71,0.71) -- (5-0.71,-0.71) -- (5+0.71,-0.71) -- (5+0.71,0.71) -- (5-0.71,0.71);
\draw[fill] (5,0) circle [radius=0.05];
\end{tikzpicture}
\end{center}
\end{samepage}
2017-01-29 16:55:04 +01:00
Implementing many algorithms is easier when we may assume that all
objects are squares with horizontal and vertical sides.