Final rapport
This commit is contained in:
parent
c26d3db76d
commit
f7ab561364
BIN
rapport/RapportConceptionLogiciel_Lsysteme.pdf
Normal file
BIN
rapport/RapportConceptionLogiciel_Lsysteme.pdf
Normal file
Binary file not shown.
@ -14,11 +14,11 @@ Après lecture des consignes, nous avons pu entamer nos recherches.
|
|||||||
|
|
||||||
\section{Mise en place du projet}
|
\section{Mise en place du projet}
|
||||||
\label{sec:MEPprog}
|
\label{sec:MEPprog}
|
||||||
Nos recherches se sont premièrement portées sur le L-Système (principalement sur Wikipedia\footnote{\href{https://en.wikipedia.org/wiki/L-system}{https://en.wikipedia.org/wiki/L-system}}) pour comprendre son fonctionnement nous donnant des informations sur comment construire notre parser et notre moteur de réécriture. Nous nous sommes ensuite renseigné sur les différents moteurs de rendu graphique que nous pouvions utiliser et notre choix s'est finalement porté sur JOGL (Java Open Graphics Library \footnote{\href{https://jogamp.org/jogl/www/}{https://jogamp.org/jogl/www/}}) qui était conseillé dans la liste des sujets, pouvant gérer un rendu 2D et un rendu 3D.
|
Nos recherches se sont premièrement portées sur le L-Système (principalement sur Wikipedia\footnote{\href{https://en.wikipedia.org/wiki/L-system}{https://en.wikipedia.org/wiki/L-system}}) pour comprendre son fonctionnement et nous donner des informations sur la construction de notre parser et de notre moteur de réécriture. Nous nous sommes ensuite renseignés sur les différents moteurs de rendu graphique que nous pouvions utiliser et notre choix s'est finalement porté sur JOGL (Java Open Graphics Library \footnote{\href{https://jogamp.org/jogl/www/}{https://jogamp.org/jogl/www/}}) qui était conseillé dans la liste des sujets, pouvant gérer un rendu 2D et un rendu 3D.
|
||||||
\\
|
\\
|
||||||
\\
|
\\
|
||||||
Suite à cela, nous avons réfléchi à la structure de notre code, ainsi qu'à une première ébauche sur laquelle nous pourrions nous baser pour débuter notre projet et un ordre de priorités ; certaines parties étant nécessaires pour que d'autres fonctionnent ou puissent être amorcées (comme le parser, les bases du système de réécriture ou encore les différents moteurs de rendu).
|
Suite à cela, nous avons réfléchi à la structure de notre code, ainsi qu'à une première ébauche sur laquelle nous pourrions nous baser pour débuter notre projet et un ordre de priorités; certaines parties étant nécessaires pour que d'autres fonctionnent ou puissent être amorcées (comme le parser, les bases du système de réécriture ou encore les différents moteurs de rendu).
|
||||||
\\
|
\\
|
||||||
Puis, pour terminer notre mise en place, nous avons décidé que nous rajouterions une interface ainsi qu'une fenêtre d'aide a notre futur logiciel dans le but de faciliter son utilisation.
|
Puis, pour terminer notre mise en place, nous avons décidé que nous rajouterions une interface ainsi qu'une fenêtre d'aide à notre futur logiciel dans le but de faciliter son utilisation.
|
||||||
|
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ Ce système de réécriture fonctionne par le biais de plusieurs spécificités
|
|||||||
\item Un axiome : il représente le point de départ, l'état initial du système.
|
\item Un axiome : il représente le point de départ, l'état initial du système.
|
||||||
\item Des règles de réécriture : elles définissent les règles de développement du L-Système en utilisant l'alphabet donné dans le but de créer un mot.
|
\item Des règles de réécriture : elles définissent les règles de développement du L-Système en utilisant l'alphabet donné dans le but de créer un mot.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
En additionnant tous ces aspects, nous obtenons alors notre L-Système, commençant par l'axiome étant la base, puis, créant au fur et à mesure un mot grâce aux règles données (Dans la limite du nombre d'itérations imposés \footnote{Le nombre d'itérations ou nombre de générations correspond au nombre de réécritures de l'axiome pour obtenir le mot final}), tout ceci étant possible grâce à l'alphabet qui les composes.
|
En additionnant tous ces aspects, nous obtenons alors notre L-Système, commençant par l'axiome étant la base, puis, créant au fur et à mesure un mot grâce aux règles données (Dans la limite du nombre d'itérations imposés \footnote{Le nombre d'itérations ou nombre de générations correspond au nombre de réécritures de l'axiome pour obtenir le mot final}), tout ceci étant possible grâce à l'alphabet qui les composent.
|
||||||
Ce mot passera ensuite par un moteur graphique dans le but d'être modélisé.
|
Ce mot passera ensuite par un moteur graphique dans le but d'être modélisé.
|
||||||
|
|
||||||
\section{Notre L-Système}
|
\section{Notre L-Système}
|
||||||
@ -22,14 +22,14 @@ Ce mot passera ensuite par un moteur graphique dans le but d'être modélisé.
|
|||||||
Notre alphabet est composés de plusieurs règles et constantes :\\
|
Notre alphabet est composés de plusieurs règles et constantes :\\
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item X permet de dessiner une branche et Y de ne rien dessiner, ils permettent avec certaines règles de contrôler l'évolution de notre L-Système.
|
\item X permet de dessiner une branche et Y de ne rien dessiner, ils permettent avec certaines règles de contrôler l'évolution de notre L-Système.
|
||||||
\item Il est possible de modifier l'angle d'une branche en utilisant par exemple les +, -, -35, +64y, qui donnera respectivement une orientation de 25° et -25° sur l'axe de rotation x, une rotation de -35° sur l'axe X et une orientation de 64° sur l'axe de rotation y ; il n'est pas possible de modifier l'orientation de l'axe de rotation Z.
|
\item Il est possible de modifier l'angle d'une branche en utilisant par exemple les +, -, -35, +64y, qui donnera respectivement une orientation de 25° et -25° sur l'axe de rotation x, une rotation de -35° sur l'axe X et une orientation de 64° sur l'axe de rotation y; il n'est pas possible de modifier l'orientation de l'axe de rotation Z.
|
||||||
\result{Exemple : +XYX appliquera une rotation de 25° a X et aucune à Y et au 2ème X}
|
\result{Exemple : +XYX appliquera une rotation de 25° a X et aucune à Y et au 2ème X}
|
||||||
\item Enfin il est possible d'utiliser les crochets [] pour contrôler l'évolution et obtenir des branches à vos arbres. Ces crochets vont conserver l'état, c’est-à-dire qu'une rotation appliquée aux crochets s'appliquera a tous les éléments étant à l'intérieur des crochets. Il est possible d'imbriquer des crochets.\\
|
\item Enfin il est possible d'utiliser les crochets [] pour contrôler l'évolution et obtenir des branches à vos arbres. Ces crochets vont conserver l'état, c’est-à-dire qu'une rotation appliquée aux crochets s'appliquera a tous les éléments étant à l'intérieur des crochets. Il est possible d'imbriquer des crochets.\\
|
||||||
\result{Exemple : +[XYX] appliquera une rotation de 25° à XYX.}
|
\result{Exemple : +[XYX] appliquera une rotation de 25° à XYX.}
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
\subsection{Axiome, règles de réécritures et nombre d'itérations}
|
\subsection{Axiome, règles de réécritures et nombre d'itérations}
|
||||||
Pour l'axiome, les règles de réécritures et le nombre d'itérations, ils seront définis par l'utilisateur dans les zones de textes de l'interface prévus a cet effet.
|
Pour l'axiome, les règles de réécritures et le nombre d'itérations, ils seront définis par l'utilisateur dans les zones de textes de l'interface prévues a cet effet.
|
||||||
Un bouton "Aide" est présent sur cette même interface aidant à comprendre et mettre en place le L-Système.
|
Un bouton "Aide" est présent sur cette même interface aidant à comprendre et mettre en place le L-Système.
|
||||||
|
|
||||||
\begin{figure}[h!]
|
\begin{figure}[h!]
|
||||||
|
@ -1,15 +1,27 @@
|
|||||||
\chapter{Organisation et structure}
|
\chapter{Organisation et structure}
|
||||||
|
|
||||||
\section{Organisation du sujet}
|
\section{Organisation du sujet}
|
||||||
|
|
||||||
|
\subsection{Ordre de priorité}
|
||||||
L'organisation du projet a été soumit a un ordre de priorité car, comme cité dans "Mise en place du projet" (voir section \ref{sec:MEPprog}), certaines parties étaient nécessaires pour que d'autres fonctionnent ou puissent être amorcées :
|
L'organisation du projet a été soumit a un ordre de priorité car, comme cité dans "Mise en place du projet" (voir section \ref{sec:MEPprog}), certaines parties étaient nécessaires pour que d'autres fonctionnent ou puissent être amorcées :
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item En premier lieu nous fallait créer l'alphabet de notre L-Système (voir section \ref{sec:Alphabet}).
|
\item La création de l'alphabet de notre L-Système (voir section \ref{sec:Alphabet}).
|
||||||
\item Mise en place de méthode Parser\#isCorrect() pour vérifier certains que la syntaxe du l-système est correcte.
|
\item La mise en place de la vérification des termes contenus dans les règles et l'axiome.
|
||||||
\item Mise en place d'un moteur de réécriture.
|
\item La création du moteur de réécriture.
|
||||||
\item Mis en place d'un parser qui transforme le mot obtenu par le moteur de réécriture en une structure de données plus facilement lisible afin d'être afficher par le moteur graphique.
|
\item La mise en place du Parser qui transforme le mot obtenu par le moteur de réécriture en une structure de données plus facilement lisible; afin d'être affichée par le moteur graphique.
|
||||||
\item affichage du L-Système dans le moteur graphique
|
\item La création du moteur graphique.
|
||||||
|
\item Et, pour faciliter l'utilisation de notre code, la création d'une interface.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsection{Repartition des tâches}
|
||||||
|
L'ordre de priorité étant fixé, nous sommes passé à la répartition des tâches. La création de l'alphabet s'est premièrement effectuée ensemble.
|
||||||
|
\\
|
||||||
|
Ensuite nous nous sommes répartis les tâches, Arthur et Quentin travaillant sur le Parser, Antonin et Thomas commençant à faire des recherches sur le moteur graphique que nous pourrions utiliser.
|
||||||
|
\\
|
||||||
|
Après cela, Quentin passa à la création du moteur graphique,aidé d'Arthur pour le déplacaement de la caméra, Antonin finalisant le Parser, Arthur et Thomas créant l'interface. Une fois toutes les parties principales créées et avancées, tout le monde a travaillé dans l'amélioration de celles-ci.
|
||||||
|
\\
|
||||||
|
Pour finir, la création du rapport s'est effectuée, elle aussi, en groupe.
|
||||||
|
|
||||||
\section{Structure du projet}
|
\section{Structure du projet}
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item engine
|
\item engine
|
||||||
@ -19,13 +31,13 @@ L'organisation du projet a été soumit a un ordre de priorité car, comme cité
|
|||||||
\end{itemize}
|
\end{itemize}
|
||||||
\item screen
|
\item screen
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item gl3d: Tout les objets relatifs a l'affichage 3d du L-Systeme, voir la section \ref{sec:interface3d}
|
\item Gl3d : Tout les objets relatifs a l'affichage 3d du L-Systeme, voir la section \ref{sec:interface3d}
|
||||||
\item main: Tout les objets relatifs au menu, voir la section \ref{sec:menu}
|
\item Main : Tout les objets relatifs au menu, voir la section \ref{sec:menu}
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
\item utils: contient l'objet Pair qui est essentiel au fonctionnement du projet
|
\item utils: contient l'objet Pair qui est essentiel au fonctionnement du projet
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
\begin{figure}[h!]
|
\begin{figure}[ht]
|
||||||
\centering
|
\centering
|
||||||
\includegraphics[width=0.7\linewidth]{pics/diagram.png}
|
\includegraphics[width=0.7\linewidth]{pics/diagram.png}
|
||||||
\caption{Diagramme de classe de notre projet}
|
\caption{Diagramme de classe de notre projet}
|
||||||
|
@ -10,14 +10,16 @@ Le mot est réécrit en 2 temps :\\
|
|||||||
\item On remplace toutes les occurrences de \$\{identifiant de la règle\} par la règle associée.
|
\item On remplace toutes les occurrences de \$\{identifiant de la règle\} par la règle associée.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
On répète cette opération n fois, pour obtenir le mot final.\\
|
On répète cette opération n fois, pour obtenir le mot final.\\
|
||||||
|
\\
|
||||||
|
\\
|
||||||
|
\\
|
||||||
L'algorithme de réécriture est séparé en 3 parties:\\
|
L'algorithme de réécriture est séparé en 3 parties:\\
|
||||||
|
|
||||||
\begin{algorithm}
|
\begin{algorithm}
|
||||||
\DontPrintSemicolon
|
\DontPrintSemicolon
|
||||||
\KwIn{axiom: $String$, rules : $List[Tuple[String, String]$, recurrence: $Integer$}
|
\KwIn{axiom: $String$, rules : $List[Tuple[String, String]$, recurrence: $Integer$}
|
||||||
\KwOut{Le mot réécrit itérativement: $String$}
|
\KwOut{Le mot réécrit itérativement: $String$}
|
||||||
\caption{{\sc Rewrite} Fonction principale appelé par la fenêtre principale}
|
\caption{Rewrite Fonction principale appelée par la fenêtre principale}
|
||||||
$rewritten \gets \emptyset$\;
|
$rewritten \gets \emptyset$\;
|
||||||
\For{$i \gets 0$ \textbf{à} $recurrence$} {
|
\For{$i \gets 0$ \textbf{à} $recurrence$} {
|
||||||
$toRewrite \gets replaceRulesByID(rewritten, rules)$\;
|
$toRewrite \gets replaceRulesByID(rewritten, rules)$\;
|
||||||
@ -26,16 +28,16 @@ $rewritten \gets \emptyset$\;
|
|||||||
$rewritten = rewritten.replace("[", "Y[")$\;
|
$rewritten = rewritten.replace("[", "Y[")$\;
|
||||||
\Return{$rewritten$}\;
|
\Return{$rewritten$}\;
|
||||||
\end{algorithm}
|
\end{algorithm}
|
||||||
|
\newpage
|
||||||
\begin{algorithm}
|
\begin{algorithm}
|
||||||
\DontPrintSemicolon
|
\DontPrintSemicolon
|
||||||
\KwIn{rewritten: $String$, rules : $List[Tuple[String, String]$}
|
\KwIn{rewritten: $String$, rules : $List[Tuple[String, String]$}
|
||||||
\KwOut{Le mot partiellement réécrit}
|
\KwOut{Le mot partiellement réécrit}
|
||||||
\caption{{\sc replaceRulesByID} remplace les occurrences des différentes règles par \$\{id\}}
|
\caption{replaceRulesByID remplace les occurrences des différentes règles par \$\{id\}}
|
||||||
$toRewrite \gets rewritten$\;
|
$toRewrite \gets rewritten$\;
|
||||||
\For{$i \gets 0$ \textbf{à} $rules.size()$}{
|
\For{$i \gets 0$ \textbf{à} $rules.size()$}{
|
||||||
$pair \gets rules.get(i)$\;
|
$pair \gets rules.get(i)$\;
|
||||||
$toRwrite \gets toRewrite.replace(pair[0], "\$\{" + i + "\}")$\;
|
$toRewrite \gets toRewrite.replace(pair[0], "\$\{" + i + "\}")$\;
|
||||||
}
|
}
|
||||||
\Return{$toRewrite$}
|
\Return{$toRewrite$}
|
||||||
|
|
||||||
@ -45,7 +47,7 @@ $toRewrite \gets rewritten$\;
|
|||||||
\DontPrintSemicolon
|
\DontPrintSemicolon
|
||||||
\KwIn{toRewrite: $String$, rules : $List[Tuple[String, String]$}
|
\KwIn{toRewrite: $String$, rules : $List[Tuple[String, String]$}
|
||||||
\KwOut{Le mot entièrement réécrit}
|
\KwOut{Le mot entièrement réécrit}
|
||||||
\caption{{\sc replaceIDByRuleApplication} remplace les occurrences \$\{id\} par la définition des différentes règles}
|
\caption{replaceIDByRuleApplication remplace les occurrences \$\{id\} par la définition des différentes règles}
|
||||||
$rewritten \gets toRewrite$\;
|
$rewritten \gets toRewrite$\;
|
||||||
\For{$i \gets 0$ \textbf{à} $rules.size()$}{
|
\For{$i \gets 0$ \textbf{à} $rules.size()$}{
|
||||||
$rewritten \gets rewritten.replace("\$\{" + i + "\}", rules.get(i)[1]$\;
|
$rewritten \gets rewritten.replace("\$\{" + i + "\}", rules.get(i)[1]$\;
|
||||||
@ -59,11 +61,11 @@ $rewritten \gets rewritten.replace("\$\{" + i + "\}", rules.get(i)[1]$\;
|
|||||||
\label{sec:parser}
|
\label{sec:parser}
|
||||||
|
|
||||||
Le rôle du parser est à partir d'un mot réécrit par le moteur de réécriture de convertir celui-ci en une structure de données plus facilement manipulable afin de l'afficher dans le moteur graphique.
|
Le rôle du parser est à partir d'un mot réécrit par le moteur de réécriture de convertir celui-ci en une structure de données plus facilement manipulable afin de l'afficher dans le moteur graphique.
|
||||||
En appliquant les règles précédemment énoncé, il construit un arbre grâce la structure de données suivante
|
En appliquant les règles précédemment énoncées, il construit un arbre grâce à la structure de données suivante.
|
||||||
|
|
||||||
\begin{algorithm}
|
\begin{algorithm}
|
||||||
\DontPrintSemicolon
|
\DontPrintSemicolon
|
||||||
\caption{{\sc Element} Branche de l'arbre, si parent est vide alors, cet element est la racine}
|
\caption{Element Branche de l'arbre, si parent est vide alors, cet élément est la racine}
|
||||||
\Struct{Element}{
|
\Struct{Element}{
|
||||||
propery: $ElementProperty$ \Comment{enumérateur, valeurs possibles: $DRAW$ ou $NOTHING$}\;
|
propery: $ElementProperty$ \Comment{enumérateur, valeurs possibles: $DRAW$ ou $NOTHING$}\;
|
||||||
parent: $Element$\;
|
parent: $Element$\;
|
||||||
@ -76,10 +78,16 @@ children: $List[Element]$\;
|
|||||||
\section{Moteur graphique}
|
\section{Moteur graphique}
|
||||||
\label{sec:interface3d}
|
\label{sec:interface3d}
|
||||||
|
|
||||||
Nous utilisons Java OpenGL pour afficher une fenêtre 3D, gl2 pour afficher les lignes de la grille, glu pour placer la caméra et GLUT pour afficher les cylindres.\\
|
Nous utilisons \Java \ OpenGL pour afficher une fenêtre 3D, gl2 pour afficher les lignes de la grille, glu pour placer la caméra et GLUT pour afficher les cylindres.\\
|
||||||
Pour naviguer dans l'espace 3D, voir la section \ref{sec:nav_3d}.\\
|
Pour naviguer dans l'espace 3D, voir la section \ref{sec:nav_3d}.\\
|
||||||
Pour afficher le L-Système nous utilisons une méthode récursive.
|
Pour afficher le L-Système nous utilisons une méthode récursive.
|
||||||
|
|
||||||
|
Les classes GLKeyboardListener et GLMouseListener écoutent respectivement le clavier et la souris.\\
|
||||||
|
|
||||||
|
GLCanvas crée la fenêtre (grâce à AbstractCanvas), GLEventListener initialise et affiche l'environnement 3D.\\
|
||||||
|
|
||||||
|
DrawHelper est une classe utilitaire qui permet d'afficher certains éléments afin d'alléger la méthode display située dans GLEventListener.
|
||||||
|
|
||||||
\begin{figure}[h!]
|
\begin{figure}[h!]
|
||||||
\centering
|
\centering
|
||||||
\includegraphics[width=0.8\linewidth]{pics/3dGUI.png}
|
\includegraphics[width=0.8\linewidth]{pics/3dGUI.png}
|
||||||
@ -100,15 +108,20 @@ Pour afficher le L-Système nous utilisons une méthode récursive.
|
|||||||
|
|
||||||
\subsubsection{MainFrame}
|
\subsubsection{MainFrame}
|
||||||
|
|
||||||
\paragraph{La classe \classe{MainFrame}} est une classe héritant de la classe JFrame de \Swing. Elle permet de créer une fenêtre de base, de taille prédéfinie dans laquelle peuvent être placés des composants graphiques. Elle comprend aussi un bouton de fermeture qui, une fois cliqué, permet l'arrêt du programme.\\
|
\paragraph{La classe \classe{MainFrame}} est une classe héritant de la classe JFrame de \Swing. Elle permet de créer une fenêtre de base, de taille prédéfinie, dans laquelle peuvent être placés des composants graphiques. Elle comprend aussi un bouton de fermeture qui, une fois cliqué, permet l'arrêt du programme.\\
|
||||||
Elle comporte aussi une instance de la classe JTabbedPane \label{jtpane}, un conteneur graphique donc le but est de disposer ses composants sous la forme d'onglets.
|
Elle comporte aussi une instance de la classe JTabbedPane \label{jtpane}, un conteneur graphique dont le but est de disposer ses composants sous la forme d'onglets.
|
||||||
|
|
||||||
\subsubsection{Tab}
|
\subsubsection{Tab}
|
||||||
|
|
||||||
\paragraph{La classe \classe{Tab}} est une classe héritant de la classe JPanel de \Swing. JPanel est un composant de base dans lequel il est possible d'ajouter d'autres composants graphiques. Les intances de \classe{Tab} créées sont ensuite ajoutées par la classe \classe{MainFrame} à son composant de la classe JTabbedPane \ref{jtpane}.
|
\paragraph{La classe \classe{Tab}} est une classe héritant de la classe JPanel de \Swing. JPanel est un composant de base dans lequel il est possible d'ajouter d'autres composants graphiques. Les instances de \classe{Tab} créées sont ensuite ajoutées par la classe \classe{MainFrame} à son composant de la classe JTabbedPane \ref{jtpane}.
|
||||||
|
|
||||||
\subsubsection{Listener}
|
\subsubsection{Listener}
|
||||||
|
|
||||||
\paragraph{La classe \classe{Listener}} est une classe implémentant certaines classes Listener de \\\Swing (\classe{ActionListener, KeyListener et MouseWheelListener}). Elle permet de capter toutes les actions effectuées par l'utilisateur et d'appeler les méthodes correspondantes des classes de l'interface. Elle permet ainsi de créer de nouveaux onglets (Nouvelles instances de Tab) mais aussi d'en fermer ou bien encore de lancer la génération du modèle.
|
\paragraph{La classe \classe{Listener}} est une classe implémentant certaines classes Listener de \\\Swing (\classe{ActionListener, KeyListener et MouseWheelListener}). Elle permet de capter toutes les actions effectuées par l'utilisateur et d'appeler les méthodes correspondantes des classes de l'interface. Elle permet ainsi de créer de nouveaux onglets (Nouvelles instances de Tab) mais aussi d'en fermer ou bien encore de lancer la génération du modèle.
|
||||||
|
|
||||||
\section{Pair ou un tuple a 2 entrées en java}
|
\section{Pair ou un tuple a 2 entrées en java}
|
||||||
|
|
||||||
|
Nous avons utilisé les classes génériques afin de créer une classe nommé Pair, elle possède 2 paramètres génériques nous permettant de lui assigner des éléments de n'importe quel type.\\
|
||||||
|
Une fois instanciée avec ces 2 éléments, son contenu n'est plus modifiable, ce qui en fait un uplet à 2 éléments (couple).\\
|
||||||
|
Nous l'utilisons ici pour stocker les règles, la partie gauche du couple stocke le contenu qui va être remplacé dans l'axiome et la partie droite le remplaçant.\\
|
||||||
|
Nous l'utilisons seulement dans ce projet pour stocker des \string mais il est possible de stocker n'importe quelle instance d'un objet.
|
||||||
|
@ -3,20 +3,33 @@
|
|||||||
\section{Manuel d'utilisation}
|
\section{Manuel d'utilisation}
|
||||||
|
|
||||||
\subsection{Préambule}
|
\subsection{Préambule}
|
||||||
Notre application a été développée et pensée pour les versions de java supérieures ou égales à la version 8u281.
|
Notre application a été développé et pensé pour les versions de java supérieures ou égales à la version 8u281.
|
||||||
L'application fonctionne sur Linux avec une interface tournant sur les moteurs graphiques Xorg et Wayland et sur Windows 10.
|
L'application fonctionne sur Linux avec une interface tournant sur les moteurs graphiques Xorg et Wayland et sur Windows 10.
|
||||||
|
Notez que pour linux, notre programme ne fonctionne que pour openjdk 8
|
||||||
|
|
||||||
Les archives jar de Jogl doivent se trouver dans le dossier lib selon le modèle ci-dessous (image)
|
Les archives jar de Jogl doivent se trouver dans le dossier lib selon le modèle ci-dessous (image)
|
||||||
|
|
||||||
\info{Nous ne pouvons pas vous garantir si l'application fonctionne sur Mac OS X, aucun des membres de notre n'en possède un.}
|
\problem{Nous ne pouvons pas vous garantir si l'application fonctionne sur Mac OS X, aucun des membres de notre n'en possède un.}
|
||||||
|
|
||||||
\subsection{Lancement de l'application}
|
\subsection{Lancement de l'application}
|
||||||
|
|
||||||
Blablabla commande ant run blablabla
|
\info{Vous devez ouvrir un terminal à l'emplacement du dossier contenu le projet}
|
||||||
|
|
||||||
|
Pour lancer l'application, exécutez la commande \button{ant run}\\
|
||||||
|
|
||||||
|
Si vous souhaitez seulement compiler les fichiers sources dans le répertoire \textbf{bin/}, executez la commande: \button{ant compile}\\
|
||||||
|
|
||||||
|
Pour générer une archive jar dans le répertoire \textbf{build/}, executez la commande: \button{ant packaging}\\
|
||||||
|
|
||||||
|
Pour générer la javadoc dans le dossier \textbf{doc/}, executez la commande: \button{ant javadoc}\\
|
||||||
|
\info{Ouvrez ensuite le fichier \textbf{doc/index.html} ou \textbf{doc/overview-summary.html} dans un navigateur.}
|
||||||
|
|
||||||
|
Pour effectuer les tests, executez la commande: \button{ant tests}\\
|
||||||
|
\info{Un fichier \textbf{result.txt} sera générée affichant les résultats ainsi qu'une copie de la sortie standard.}
|
||||||
|
|
||||||
\subsection{Utilisation de l'interface utilisateur}
|
\subsection{Utilisation de l'interface utilisateur}
|
||||||
|
|
||||||
\paragraph{Une fois l'application lancée,} une fenêtre s'affiche \ref{mainframe}. Elle contient une barre de navigation grâce à laquelle vous pouvez ouvrir soit une nouvelle génération, soit une fenêtre d'aide, ainsi qu'un onglet de génération.
|
\paragraph{Une fois l'application lancée,} une fenêtre s'affiche (figure \ref{mainframe}). Elle contient une barre de navigation grâce à laquelle vous pouvez ouvrir soit une nouvelle génération, soit une fenêtre d'aide, ainsi qu'un onglet de génération.
|
||||||
\begin{figure}[h!]
|
\begin{figure}[h!]
|
||||||
\centering
|
\centering
|
||||||
\includegraphics[scale=0.5]{pics/MainFrameGUI.PNG}
|
\includegraphics[scale=0.5]{pics/MainFrameGUI.PNG}
|
||||||
@ -30,42 +43,61 @@ Il ne vous reste ensuite plus qu'à renseigner votre axiome, ainsi que vos règl
|
|||||||
\subsection{Navigation dans l'interface graphique en 3D}
|
\subsection{Navigation dans l'interface graphique en 3D}
|
||||||
\label{sec:nav_3d}
|
\label{sec:nav_3d}
|
||||||
|
|
||||||
Pour naviguer dans l'espace 3D, vous pouvez utiliser votre clavier ainsi que votre souris. \info{La souris n'est pas essentielle, le clavier suffit amplement}
|
Pour naviguer dans l'espace 3D, vous pouvez utiliser votre clavier ainsi que votre souris. \info{La souris n'est pas essentielle, elle permet de se déplacer facilement dans l'environnement mais un clavier suffit amplement}
|
||||||
|
|
||||||
\paragraph{Liste des commandes au clavier : }
|
\paragraph{Liste des commandes au clavier : }
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item \textbf{Z} $\xrightarrow{} Avancer$
|
\item \textbf{Z} $\xrightarrow{} Avancer$
|
||||||
\item \textbf{S} $\xrightarrow{} Reculer$
|
\item \textbf{S} $\xrightarrow{} Reculer$
|
||||||
\item \textbf{Q} $\xrightarrow{} Aller \ à \ gauche$
|
\item \textbf{Q} $\xrightarrow{} Aller \ \grave{a} \ gauche$
|
||||||
\item \textbf{D} $\xrightarrow{} Aller \ à \ droite$
|
\item \textbf{D} $\xrightarrow{} Aller \ \grave{a} \ droite$
|
||||||
\item \textbf{A} $\xrightarrow{} Tourner \ la \ caméra \ à \ gauche$
|
\item \textbf{A} $\xrightarrow{} Tourner \ la \ cam\Acute{e}ra \ \grave{a} \ gauche$
|
||||||
\item \textbf{E} $\xrightarrow{} Tourner \ la \ caméra \ à \ droite$
|
\item \textbf{E} $\xrightarrow{} Tourner \ la \ cam\Acute{e}ra \ \grave{a} \ droite$
|
||||||
\item \textbf{W} $\xrightarrow{} Prendre \ de \ la \ hauteur$
|
\item \textbf{W} $\xrightarrow{} Prendre \ de \ la \ hauteur$
|
||||||
\item \textbf{X} $\xrightarrow{} Perde \ de \ la \ hauteur$
|
\item \textbf{X} $\xrightarrow{} Perde \ de \ la \ hauteur$
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
\paragraph{Liste des commandes à la souris :}
|
\paragraph{Liste des commandes à la souris :}
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item \textbf{Mollette Avant} $\xrightarrow{} Zommer$
|
\item \textbf{Mollette Avant} $\xrightarrow{} Zommer$
|
||||||
\item \textbf{Mollette Arrière} $\xrightarrow{} Dézoomer$
|
\item \textbf{Mollette Arrière} $\xrightarrow{} D\Acute{e}zoomer$
|
||||||
\item \textbf{Clic Droit} $\xrightarrow{} Maintenir \ puis \ bouger \ la \ souris \ pour \ changer \ l'orientation \ de \ la \ caméra$
|
\item \textbf{Clic Droit} $\xrightarrow{} Maintenir \ puis \ bouger \ la \ souris \ pour \ changer \ l'orientation \ de \ la \ cam\Acute{e}ra$
|
||||||
|
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
\problem{Vous ne pouvez pas utiliser 2 touches ou plus en même temps pour naviguer. Par exemple, enfoncer les touches \textbf{Z} et \textbf{D} pour aller la direction nord-est est impossible, il vous faut tourner votre caméra dans la direction où vous voulez aller puis appuyer sur \textbf{Z}.}
|
\problem{Vous ne pouvez pas utiliser 2 touches ou plus en même temps pour naviguer. Par exemple, enfoncer les touches \textbf{Z} et \textbf{D} pour aller la direction nord-est est impossible, il vous faut tourner votre caméra dans la direction où vous voulez aller puis appuyer sur \textbf{Z}.}
|
||||||
|
|
||||||
Fermez la fenêtre 3D pour pouvoir générer un nouveau L-Systeme sans avoir à rouvrir l'application
|
Fermez la fenêtre 3D pour pouvoir générer un nouveau L-Système sans avoir à rouvrir l'application
|
||||||
|
|
||||||
\section{Tests de notre logiciel}
|
\section{Tests de notre logiciel}
|
||||||
|
|
||||||
\subsection{Exemple test 1}
|
|
||||||
|
|
||||||
\subsection{Exemple test 2}
|
|
||||||
|
|
||||||
\subsection{Possibles problèmes}
|
\subsection{Possibles problèmes}
|
||||||
|
|
||||||
Lorsque vous tentez de générer un L-Système, celui-ci est affiché en 3D en utilisant une méthode récursive, si celui-ci est trop long cela peut entraîner une erreur de type StackOverflowError, la fenêtre 3D restera alors blanche, fermer la puis retenter une génération avec moins d'itérations ou tentez une génération avec d'autres règles.
|
Lorsque vous tentez de générer un L-Système, celui-ci est affiché en 3D en utilisant une méthode récursive, si celui-ci est trop long cela peut entraîner une erreur de type \textit{StackOverflowError}, la fenêtre 3D restera alors blanche. Fermez la puis retentez une génération avec moins d'itérations ou tentez une génération avec d'autres règles.
|
||||||
|
|
||||||
|
Si vous lancez une génération avec beaucoup d'itérations, celle-ci peut mettre un certain temps à se générer et peut provoquer une erreur \textit{OutOfMemoryError}.
|
||||||
|
|
||||||
\section{Mesures de performances}
|
\section{Mesures de performances}
|
||||||
|
|
||||||
|
Nous avons mis en place un stress-test qui réécrit et convertit en arbre le L-Système.
|
||||||
|
Ce stress-test nécessite 4GB de RAM de libre et construira un mot de quasiment 26 millions de caractères puis celui-ci sera converti en un arbre (notez qu'il est impossible de l'afficher dans le moteur graphique car cela donnera \textit{StackOverflowError}).
|
||||||
|
|
||||||
|
\begin{figure}[h!]
|
||||||
|
\centering
|
||||||
|
\includegraphics[scale=0.3]{pics/stresstest.png}
|
||||||
|
\caption{Mesure de performances}
|
||||||
|
\label{Perf}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
(Test de performances effectué avec un Ryzen 5 2400g et une gtx 1050ti.)
|
||||||
|
|
||||||
\section{Possibles améliorations}
|
\section{Possibles améliorations}
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\item Améliorer l'optimisation.
|
||||||
|
\item Rendre l'interface graphique plus conviviale.
|
||||||
|
\item Réaliser les L-Système 2D dans un vrai environnement 2D, et non dans un moteur 3D comme actuellement.
|
||||||
|
\item Améliorer le réalisme de la modélisation 3D.
|
||||||
|
\item Exporter les modèles d'arbres afin de les implémenter facilement dans des applications comme des jeux.
|
||||||
|
\item Utilisation des méthodes de OpenGL 3 ou 4 au lieu de ceux de OpenGL 2 afin de profiter des dernières améliorations technologiques des cartes graphiques (notamment au niveau des performances).
|
||||||
|
|
||||||
|
\end{itemize}
|
||||||
|
@ -13,11 +13,10 @@
|
|||||||
\usepackage[dvipsnames]{xcolor}
|
\usepackage[dvipsnames]{xcolor}
|
||||||
\usepackage[allbordercolors=white]{hyperref}
|
\usepackage[allbordercolors=white]{hyperref}
|
||||||
\usepackage{mdframed}
|
\usepackage{mdframed}
|
||||||
\usepackage{pgfplotstable}
|
\usepackage[T1]{fontenc}
|
||||||
\usepackage{tikz-3dplot}
|
|
||||||
\usepackage[OT1]{fontenc}
|
|
||||||
\usepackage{lipsum}
|
\usepackage{lipsum}
|
||||||
\usepackage{amsmath}
|
\usepackage{amsmath}
|
||||||
|
\usepackage{pgfplots}
|
||||||
\usepackage{lscape} % permet de faire des pages en mode paysage
|
\usepackage{lscape} % permet de faire des pages en mode paysage
|
||||||
\usepackage{algorithmicx}
|
\usepackage{algorithmicx}
|
||||||
\usepackage[noend]{algpseudocode}
|
\usepackage[noend]{algpseudocode}
|
||||||
@ -112,7 +111,7 @@ linewidth=1pt]{infoenv}
|
|||||||
%Title page
|
%Title page
|
||||||
|
|
||||||
\titlehead{
|
\titlehead{
|
||||||
\includegraphics[width=0.25\textwidth]{pics/LOGO-UNICAEN_V-2.1-N.png}
|
\includegraphics[width=0.25\textwidth]{pics/LOGO-UNICAEN.png}
|
||||||
\hfill
|
\hfill
|
||||||
%\includegraphics[width=0.25\textwidth]{pics/}
|
%\includegraphics[width=0.25\textwidth]{pics/}
|
||||||
}
|
}
|
||||||
@ -127,12 +126,11 @@ linewidth=1pt]{infoenv}
|
|||||||
\hrulefill
|
\hrulefill
|
||||||
%\hrulefill
|
%\hrulefill
|
||||||
\vfill\\
|
\vfill\\
|
||||||
\Huge \bfseries \\L-Systeme
|
\Huge \bfseries\\L-Systeme
|
||||||
}
|
}
|
||||||
\subtitle{
|
\subtitle{
|
||||||
Conception logicielle\\
|
Conception logicielle\\
|
||||||
\hfill
|
\hfill\\
|
||||||
\\
|
|
||||||
\hrulefill
|
\hrulefill
|
||||||
\hfill\\
|
\hfill\\
|
||||||
{\normalfont Rapport de projet}
|
{\normalfont Rapport de projet}
|
||||||
@ -143,48 +141,44 @@ linewidth=1pt]{infoenv}
|
|||||||
Antonin \bsc{Boyon}\\
|
Antonin \bsc{Boyon}\\
|
||||||
Thomas \bsc{Lalong}\\
|
Thomas \bsc{Lalong}\\
|
||||||
Quentin \bsc{Legot}\\
|
Quentin \bsc{Legot}\\
|
||||||
Arthur \bsc{Page}
|
Arthur \bsc{Page}\\
|
||||||
}
|
}
|
||||||
\date{}
|
\date{}
|
||||||
|
|
||||||
\newcommand{\placeholderwarning}{
|
|
||||||
\problem{CECI EST UN PLACEHOLDER. À REMPLACER AVEC LES DONNÉES INDIQUÉES.}
|
|
||||||
}
|
|
||||||
|
|
||||||
\makeglossary
|
|
||||||
%redaction guide -> https://docs.google.com/document/d/1YfxGWD0GbRxs-OLxRxoA8Sg8OuVYTSKK8HX1ScFYlFA
|
|
||||||
\begin{document}
|
\begin{document}
|
||||||
|
\pagenumbering{roman}
|
||||||
|
|
||||||
\maketitle
|
\maketitle
|
||||||
\pagenumbering{Roman}
|
|
||||||
\tableofcontents
|
\tableofcontents
|
||||||
|
|
||||||
\listoffigures
|
\listoffigures
|
||||||
\clearpage
|
\clearpage
|
||||||
|
\pagenumbering{arabic}
|
||||||
|
|
||||||
\pagenumbering{arabic}
|
|
||||||
|
|
||||||
\input{chapters/chapitre1.tex}
|
\input{chapters/chapitre1.tex}
|
||||||
\input{chapters/chapitre2.tex}
|
\input{chapters/chapitre2.tex}
|
||||||
\input{chapters/chapitre3.tex}
|
\input{chapters/chapitre3.tex}
|
||||||
\input{chapters/chapitre4.tex}
|
\input{chapters/chapitre4.tex}
|
||||||
\input{chapters/chapitre5.tex}
|
\input{chapters/chapitre5.tex}
|
||||||
\input{chapters/chapitre6.tex}
|
|
||||||
\cleardoublepage
|
\cleardoublepage
|
||||||
\pagebreak
|
\pagebreak
|
||||||
|
|
||||||
\pagenumbering{roman}
|
\pagenumbering{roman}
|
||||||
\chapter{Annexes}
|
\chapter{Annexes}
|
||||||
|
\section{Sources}
|
||||||
|
\begin{itemize}[label=\textbullet]
|
||||||
|
\item Wikipedia L-Système (EN) : \href{https://en.wikipedia.org/wiki/L-system}{https://en.wikipedia.org/wiki/L-system}
|
||||||
|
\item Wikipedia L-Système (FR) : \href{https://fr.wikipedia.org/wiki/L-Syst\%C3\%A8me}{https://fr.wikipedia.org/wiki/L-Système}
|
||||||
|
\item Developpez.com - Tutoriel Swing :\\
|
||||||
|
\href{https://baptiste-wicht.developpez.com/tutoriels/java/swing/debutant}{https://baptiste-wicht.developpez.com/tutoriels/java/swing/debutant}
|
||||||
|
\item Java doc - Swing
|
||||||
|
\href{https://docs.oracle.com/javase/8/docs/api/javax/swing/JFrame.html}{https://docs.oracle.com/javase/8/docs/api/javax/swing/JFrame.html}
|
||||||
|
\item JOGL : \href{https://jogamp.org/jogl/www/}{https://jogamp.org/jogl/www/}
|
||||||
|
\item Javadoc : \href{https://junit.org/junit4/javadoc/latest/}{https://junit.org/junit4/javadoc/latest/}
|
||||||
|
\end{itemize}
|
||||||
\section{Remerciements}
|
\section{Remerciements}
|
||||||
Triss Jacquiot pour le modèle de rapport bien plus beau que l'original
|
Triss Jacquiot qui nous a permit de s'inspirer de son rapport pour la mise en forme.
|
||||||
\addcontentsline{toc}{section}{6.2\quad{}Bibliographie}
|
|
||||||
\begin{thebibliography}{}
|
|
||||||
\bibitem{ano05}
|
|
||||||
A. Nonymous et al.\ 2005
|
|
||||||
\bibitem{oe04}
|
|
||||||
A.N. Other \& S.O.M. Ebody 2004
|
|
||||||
\end{thebibliography}
|
|
||||||
|
|
||||||
|
\end{document}
|
||||||
\end{document}
|
|
||||||
|
BIN
rapport/sources/pics/LOGO-UNICAEN.png
Normal file
BIN
rapport/sources/pics/LOGO-UNICAEN.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 24 KiB |
BIN
rapport/sources/pics/MainFrameGUI.PNG
Normal file
BIN
rapport/sources/pics/MainFrameGUI.PNG
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 276 KiB After Width: | Height: | Size: 276 KiB |
BIN
rapport/sources/pics/stresstest.png
Normal file
BIN
rapport/sources/pics/stresstest.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 166 KiB |
Loading…
Reference in New Issue
Block a user