109 lines
3.4 KiB
TeX
109 lines
3.4 KiB
TeX
\documentclass[a4paper, 11pt]{article}
|
|
|
|
\usepackage[utf8]{inputenc}
|
|
\usepackage[T1]{fontenc}
|
|
\usepackage[dutch]{babel}
|
|
\usepackage[linesnumbered, algoruled, lined]{algorithm2e}
|
|
\usepackage{float}
|
|
|
|
\title{Project: Snijdende cirkels}
|
|
\author{Arthur Bols \& Ruben Van Laer}
|
|
\date{Mei 2019}
|
|
|
|
\begin{document}
|
|
\maketitle
|
|
|
|
\section{Inleiding}
|
|
In dit practicum trachten we aan de hand van algoritmes met vooropgestelde complexiteiten de snijpunten van een set van gegeven cirkels te bepalen.
|
|
\section{Snijding van twee cirkels}
|
|
|
|
\section{Hoogniveau beschrijving van de algoritmen}
|
|
\subsection{Simpel algoritme $O(N^2)$}
|
|
\begin{algorithm}[H]
|
|
\{$cirkels$: lijst van cirkels met een middelpunt en een straal\}\\
|
|
$S \gets \emptyset$ \{$S$: lijst met alle snijpunten\}\\
|
|
\For{iedere $c_1$ in $cirkels$}{
|
|
\For{iedere $c_2$ in $cirkels$}{
|
|
$snpt \gets$ Snijpunten($c_1$,$c_2$)\\
|
|
\If{$snpt \neq \emptyset$}{
|
|
Voegtoe($S$,$snpt$)
|
|
}
|
|
}
|
|
}
|
|
\caption{Simpel Algoritme}
|
|
\end{algorithm}
|
|
\subsection{Doorlooplijnalgoritme $O(N^2)$}
|
|
\begin{algorithm}[H]
|
|
\{$cirkels$: lijst van cirkels met een middelpunt en een straal\}\\
|
|
$E \gets \emptyset$ \{$E$: gesorteerde rij met de horizontale begin- en eindpunten van elke cirkel (ook wel de 'Events' van de doorlooplijn)\}\\
|
|
\For{iedere $c$ in $cirkels$}{
|
|
$p_1 \gets$ Beginpunt($c$)\\
|
|
$p_2 \gets$ Eindpunt($c$)\\
|
|
Voegtoe($E$, $p_1$)\\
|
|
Voegtoe($E$, $p_2$)
|
|
}
|
|
$S \gets \emptyset$ \{$S$: lijst met alle snijpunten\}\\
|
|
$A \gets \emptyset$ \{$A$: lijst met cirkels die snijden met de doorlooplijn\}\\
|
|
\While{$E \neq \emptyset$}{
|
|
$e \gets$ Kleinste($E$)\\
|
|
Verwijder($E$, $e$)\\
|
|
\If{$e$ is een beginpunt}{
|
|
$c \gets$ Cirkel($e$)\\
|
|
\For{iedere $c_i$ in $A$}{
|
|
$snpt \gets$ Snijpunten($c$,$c_i$)\\
|
|
\If{$snpt \neq \emptyset$}{
|
|
Voegtoe($S$,$snpt$)
|
|
}
|
|
}
|
|
Voegtoe($A$, $c$)\\
|
|
}
|
|
\If{$e$ is een eindpunt}{
|
|
$c \gets$ Cirkel($e$)\\
|
|
Verwijder($A$, $c$)
|
|
}
|
|
}
|
|
\caption{Doorlooplijnalgoritme $O(N^2)$}
|
|
\end{algorithm}
|
|
|
|
\subsection{Doorlooplijnalgoritme $O((N+S)log_2(N))$}
|
|
\begin{algorithm}[H]
|
|
\{$cirkels$: lijst van cirkels met een middelpunt en een straal\}\\
|
|
$E \gets \emptyset$ \{$E$: gesorteerde rij met de horizontale begin- en eindpunten van elke cirkel (ook wel de 'Events' van de doorlooplijn)\}\\
|
|
\For{iedere $c$ in $cirkels$}{
|
|
$p_1 \gets$ Beginpunt($c$)\\
|
|
$p_2 \gets$ Eindpunt($c$)\\
|
|
Voegtoe($E$, $p_1$)\\
|
|
Voegtoe($E$, $p_2$)
|
|
}
|
|
$S \gets \emptyset$ \{$S$: lijst met alle snijpunten\}\\
|
|
$A \gets \emptyset$ \{$A$: (gesorteerde) binaire boom met cirkels die snijden met de doorlooplijn\}\\
|
|
\While{$E \neq \emptyset$}{
|
|
$e \gets$ Kleinste($E$)\\
|
|
$c \gets$ Cirkel($e$)\\
|
|
Verwijder($E$, $e$)\\
|
|
\If{$e$ is een beginpunt}{
|
|
|
|
Voegtoe($A$, $c$)\\
|
|
$c_v \gets$ Voorganger($c$)\\
|
|
$c_o \gets$ Opvolger($c$)\\
|
|
$snpt \gets$ Snijpunten($c$,$c_v$)\\
|
|
\If{$snpt \neq \emptyset$}{
|
|
Voegtoe($S$,$snpt$)
|
|
}
|
|
$snpt \gets$ Snijpunten($c$,$c_o$)\\
|
|
\If{$snpt \neq \emptyset$}{
|
|
Voegtoe($S$,$snpt$)
|
|
}
|
|
}
|
|
\If{$e$ is een eindpunt}{
|
|
Verwijder($A$, $c$)
|
|
}
|
|
}
|
|
\caption{Doorlooplijnalgoritme $O(N^2)$}
|
|
\end{algorithm}
|
|
\section{Beschrijving experimenten en correctheid}
|
|
|
|
\section{Bespreking resultaten en rekentijden}
|
|
|
|
\end{document}
|