\section{Formes géométriques}
Dans cette section, nous allons vous présenter les 2 formes géométriques que nous avons ajoutées à la librairie, à savoir : 
\begin{enumerate}
	\item \textit{G6faces} : une figure géométrique convexe à 6 faces et donc ayant pour bases des quadrilatères convexes étant au moins des parallélogrammes.
	\item \textit{Gcylinder} : un cylindre de révolution.
\end{enumerate}	

Dans les sous-sections qui vont suivre, nous allons présenter les détails non triviaux de l'implémentation (Représentation par facettisation pour le cylindre, calcul de la normale en un point et pour finir l'intersection).

\subsection{Représentation d'un \texttt{G6faces}}
Pour représenter un objet \texttt{G6faces}, nous utilisons simplement des objets \texttt{Gparallelog}. Ainsi, dans notre implémentation, la classe \texttt{G6faces} maintient une liste de 6 \texttt{Gparallelog}, représentant les 6 faces du \texttt{G6faces}. Au passage, nous ajustons la définition de 
chaque face afin que la normale soit orientée vers l'extérieur.

\subsection{Normale à un \texttt{G6faces}}
La normale est maintenant renvoyée lors de l'appel à la méthode qui demande la première intersection. Cependant, nous avons laissé accessible la méthode
pour récupérer la normale.
Vu qu'en règle générale, on la demande seulement lorsqu'on a confirmé qu'il y avait intersection, et vu qu'une instance de \texttt{G6faces} 
utilise 6 {\texttt{Gparallelog}} en tant que représentation, il suffit de demander sa normale à la dernière face qui a fait l'objet d'une intersection en appellant la méthode correspondante du {\textit{Gparallelog}} concerné.

\subsection{Intersection avec un \texttt{G6faces}}
L'algorithme est relativement simple, vu que comme il a déjà été mentionné plus haut, cette figure utilise des instances de la classe 
\texttt{Gparallelog} pour représentation. Il suffira donc de parcourir la liste des instances de \texttt{Gparallelog} et de déterminer s'il y a intersection et de déterminer, parmi les intersections trouvées, celle se trouvant le plus près du point de départ du rayon.

\subsection{Représentation d'un \texttt{Gcylinder}}
Dans cette sous-section, nous allons expliquer comment nous représentons un cylindre. Nous allons d'abord rappeller brièvement la défintion d'un cylindre, puis nous expliquerons la méthode utilisée dans notre implémentation pour la construction en elle-même.

\paragraph{Remarque:}
Pour représenter un cylindre, nous nous sommes inspirer de la méthode décrite dans le livre [2] de la liste des références en fin de ce rapport. La plupart des explications, développements mathématiques ou schéma de cette sous-section proviennent de ce livre.

\subsubsection{Définition d'un cylindre de révolution}
En mathématique, un cylindre de révolution est une surface infinie, qui peut être définie par la donnée d'un axe et d'un rayon.\\
Soit $D$ une droite dans l'espace et $r \in \mathcal{R}_+^*$ un nombre réel strictement positif. Le cylindre de révolution d'axe $D$ et de rayon $r$ est constitué de l'ensemble des points de $\mathcal{R}^3$
qui sont situés à une distance $r$ de la droite $D$. Pour la représentation, nous définirons d'abord le cylindre comme ayant un axe de rotation coïncidant avec le troisième axe de coordonnées $\mathcal{O}_z$. Nous obtiendrons le cylindre final par l'application de transformations géométriques (translation et rotations, telles que nous les avons vues au cours).

\paragraph{}
Ainsi, un cylindre de révolution dont l'axe coïncide avec l'axe $Z$ admet une équation de la forme :
\begin{equation}
	x^2 + y^2 = r^2
\end{equation}
Enfin, les cylindres que nous représentons sont limités en hauteur. Un autre paramètre à prendre en compte dans la définition du cylindre sera donc également sa hauteur 
$h \in \mathcal{R}_+^*$.

\subsubsection{Méridiens sur un cylindre de révolution}
Les méridiens sur un cylindre de révolution de rayon $r$ et de hauteur $h$ sont les segments de droite, contenus dans le corps du cylindre, de longueur $h$ et parallèles à l'axe $Z$. Comme on peut le voir sur la figure ci-dessous, un tel segment est identifié par un certain angle $\theta_0$, avec $\theta_0 \in \left[0,2\pi\right]$.

\begin{center}
\includegraphics[width=210px]{./img/infographie_cyl1.png}
\end{center}

\subsubsection{Facettisation d'un cylindre de révolution}
Dans notre implémentation, nous avons choisi d'approximer un cylindre de révolution par un polyèdre.\\

L'idée est la suivante : étant donné un nombre de méridiens $m$ (dans notre implémentation, nous avons fixé ce nombre à 32), nous allons considérer des méridiens $\mathcal{M}_i$ d'angle $\theta_i$ pour $i=0,...m$ régulièrement disposés sur le corps du cylindre. Nous construirons ensuite une facette rectangulaire entre les méridiens $\mathcal{M}_i$ et $\mathcal{M}_{i+1}$ pour $i=0,...,m-1$. Nous construirons enfin deux facettes pour les faces haut et bas du cylindre.\\

\begin{center}
\includegraphics[width=200px]{./img/infographie_cyl2.png}
\end{center}

\paragraph{}
Pour construire les différentes facettes du polyèdre approximant le cylindre, nous avons besoin de connaitre tous les sommets de ce polyèdre. Nous expliquons dans le cadre ci-dessous une méthode à utiliser, et qui est celle que nous avons implémentée dans notre projet.

\begin{center}
\fbox{
	\begin{minipage}{.9\linewidth}
		Nous allons construire $4m+2$ sommets. Considérons les angles :
		\begin{equation}
			\theta_i = 2 \pi \dfrac{i}{m}
		\end{equation}
		pour  i = 0, ..., m. Avec une telle variation pour $i$, l'angle $\theta_i$ varie régulièrement entre 
		$0$ et $2\pi$. Soit $\mathcal{M}_i$ le méridiant d'angle $\theta_i$.
		
		Nous construisons tout d'abord la liste des sommets du polyèdre.\\ 
		\begin{itemize}
			\item Pour $i = 0,...,m$, on définir le sommet $P_i$ comme le point du méridien $\mathcal{M}_i$ 
			qui est à la hauteur $-\frac{h}{2}$, et de coordonnées cartésiennes suivantes:
			\begin{equation}
				P_i = \left( r \cos(\theta_i) , r\sin(\theta_i) , -\dfrac{h}{2}\right)
			\end{equation}
			\item Pour $i = m+1,...2m+1$, on définit le sommet $P_i$ comme le point de méridien 
			$\mathcal{M}_{i-(m+1)}$ qui est à la hauteur $+\frac{h}{2}$, et de coordonnées cartésiennes 
			suivantes:
			\begin{equation}
				P_i = \left( r \cos(\theta_{i-(m+1)}) , r\sin(\theta_{i-(m+1)}) , +\dfrac{h}{2}\right)
			\end{equation}			
		\end{itemize}
		Les sommets de la face du haut et de la face du bas du cylindre ne doivent pas être confondus avec 
		les sommets du corps du cylindre. Pour cette raison, bien que ces sommets aient la même position 
		dans l'espace, nous leur donnons des numéros différents :\\
		\begin{itemize}
			\item Pour $i = 2m+2,...,3m+1$, le sommet $P_i$ (de la face du bas) équivaut au sommet 
			$P_{i-(2m+2)}$.
			\item Pour $i = 3m+2,...,4m+1$, le sommet $P_i$ (de la face du haut) équivaut au sommet 
			$P_{i-(3m+2)}$.			
		\end{itemize}
	\end{minipage}
}
\end{center}
Une fois que tous les sommets sont calculés, il ne reste plus qu'à les utiliser pour construire les $m$ facettes du cylindre qui sont comprises entre deux méridiens successifs $\mathcal{M}_{i}$ et $\mathcal{M}_{i+1}$, puis la facette du bas et la facette du haut.\\
Pour représenter les facettes entre deux méridiens successifs, nous utilisons un ensemble d'objets {\tt Gparallelog} tandis que pour les faces du haut et du bas, des {\tt Gpolygon}.

\subsubsection{Rotation du cylindre}
Une fois le cylindre construit, il faut éventuellement les faire pivoter dans une certaine orientation. En effet, pour rappel, nous avons considéré jusqu'ici un cylindre de révolution dont l'axe coïncide avec l'axe $Z$. Dans ce but, nous avons implémenté trois nouvelles fonctions pour la rotation
dans la classe \texttt{point\_t} : \textit{rotateX()} , \textit{rotateY()} et \textit{rotateZ()}, qui appliquent une rotation à un point selon l'axe $X$, $Y$ ou $Z$, respectivement, ainsi qu'une méthode de translation d'un point par un vecteur de coordonnées $(x,y,z)$. Nous avons implémenté les trois premières transformations en utilisant simplement les matrices de rotations vues au cours théorique.

\subsection{Calcul de la normale à un \textit{Gcylinder} (en un point) }
Le calcul de la normal est simplement celui de la face correspondante au point d'intersection entre le rayon et le {\tt Gcylindre}.
\subsection{Calcul de l'intersection entre un rayon et un \textit{Gcylinder}}
Ce calcul consiste simplement en l'appel des méthodes d'intersections des différents faces composants le {\tt Gcylindre} (pour rappel, ces faces sont elles-même des objets {\tt Gpolygon} ou {\tt Gparallelog}), et parmis toutes les intersections trouvées, nous renvoyons celle qui est la plus proche du point de départ du rayon.
