\section{Formes géométriques planes}
Dans cette section, nous allons présenter les 3 types de formes géométriques planes que nous avons ajoutées à la librairie, à savoir : 
\begin{itemize}
	\renewcommand{\labelitemi}{>}
	\item un triangle ;
	\item un parallélogramme.
	\item un polygone convexe
\end{itemize}

Dans les sous-sections qui vont suivre, nous ne présenterons que les éléments réellement importants de l'implémentation, c'est-à-dire la méthode utilisée pour renvoyer un vecteur normal au plan (même si cela s'avère relativement trivial) ainsi que les méthodes d'intersection.

\subsection{Vecteur normal au plan}
Vu que nous disponsons d'une liste de côtés, il est aisé d'en extraire deux vecteurs directeurs, soient $v_1$ et $v_2$. Le vecteur normal au plan décrit par 
la figure géométrique est le résultat du produit vectoriel de ces deux vecteurs, soit : 
 	\begin{equation}
 		N = v_1 \times v_2
 	\end{equation}

\subsection{Intersection entre un rayon et un triangle}
L'algorithme que nous avons implémenté est basé sur [3]. 
\paragraph{}
Un rayon lumineux ne fait jamais que définir une demi-droite. Une droite peut être définie paramétriquement ou vectoriellement. Dans le second cas, on aura une équation 
du type : 
 	\begin{equation}
		R(t) = O + tD
 	\end{equation}
où $R$ est le nom de la droite (ici, celle définie par le rayon), $O$ représente l'origine du rayon, i.e. la position de la source lumineuse et $D$ représente le vecteur directeur de $R$ i.e. la direction empruntée par le rayon lumineux.

\paragraph{}
Soit $R(t)$ un rayon lumineux, soit $P_1$,$P_2$,$P_3$ trois points de l'espace non alignés, qui définissent donc un triangle. Nous allons chercher l'intersection entre $R(t)$ et ce triangle.

Si nous retournons dans le cours de géométrie de M. Lecomte, nous pouvons y voir définies les coordonnées barycentriques. Nous allons les utiliser pour définir le fait suivant : 
\begin{center}
	\fbox{
		\begin{minipage}{.6\linewidth}
			Tout point $T(u,v)$ est intérieur au triange $P_1P_2P_3$ si et seulement si 
			\begin{equation}
				T(u,v) = (1 - u - v) P_1 + u P_2 + v P_3
			\end{equation}
			où $(u,v)$ sont les coordonnées barycentriques de $T$ et doivent respecter les conditions suivantes :
			\begin{itemize}
				\item $u,v \geq 0$
				\item $u + v \leq 1$
			\end{itemize}
		\end{minipage}
	}
\end{center}

Nous cherchons à déterminer s'il existe une intersection entre $R(t)$ et le triangle. Cela se traduit par la recherche de l'existence d'un point $T$ tel que :
\begin{equation}
	R(t) = T(u,v)
\end{equation}
Ce qu'on peut réécrire 
\begin{equation}
	O + tD = (1 - u - v) P_1 + u P_2 + v P_3
\end{equation}
Ou encore sous forme matricielle par bloc : 
\begin{equation}
	\label{eq::interTrBloc}
	\left[ -D , P_2 - P_1 , P_3 - P_1 \right] 
		\left[
			\begin{tabular}{c}
				$t$ \\
				$u$\\
				$v$\\
			\end{tabular}
		\right]
	= O - P_1
\end{equation}
Posons $V_1 = P_2 - P_1$ , $V_2 = P_3 - P_1$ et $T = O - P_1$. La solution à l'équation (\ref{eq::interTrBloc}) est obtenue par la résolution d'un système 
\begin{center}
	$A_{3\mathtt{x}3} \ x_{3\mathtt{x}1} = b_{3\mathtt{x}1}$
\end{center}
par l'utilisation de la méthode de Cramer par exemple qui consiste en l'assignation suivante : 
\begin{equation}
	\label{eq::solInterTriangle}
		\left[
			\begin{tabular}{c}
				$t$ \\
				$u$\\
				$v$
			\end{tabular}
		\right]
	= \dfrac{1}{\det{A}} 
		\left[
			\begin{tabular}{c}
				$\det\left(\left[T,V_1,V_2\right]\right)$\\
				$\det\left(\left[-D,T,V_2\right]\right)$\\
				$\det\left(\left[-D,V_1,T\right]\right)$
			\end{tabular}
		\right]
\end{equation}

\paragraph{Rappel d'algèbre linéaire}
\begin{equation}
	\det \left( \left[A , B , C \right] \right) = - (A \times C) \bullet B = - (C \times B) \bullet A
\end{equation}

On peut donc réécrire l'équation (\ref{eq::solInterTriangle}) comme suit : 
\begin{equation}
	\label{eq::solInterTriangle2}
		\left[
			\begin{tabular}{c}
				$t$ \\
				$u$\\
				$v$
			\end{tabular}
		\right]
	= \dfrac{1}{\left( D \times V_2 \right) \bullet V_1} 
		\left[
			\begin{tabular}{c}
				$\left( T \times V_1 \right) \bullet V_2$\\
				$\left( D \times V_2 \right) \bullet T$\\
				$\left( T \times V_1 \right) \bullet D$
			\end{tabular}
	 	\right]
	= \dfrac{1}{P \bullet V_1} 
		\left[
			\begin{tabular}{c}
				$Q \bullet V_2$\\
				$P \bullet T$\\
				$Q \bullet D$
			\end{tabular}
		\right]
\end{equation}
en posant $P = \left( D \times V_2 \right)$ et $Q = \left( T \times V_1 \right)$
\subsection{Intersection avec un parallélogramme}
La méthode est relativement similaire à celle du triangle : les concepts utilisés sont les mêmes, à savoir la détermination des coordonnées barycentriques $u$ et 
$v$. 

\begin{center}
	\fbox{
		\begin{minipage}{.6\linewidth}
			Tout point $T(u,v)$ est intérieur au parallélogramme $P_1P_2P_3P_4$ si et seulement si 
			\begin{equation}
				T(u,v) = (1 - u - v) P_1 + u P_2 + v P_3
			\end{equation}
			où $(u,v)$ sont les coordonnées barycentriques de $T$ et doivent respecter les conditions suivantes :
			\begin{itemize}
				\item $u,v \geq 0$
				\item $u \leq 1$ et $v \leq 1$
			\end{itemize}
			En particulier, on a : 
			\begin{equation}
				P_4 = P_2 + P_3
			\end{equation}
		\end{minipage}
	}
\end{center}
La seule différence avec l'algorithme appliqué au triangle sera donc la comparaison des valeurs de $u$ et $v$.
\subsection{Intersection avec un polygone convexe}
Vu que nous avons cherché non pas à avoir un polygone spécifique mais bien un polygone convexe quelconque, il nous a donc fallu trouver un moyen de rester général pour la méthode d'intersection. En fait, elle requière un traitement préalable qui est fait lors de l'instanciation.

\paragraph{}
Ce traitement préalable consiste à découper le polygone en un ensemble de triangles. Nous discuterons de la méthode ci-dessous. L'intersection revient alors à 
tester l'intersection du rayon avec tous les triangles qui auront été créés à l'instanciation. 

\paragraph{}
Pour ce qui est de l'algorithme utilisé pour le découpage en triangle, il est purement sorti de notre imagination et consiste à utiliser le \textit{design pattern} appelé \textbf{Divide and conqueer} [1] qui consiste à réduire un problème complexe en un ensemble de problèmes plus simples en utilisant la récursion à bon escient.

\begin{center}
	\fbox{
		\begin{minipage}{.8\linewidth}
			Soit $N$ le nombre de sommets qui composent le polygone. Dans la structure, on commence à compter les sommets à $0$. Cependant,
			ce sommet constituera le point commun entre tous les triangles. Nous appellerons donc une procédure récursive avec comme paramètres initiaux 
			$(1,N-1)$.
			Dans la suite, le paramètre de gauche sera appelé {\tt start} et le paramètre de droite {\tt end}. 
			\begin{enumerate}
				\item Calculer {\tt diff = end - start}.
				\item Si {\tt diff} vaut 1, nous avons un triangle constitué des sommets $0$, {\tt start} et {\tt end}.
				\item Sinon, calculer le "pas" comme étant la division entière de {\tt diff} par 2 : {\tt step = diff / 2} 
				\item Appeler la procédure récursive avec comme paramètres ({\tt start} , {\tt start+step})
				\item Appeler la procédure récursive avec comme paramètres ({\tt start+step},{\tt end})
			\end{enumerate}
		\end{minipage}
	}
\end{center}
Une autre technique aurait pu être implémentée : vu que le polygône est convexe, son centre de gravité se trouve forcément à l'intérieur du polygone. Il aurait suffit de relier ce point avec chaque côté du polygone, nous avons préféré jouer le coup de l'originalité.