some text updates
This commit is contained in:
parent
a1bbdc19d7
commit
70e3cbcdb6
19
IV/bib.bib
19
IV/bib.bib
@ -150,3 +150,22 @@
|
|||||||
year={1974},
|
year={1974},
|
||||||
publisher={Elsevier}
|
publisher={Elsevier}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@article{knuth1976big,
|
||||||
|
title={Big omicron and big omega and big theta},
|
||||||
|
author={Knuth, Donald E},
|
||||||
|
journal={ACM Sigact News},
|
||||||
|
volume={8},
|
||||||
|
number={2},
|
||||||
|
pages={18--24},
|
||||||
|
year={1976},
|
||||||
|
publisher={ACM New York, NY, USA}
|
||||||
|
}
|
||||||
|
|
||||||
|
@book{bachmann1894analytische,
|
||||||
|
title={Die analytische zahlentheorie},
|
||||||
|
author={Bachmann, Paul},
|
||||||
|
volume={2},
|
||||||
|
year={1894},
|
||||||
|
publisher={Teubner}
|
||||||
|
}
|
||||||
|
137
IV/mj-msc.tex
137
IV/mj-msc.tex
@ -183,7 +183,7 @@ thus convenient to analyze for both small and large scale generalization.
|
|||||||
\begin{figure}[h]
|
\begin{figure}[h]
|
||||||
\centering
|
\centering
|
||||||
\includegraphics[width=\textwidth]{salvis-25k}
|
\includegraphics[width=\textwidth]{salvis-25k}
|
||||||
\caption{Example rivers for visual tests (1:25000)}
|
\caption{Example rivers for visual tests (1:25000).}
|
||||||
\label{fig:salvis-25}
|
\label{fig:salvis-25}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
@ -197,15 +197,15 @@ river for a smaller scale is worthy.
|
|||||||
\centering
|
\centering
|
||||||
\begin{subfigure}[b]{.49\textwidth}
|
\begin{subfigure}[b]{.49\textwidth}
|
||||||
\includegraphics[width=\textwidth]{salvis-50k}
|
\includegraphics[width=\textwidth]{salvis-50k}
|
||||||
\caption{Example scaled 1:50000}
|
\caption{Example scaled 1:50000.}
|
||||||
\end{subfigure}
|
\end{subfigure}
|
||||||
\hfill
|
\hfill
|
||||||
\begin{subfigure}[b]{.49\textwidth}
|
\begin{subfigure}[b]{.49\textwidth}
|
||||||
\centering
|
\centering
|
||||||
\includegraphics[width=.2\textwidth]{salvis-250k}
|
\includegraphics[width=.2\textwidth]{salvis-250k}
|
||||||
\caption{Example scaled 1:250000}
|
\caption{Example scaled 1:250000.}
|
||||||
\end{subfigure}
|
\end{subfigure}
|
||||||
\caption{Down-scaled original river (1:50000 and 1:250000)}
|
\caption{Down-scaled original river (1:50000 and 1:250000).}
|
||||||
\label{fig:salvis-50-250}
|
\label{fig:salvis-50-250}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
@ -276,6 +276,7 @@ many cases, corner cases are discussed and clarified.
|
|||||||
Assume Euclidean geometry throughout this document, unless noted otherwise.
|
Assume Euclidean geometry throughout this document, unless noted otherwise.
|
||||||
|
|
||||||
\subsection{Vocabulary and terminology}
|
\subsection{Vocabulary and terminology}
|
||||||
|
\label{sec:vocab}
|
||||||
|
|
||||||
This section defines vocabulary and terms as defined in the rest of the paper.
|
This section defines vocabulary and terms as defined in the rest of the paper.
|
||||||
|
|
||||||
@ -289,7 +290,7 @@ This section defines vocabulary and terms as defined in the rest of the paper.
|
|||||||
$(x_2, y_2)$. Line Segment and Segment are used interchangeably
|
$(x_2, y_2)$. Line Segment and Segment are used interchangeably
|
||||||
throughout the paper.
|
throughout the paper.
|
||||||
|
|
||||||
\item[Line] (or \textsc{linestring}) represents a single linear feature in
|
\item[Line], or \textsc{linestring}, represents a single linear feature in
|
||||||
the real world. For example, a river or a coastline.
|
the real world. For example, a river or a coastline.
|
||||||
|
|
||||||
Geometrically, A line is a series of connected line segments, or,
|
Geometrically, A line is a series of connected line segments, or,
|
||||||
@ -305,6 +306,16 @@ This section defines vocabulary and terms as defined in the rest of the paper.
|
|||||||
|
|
||||||
\item[Sum of inner angles] TBD.
|
\item[Sum of inner angles] TBD.
|
||||||
|
|
||||||
|
\item[Algorithmic Complexity] also called \textsc{big o notation}, is a
|
||||||
|
relative measure to explain how long will the algorithm run depending
|
||||||
|
on it's input. For example, given $n$ objects and time complexity of
|
||||||
|
$O(n)$, the time it takes to execute the algorithm is proportional to
|
||||||
|
$n$. Conversely, if complexity is $O(n^2)$, then the time it takes to
|
||||||
|
execute the algorithm is quadratic. $O$ notation was first suggested by
|
||||||
|
Bachmann\cite{bachmann1894analytische} in late XIX'th century, and
|
||||||
|
adopted for computer science by Donald Knuth\cite{knuth1976big} in
|
||||||
|
1970s.
|
||||||
|
|
||||||
\end{description}
|
\end{description}
|
||||||
|
|
||||||
\subsection{Radians and Degrees}
|
\subsection{Radians and Degrees}
|
||||||
@ -341,7 +352,7 @@ figure~\ref{fig:test-figures}.
|
|||||||
\begin{figure}[h]
|
\begin{figure}[h]
|
||||||
\centering
|
\centering
|
||||||
\includegraphics[width=\textwidth]{test-figures}
|
\includegraphics[width=\textwidth]{test-figures}
|
||||||
\caption{Line geometries for automated test cases}
|
\caption{Line geometries for automated test cases.}
|
||||||
\label{fig:test-figures}
|
\label{fig:test-figures}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
@ -349,6 +360,25 @@ The full test suite can be executed with a single command, and completes in a
|
|||||||
few seconds. Having an easily accessible test suite boosts confidence that no
|
few seconds. Having an easily accessible test suite boosts confidence that no
|
||||||
unexpected bugs have snug in while modifying the algorithm.
|
unexpected bugs have snug in while modifying the algorithm.
|
||||||
|
|
||||||
|
\subsection{Reproducing generalizations in this paper}
|
||||||
|
\label{sec:reproducing-the-paper}
|
||||||
|
|
||||||
|
It is widely believed that the ability to reproduce the results of a published
|
||||||
|
study is important to the scientific community. In practice, however, it is
|
||||||
|
often hard to impossible: research methodologies, as well as algorithms
|
||||||
|
themselves, are explained in prose, which, due to the nature of the non-machine
|
||||||
|
language, lends itself to inexact interpretations.
|
||||||
|
|
||||||
|
This article, besides explaining the algorithm in prose, \emph{includes} the
|
||||||
|
program of the algorithm in a way that can be executed on reader's workstation.
|
||||||
|
On top of it, all the illustrations in this paper are generated using that
|
||||||
|
algorithm, from a predefined list of test geometries (test geometries were
|
||||||
|
explained in section~\ref{sec:automated-tests}).
|
||||||
|
|
||||||
|
Instructions how to re-generate all the visualizations are found in
|
||||||
|
appendix~\ref{sec:code-regenerate}. The visualization code serves as a good
|
||||||
|
example reference for anyone willing to start using the algorithm.
|
||||||
|
|
||||||
\section{Description of the implementation}
|
\section{Description of the implementation}
|
||||||
|
|
||||||
Like alluded in section~\ref{sec:introduction}, {\WM} paper skims over
|
Like alluded in section~\ref{sec:introduction}, {\WM} paper skims over
|
||||||
@ -411,7 +441,7 @@ but with bends colored as polygons: each color is a distinctive bend.
|
|||||||
\begin{figure}[h]
|
\begin{figure}[h]
|
||||||
\centering
|
\centering
|
||||||
\includegraphics[width=\textwidth]{fig8-definition-of-a-bend}
|
\includegraphics[width=\textwidth]{fig8-definition-of-a-bend}
|
||||||
\caption{Originally figure 8: detected bends are highlighted}
|
\caption{Originally figure 8: detected bends are highlighted.}
|
||||||
\label{fig:fig8-definition-of-a-bend}
|
\label{fig:fig8-definition-of-a-bend}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
@ -431,14 +461,14 @@ when a single vertex is moved outwards the end of the bend.
|
|||||||
\centering
|
\centering
|
||||||
\begin{subfigure}[b]{.49\textwidth}
|
\begin{subfigure}[b]{.49\textwidth}
|
||||||
\includegraphics[width=\textwidth]{fig5-gentle-inflection-before}
|
\includegraphics[width=\textwidth]{fig5-gentle-inflection-before}
|
||||||
\caption{Before applying the inflection rule}
|
\caption{Before applying the inflection rule.}
|
||||||
\end{subfigure}
|
\end{subfigure}
|
||||||
\hfill
|
\hfill
|
||||||
\begin{subfigure}[b]{.49\textwidth}
|
\begin{subfigure}[b]{.49\textwidth}
|
||||||
\includegraphics[width=\textwidth]{fig5-gentle-inflection-after}
|
\includegraphics[width=\textwidth]{fig5-gentle-inflection-after}
|
||||||
\caption{After applying the inflection rule}
|
\caption{After applying the inflection rule.}
|
||||||
\end{subfigure}
|
\end{subfigure}
|
||||||
\caption{Originally figure 5: gentle inflections at the ends of the bend}
|
\caption{Originally figure 5: gentle inflections at the ends of the bend.}
|
||||||
\label{fig:fig5-gentle-inflection}
|
\label{fig:fig5-gentle-inflection}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
@ -458,15 +488,15 @@ vertices to the next bend.
|
|||||||
\centering
|
\centering
|
||||||
\begin{subfigure}[b]{.49\textwidth}
|
\begin{subfigure}[b]{.49\textwidth}
|
||||||
\includegraphics[width=\textwidth]{inflection-1-gentle-inflection-before}
|
\includegraphics[width=\textwidth]{inflection-1-gentle-inflection-before}
|
||||||
\caption{Before applying the inflection rule}
|
\caption{Before applying the inflection rule.}
|
||||||
\end{subfigure}
|
\end{subfigure}
|
||||||
\hfill
|
\hfill
|
||||||
\begin{subfigure}[b]{.49\textwidth}
|
\begin{subfigure}[b]{.49\textwidth}
|
||||||
\includegraphics[width=\textwidth]{inflection-1-gentle-inflection-after}
|
\includegraphics[width=\textwidth]{inflection-1-gentle-inflection-after}
|
||||||
\caption{After applying the inflection rule}
|
\caption{After applying the inflection rule.}
|
||||||
\end{subfigure}
|
\end{subfigure}
|
||||||
\caption{Gentle inflection at the end of the bend when multiple vertices
|
\caption{Gentle inflection at the end of the bend when multiple vertices
|
||||||
are moved}
|
are moved.}
|
||||||
\label{fig:inflection-1-gentle-inflection}
|
\label{fig:inflection-1-gentle-inflection}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
@ -494,58 +524,65 @@ The "quite small angle" was arbitrarily chosen to $\smallAngle$.
|
|||||||
\subsection{Self-line Crossing When Cutting a Bend}
|
\subsection{Self-line Crossing When Cutting a Bend}
|
||||||
|
|
||||||
When bend's baseline crosses another bend, it is called self-crossing.
|
When bend's baseline crosses another bend, it is called self-crossing.
|
||||||
Self-crossing is undesirable in the upcoming operators, thus should be removed
|
Self-crossing is undesirable for the upcoming bend manipulation operators, thus
|
||||||
following the rules of the article.
|
should be removed. There are a few rules on when and how they should be removed
|
||||||
|
--- this section explains them in higher detail, discusses their time
|
||||||
|
complexity and applied optimizations. Figure~\ref{fig:fig6-selfcrossing} is
|
||||||
|
copied from the original article.
|
||||||
|
|
||||||
\begin{figure}[h]
|
\begin{figure}[h]
|
||||||
\centering
|
\centering
|
||||||
\begin{subfigure}[b]{.49\textwidth}
|
\begin{subfigure}[b]{.49\textwidth}
|
||||||
\includegraphics[width=\textwidth]{fig6-selfcrossing-before}
|
\includegraphics[width=\textwidth]{fig6-selfcrossing-before}
|
||||||
\caption{Bend's baseline (dotted) is crossing a neighboring bend}
|
\caption{Bend's baseline (dotted) is crossing a neighboring bend.}
|
||||||
\end{subfigure}
|
\end{subfigure}
|
||||||
\hfill
|
\hfill
|
||||||
\begin{subfigure}[b]{.49\textwidth}
|
\begin{subfigure}[b]{.49\textwidth}
|
||||||
\includegraphics[width=\textwidth]{fig6-selfcrossing-after}
|
\includegraphics[width=\textwidth]{fig6-selfcrossing-after}
|
||||||
\caption{Self-crossing removed following the algorithm}
|
\caption{Self-crossing removed.}
|
||||||
\end{subfigure}
|
\end{subfigure}
|
||||||
\caption{Originally figure 6: simple case of self-line crossing}
|
\caption{Originally figure 6: simple case of self-line crossing.}
|
||||||
\label{fig:fig6-selfcrossing}
|
\label{fig:fig6-selfcrossing}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
The original description does not go into detail which bends may self-cross, and which <TBD>
|
|
||||||
|
|
||||||
The self-line-crossing may happen not by the neighboring bend, but by any other
|
|
||||||
bend in the line. For example, the baseline of the bend may cross different
|
|
||||||
bends in between, as depicted in figure~\ref{fig:selfcrossing-1-non-neighbor}.
|
|
||||||
|
|
||||||
\begin{figure}[h]
|
\begin{figure}[h]
|
||||||
\centering
|
\centering
|
||||||
\begin{subfigure}[b]{.49\textwidth}
|
\begin{subfigure}[b]{.49\textwidth}
|
||||||
\includegraphics[width=\textwidth]{selfcrossing-1-before}
|
\includegraphics[width=\textwidth]{selfcrossing-1-before}
|
||||||
\caption{Bend's baseline (dotted) is crossing a non-neighboring bend}
|
\caption{Bend's baseline (dotted) is crossing a non-neighboring bend.}
|
||||||
\end{subfigure}
|
\end{subfigure}
|
||||||
\hfill
|
\hfill
|
||||||
\begin{subfigure}[b]{.49\textwidth}
|
\begin{subfigure}[b]{.49\textwidth}
|
||||||
\includegraphics[width=\textwidth]{selfcrossing-1-after}
|
\includegraphics[width=\textwidth]{selfcrossing-1-after}
|
||||||
\caption{Self-crossing removed following the algorithm}
|
\caption{Self-crossing removed.}
|
||||||
\end{subfigure}
|
\end{subfigure}
|
||||||
\caption{Self-crossing with non-neighboring bend}
|
\caption{Self-crossing with non-neighboring bend.}
|
||||||
\label{fig:selfcrossing-1-non-neighbor}
|
\label{fig:selfcrossing-1-non-neighbor}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
Naively implemented, checking every bend with every bend is costs $O(n^2)$. In
|
Looking at the {\WM} paper alone, it may seem like self-crossing may happen
|
||||||
other words, the time it takes to run the algorithm grows quadratically with
|
only with the neighboring bend. This would mean an efficient $O(n)$
|
||||||
the with the number of vertices.
|
implementation\footnote{where $n$ is the number of bends in a line. See
|
||||||
|
explanation of \textsc{algorithmic complexity} in section~\ref{sec:vocab}.}.
|
||||||
|
However, as one can see in figure~\ref{fig:selfcrossing-1-non-neighbor}, it may
|
||||||
|
not be the case: any other bend in the line may be crossing it.
|
||||||
|
|
||||||
It is possible to optimize this step and skip checking some of the bends. Only
|
If one translates the requirements to code in a straightforward way, it would
|
||||||
bends whose sum of inner angles is $\pi$ can ever self-cross. If the value is
|
be quite computationally expensive: naively implemented, complexity of checking
|
||||||
less than $\pi$, it cannot cross other bends. That way, only a fraction of
|
every bend with every bend is $O(n^2)$. In other words, the time it takes to
|
||||||
bends need to be checked.
|
run the algorithm grows quadratically with the with the number of vertices.
|
||||||
|
|
||||||
|
It is possible to optimize this step and skip checking most of the bends. Only
|
||||||
|
bends whose sum of inner angles is larger than $\pi$ can ever self-cross. If
|
||||||
|
the value is less than $\pi$, it cannot cross other bends. That way, only a
|
||||||
|
fraction of bends need to be checked. The worst-case complexity is still
|
||||||
|
$O(n^2)$, when all bends' inner angles are larger than $\pi$, but, assuming no
|
||||||
|
more than $20\%$ of the bends' inner angles are larger than $\pi$, the time it
|
||||||
|
takes to run this piece of the algorithm drops by $80\%$.
|
||||||
|
|
||||||
\subsection{Attributes of a Single Bend}
|
\subsection{Attributes of a Single Bend}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\textsc{Compactness Index} is "the ratio of the area of the polygon over the
|
\textsc{Compactness Index} is "the ratio of the area of the polygon over the
|
||||||
circle whose circumference length is the same as the length of the
|
circle whose circumference length is the same as the length of the
|
||||||
circumference of the polygon" \cite{wang1998line}. Given a bend, its
|
circumference of the polygon" \cite{wang1998line}. Given a bend, its
|
||||||
@ -555,10 +592,10 @@ compactness index is calculated as follows:
|
|||||||
|
|
||||||
\item Construct a polygon by joining first and last vertices of the bend.
|
\item Construct a polygon by joining first and last vertices of the bend.
|
||||||
|
|
||||||
\item Calculate area of the polygon $P$.
|
\item Calculate area of the polygon.
|
||||||
|
|
||||||
\item Calculate perimeter of the polygon $u$. The same value is the
|
\item Calculate perimeter $u$ of the polygon. The same value is the
|
||||||
circumference of the circle.
|
circumference of the circle.
|
||||||
|
|
||||||
\item Given circle's perimeter $u$, circle's area $A$ is:
|
\item Given circle's perimeter $u$, circle's area $A$ is:
|
||||||
|
|
||||||
@ -599,8 +636,8 @@ Two conditions must be true to claim that a bend is isolated:
|
|||||||
|
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item \textsc{average curvature} of neighboring bends, should be larger
|
\item \textsc{average curvature} of neighboring bends, should be larger
|
||||||
than the "candidate" bend's curvature; this implementation arbitrarily
|
than the "candidate" bend's curvature. The article did not offer a
|
||||||
chose $\isolationThreshold$.
|
value, this implementation arbitrarily chose $\isolationThreshold$.
|
||||||
|
|
||||||
\item Bends on both sides of the "candidate" should be longer than a
|
\item Bends on both sides of the "candidate" should be longer than a
|
||||||
certain value. This implementation does not (yet) define such a
|
certain value. This implementation does not (yet) define such a
|
||||||
@ -617,7 +654,7 @@ To find out whether two bends are similar, they are compared by 3 components:
|
|||||||
\item Baseline length
|
\item Baseline length
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
|
|
||||||
These 3 components represent a point in the 3-dimensional space, and Euclidean
|
Components 1, 2 and 3 represent a point in a 3-dimensional space, and Euclidean
|
||||||
distance $d$ between those is calculated to differentiate between bends $p$ and
|
distance $d$ between those is calculated to differentiate between bends $p$ and
|
||||||
$q$:
|
$q$:
|
||||||
|
|
||||||
@ -627,7 +664,7 @@ $q$:
|
|||||||
(baseline_p-baseline_q)^2}
|
(baseline_p-baseline_q)^2}
|
||||||
\]
|
\]
|
||||||
|
|
||||||
The more similar the bends are, the smaller the distance $d$.
|
The smaller the distance $d$, the more similar the bends are.
|
||||||
|
|
||||||
\subsection{Elimination Operator}
|
\subsection{Elimination Operator}
|
||||||
|
|
||||||
@ -651,19 +688,17 @@ The more similar the bends are, the smaller the distance $d$.
|
|||||||
|
|
||||||
\section{Code listings}
|
\section{Code listings}
|
||||||
|
|
||||||
\subsection{Reproducing the generalizations in this paper}
|
\subsection{Re-generating this paper}
|
||||||
|
\label{sec:code-regenerate}
|
||||||
|
|
||||||
We strongly believe in the ability to reproduce the results is critical for any
|
Like explained in section~\ref{sec:reproducing-the-paper}, illustrations in
|
||||||
scientific work. To make it possible for this paper, all source files and
|
this paper are generated from a small list of sample geometries. To observe
|
||||||
accompanying scripts have been attached to the PDF. To re-generate this
|
the source geometries or regenerate this paper, run this script (assuming
|
||||||
document and its accompanying graphics, run this script (assuming name of
|
name of this document is {\tt mj-msc-full.pdf}):
|
||||||
this document is {\tt mj-msc-full.pdf}):
|
|
||||||
|
|
||||||
\inputcode{bash}{extract-and-generate}
|
\inputcode{bash}{extract-and-generate}
|
||||||
|
|
||||||
This was tested on Linux Debian 11 with upstream packages only.
|
%\subsection{Algorithm code listings}
|
||||||
|
|
||||||
\subsection{Algorithm code listings}
|
|
||||||
%\inputcode{postgresql}{wm.sql}
|
%\inputcode{postgresql}{wm.sql}
|
||||||
|
|
||||||
\end{appendices}
|
\end{appendices}
|
||||||
|
Loading…
Reference in New Issue
Block a user