From a0a5f2f624cd5ff45b35bbcfe38b678e9396eca1 Mon Sep 17 00:00:00 2001 From: Karma Riuk Date: Thu, 22 Jun 2023 18:19:12 +0200 Subject: [PATCH] Finished the implementation section --- bachelorproject.tex | 20 ++++ figures/bounding_box.pdf | Bin 0 -> 21853 bytes sections/implementation.tex | 177 ++++++++++++++++++++++++++++++++++++ tikzs/bounding_box.tikz | 71 +++++++++++++++ 4 files changed, 268 insertions(+) create mode 100644 figures/bounding_box.pdf create mode 100644 tikzs/bounding_box.tikz diff --git a/bachelorproject.tex b/bachelorproject.tex index 130ee3d..ecdedb1 100644 --- a/bachelorproject.tex +++ b/bachelorproject.tex @@ -6,6 +6,7 @@ \usepackage[]{float} \usepackage[]{multicol} \usepackage{mathtools} +\usepackage[]{listings} \usepackage{tikz} \usepackage{tkz-euclide} @@ -21,6 +22,25 @@ \pgfdeclarelayer{edgelayer} \pgfsetlayers{edgelayer,nodelayer,main} + +\lstset{language=C++, + basicstyle=\ttfamily, + keywordstyle=\color{blue}\ttfamily, + stringstyle=\color{red}\ttfamily, + commentstyle=\color{green}\ttfamily, + morecomment=[l][\color{magenta}]{\#}, + emph={std, vector, vec2d, polygon, collision}, + emphstyle=\color{orange}\ttfamily, + numbers=left, + morekeywords={uint}, + numberstyle=\footnotesize, + numbersep=5pt, + frame=lines, + % breaklines=true, + % breaklines=true, + % postbreak=\raisebox{0ex}[0ex][0ex]{\space\ensuremath{\hookrightarrow}}, +} + \graphicspath{{../figures/}{./figures/}} \newcommand*{\vv}[1]{\overrightarrow{#1}} diff --git a/figures/bounding_box.pdf b/figures/bounding_box.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b34eb5daeda222fa50030dc4a9c3ba7eca3a0136 GIT binary patch literal 21853 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 OiGwM4d7=6m6#oK=-s|50 literal 0 HcmV?d00001 diff --git a/sections/implementation.tex b/sections/implementation.tex index f286ddb..80c34b0 100644 --- a/sections/implementation.tex +++ b/sections/implementation.tex @@ -1 +1,178 @@ \section{Implementation} + +This section will dive into the actual implementing of the project, trying to +describe how the theoretical concepts in section \ref{sec:theory}. + +\subsection{Structure} + +The added code to the project can be divided into three parts +\begin{itemize} + \item polygon generator; + \item collision detection; + \item collision resolution. +\end{itemize} + +Each part will be explained in the following sub-sections. + +\subsubsection{Polygon generator} +Before talking about how we generate polygons, let's first talk about how the +polygons are defined in this project. + +In the file \texttt{polygons.h} we define a polygon as + +\begin{lstlisting}[caption={Polygon class (simplified)},label={lst:polygon}] +class polygon { + std::vector points; + + vec2d center; + double angle; + + double inertia; + double mass; + + std::vector global_points(); + + vec2d speed; + double angular_speed; +} +\end{lstlisting} + +Polygons possesses multiple fields. Firstly we have +\lstinline{std::vector points}, a collection of +\lstinline{vec2d} objects, which represent the set of ordered points that +compose the polygon. Those points are expressed in local coordinates, and the +center of mass of the polygon is placed the origin. + +Now that we know how the polygon is composed, we want to move it around the +space it lives in, that is the purpose of the \lstinline{vec2d center} field. +It represents where the center of mass of the polygon is located in simulation. +Since the shapes also rotate, we need to keep track of the rotation of the +polygon, hence the use of \lstinline{double angle}. All of these fields are used +when computing the result of the method \lstinline{std::vector global_points()}. + +Finally, we have \lstinline{double inertia} and \lstinline{double mass} which, +as their name suggest, store the value for the polygon's inertia and mass, that +are used to calculate the polygons final speed and angular speed, who are +represented by \lstinline{vec2d speed} and \lstinline{double angular_speed}. + +\paragraph{Polygon generator} Now that we know how polygons are represented in +our simulation, we can generate them. In \texttt{polygon\_generator.h} (and its +implementation file \texttt{polygon\_generator.cc}), there are some functions +for that. In Listing \ref{lst:polygon_gen} we can see the signature of the +functions that generate +\begin{itemize} + \item a rectangle of a certain width and height; + \item a square of a certain side length; + \item a triangle given two side lengths and an angle between them; + \item a regular polygon; + \item an arbitrary polygon. +\end{itemize} + +\begin{lstlisting}[caption={Polygon Generator header +file},label={lst:polygon_gen}] +namespace poly_generate { + polygon rectangle(double width, double height); + + inline polygon square(double width) { + assert(width > 0); + return rectangle(width, width, label); + }; + + polygon triangle(double side1, double side2, double angle); + + polygon regular(double radius, uint n_sides); + + polygon general(std::vector points); +}; +\end{lstlisting} + +The implementation of those functions are fairly straight forward, they generate +the appropriate number of points in the correct place. After what they calculate +the mass and subsequent inertia of the polygon as shown in section +\ref{sub:moment}. + +\subsubsection{Collision} +\label{sub:implementation-collision-detection} + +The algorithm described in section~\ref{sub:vertex-collision} is implemented in +\texttt{collision.cc} and exposed to other modules with \texttt{collision.h}. + +The module exposes a collision structure and a collides function. + +\begin{lstlisting}[caption={Collision header file},label={lst:collision}] +struct collision { + bool collides = false; + vec2d impact_point; + vec2d n; + vec2d overlap; +}; + +extern collision collides(polygon& p, polygon& q); +\end{lstlisting} + +The \lstinline{collides} function takes in two polygons and checks with +vertex-collision algorithm whether they collide or not. The result is return +through an instance of \lstinline{struct collision}. The \lstinline{bool collides} +and \lstinline{vec2d impact_point} fields is self-explanatory. The +\lstinline{vec2d n} is the normal vector that pushes \lstinline{polygon& p} away +from \lstinline{polygon& q}. Finally, \lstinline{vec2d overlap} is a scalar +multiplication of \lstinline{vec2d n}. Where the latter is a normalized vector, +the former represents how deep \lstinline{p} is in \lstinline{q}. If we push +\lstinline{p} the exact amount of \lstinline{overlap}, then \lstinline{p} would +just be touching \lstinline{q} with point \lstinline{impact_point}, and no +further overlap would occur. + +In reality, we do not simply push \lstinline{p} by \lstinline{overlap}, but we +push \lstinline{p} and \lstinline{q} away from each other proportionally to +their mass. + +\paragraph{Collision resolution} In \texttt{polygons.cc}, among other functions, +we apply the collision resolution, which simply uses the physics results found +in \ref{sub:resolution}. + +\subsection{Optimization} + +In order to optimise the collision detection and to avoid having to do a check +whether each vertex of every polygon was colliding with each edge of every other +polygon we decided to apply the bounding box acceleration structure. + +The bounding box of an object is, in two dimensions, the rectangle that contains +the object and which the sides are aligned with axis of the coordinate system. + +\begin{figure}[H] + \centering + \inputtikz[.7]{bounding_box} + \caption{Bounding box example} + \label{fig:bounding-box} +\end{figure} + +To get the four coordinates that compose, we just perform a linear scan through +all the points that compose a polygon, record the minimum and maximum of both +they $x$ and $y$ coordinate. + +Once those points have been found, we just perform some basic axis-aligned +rectangle collision detection, which is much less computationally expensive than +checking each vertex-edge pair. + +The complexity of the collision detection algorithm went from $\mathcal{O}(n^2)$ +to $\mathcal{O}(n)$, where $n$ is the total number of vertices across all +polygons in the simulation. + + +\subsection{Known issues} + +The simulation has one major flaw, and it is inherent to the last part of +section \ref{sub:implementation-collision-detection} where we talk about the +\lstinline{overlap} vector: we said that this vector allows to displace both +polygons so that and the end of the collision resolution, they are not +overlapping anymore. This was done to avoid issues where the collision +resolution had taken place in one frame, but the polygons were still overlapping +in the following frame, which lead to polygons getting stuck together. + +The unfortunate consequence of such a decision is that, when we start playing +around with the restitution coefficient and all the shapes start falling to the +ground, the shapes are not able to rest still. Since there is gravity, at each +frame their speed get updated to simulate its effect, but since they are lying +on the floor, the collision detection algorithm kicks in right away, resulting +in the polygon getting pushed completely up, since the ground has infinite mass. +This results in the polygon bouncing on the floor instead of lying down. diff --git a/tikzs/bounding_box.tikz b/tikzs/bounding_box.tikz new file mode 100644 index 0000000..00857c2 --- /dev/null +++ b/tikzs/bounding_box.tikz @@ -0,0 +1,71 @@ +\begin{tikzpicture} + \begin{pgfonlayer}{nodelayer} + \node [style=none] (0) at (0, -1) {}; + \node [style=none] (1) at (0, 8) {}; + \node [style=none] (2) at (-1, 0) {}; + \node [style=none] (3) at (15, 0) {}; + \node [style=none] (4) at (4, 4) {}; + \node [style=none] (5) at (2, 1) {}; + \node [style=none] (6) at (6, 3) {}; + \node [style=none] (7) at (9, 3) {}; + \node [style=none] (8) at (11, 2) {}; + \node [style=none] (9) at (10.5, 6.5) {}; + \node [style=none] (10) at (12.75, 5.75) {}; + \node [style=none] (11) at (13.5, 3.5) {}; + \node [style=none] (12) at (8, 5) {}; + \node [style=none] (13) at (2, 4) {}; + \node [style=none] (14) at (6, 1) {}; + \node [style=none] (15) at (6, 4) {}; + \node [style=none] (16) at (8, 2) {}; + \node [style=none] (17) at (8, 6.5) {}; + \node [style=none] (18) at (13.5, 6.5) {}; + \node [style=none] (19) at (13.5, 2) {}; + \node [style=none] (20) at (2, 0) {}; + \node [style=none] (21) at (6, 0) {}; + \node [style=none] (22) at (0, 4) {}; + \node [style=none] (23) at (0, 1) {}; + \node [style=none] (24) at (-0.25, 1) {$A_{y_{\min}}$}; + \node [style=none] (25) at (-0.25, 4) {$A_{y_{\max}}$}; + \node [style=none] (26) at (2, -0.25) {$A_{x_{\min}}$}; + \node [style=none] (27) at (6, -0.25) {$A_{x_{\max}}$}; + \node [style=none] (28) at (8, 0) {}; + \node [style=none] (29) at (8, -0.25) {$B_{x_{\min}}$}; + \node [style=none] (30) at (13.5, 0) {}; + \node [style=none] (31) at (13.5, -0.25) {$B_{x_{\max}}$}; + \node [style=none] (32) at (0, 2) {}; + \node [style=none] (33) at (-0.25, 2) {$B_{y_{\min}}$}; + \node [style=none] (34) at (0, 6.5) {}; + \node [style=none] (35) at (-0.25, 6.5) {$B_{y_{\max}}$}; + \node [style=none] (36) at (4, 2.75) {$A$}; + \node [style=none] (37) at (10.5, 4.5) {$B$}; + \end{pgfonlayer} + \begin{pgfonlayer}{edgelayer} + \draw [style=Vector] (0.center) to (1.center); + \draw [style=Vector] (2.center) to (3.center); + \draw (5.center) to (4.center); + \draw (4.center) to (6.center); + \draw (6.center) to (5.center); + \draw (12.center) to (9.center); + \draw (9.center) to (10.center); + \draw (10.center) to (11.center); + \draw (11.center) to (8.center); + \draw (8.center) to (7.center); + \draw (7.center) to (12.center); + \draw [style=Dashed] (13.center) to (5.center); + \draw [style=Dashed] (5.center) to (14.center); + \draw [style=Dashed] (14.center) to (15.center); + \draw [style=Dashed] (15.center) to (13.center); + \draw [style=Dashed] (16.center) to (17.center); + \draw [style=Dashed] (17.center) to (18.center); + \draw [style=Dashed] (18.center) to (19.center); + \draw [style=Dashed] (19.center) to (16.center); + \draw [style=Dotted] (19.center) to (30.center); + \draw [style=Dotted] (16.center) to (28.center); + \draw [style=Dotted] (16.center) to (32.center); + \draw [style=Dotted] (13.center) to (22.center); + \draw [style=Dotted] (17.center) to (34.center); + \draw [style=Dotted] (5.center) to (20.center); + \draw [style=Dotted] (5.center) to (23.center); + \draw [style=Dotted] (14.center) to (21.center); + \end{pgfonlayer} +\end{tikzpicture}