Update Rapport

This commit is contained in:
Arthur 2021-04-20 11:51:25 +02:00
parent d141d9032b
commit 67eedd52de
6 changed files with 143 additions and 134 deletions

View File

@ -1,22 +1,24 @@
\chapter{Introduction}
\section{Sujet et consignes}
Ce projet a pour objectif de réaliser une application appliquant des principes de programmation orientée objet en langage de programmation Java. Nous avons eut le choix entre 6 sujets différents et, après études des propositions, notre choix sest finalement porté sur le "Générateurs de flores vidéos-ludiques" et donc la réalisation dun simulateur de L-système végétal produisant une image 2D et 3D de lobjet par le biais de règles de réécritures.
Ce projet a pour objectif de réaliser une application appliquant des principes de programmation orientée objet en langage de programmation Java. Nous avons eu le choix entre 6 sujets différents et, après études des propositions, notre choix sest finalement porté sur le "Générateurs de flores vidéos-ludiques". Il consiste en la réalisation dun simulateur de L-système végétal produisant une image 2D et 3D de lobjet par le biais de règles de réécritures.
\info{Pour cela nous avions quelques consignes a respecter :
\begin{itemize}
\info{Pour cela nous avions quelques consignes à respecter :
\begin{itemize}
\item Intégrer un parser de L-système.
\item Créer un moteur de réécriture.
\item Créer un moteur de rendu graphique.
\end{itemize}}
\end{itemize}}
Après lecture des consignes nous avons pu entamer nos recherches.
Après lecture des consignes, nous avons pu entamer nos recherches.
\section{Mise en place du projet}
Nos recherches se sont premièrement portées sur le L-Système (principalement sur Wikipedia\footnote{\href[textcolor=blue]{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 c'est finalement porté sur JOGL (Java Open Graphics Library \footnote{\href[textcolor=blue]{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.
\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.
\\
\\
Suite a ça nous avons réfléchit a la structure de notre code, une première ébauche sur laquelle nous pourrions nous baser pour débuter notre projet ainsi qu'un ordre de priorité, 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 code 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 a notre futur logiciel dans le but de faciliter son utilisation.

View File

@ -2,8 +2,8 @@
\section{Principe et fonctionnement}
\subsection{Qu'est-ce que le le L-Système ?}
Le L-Système \footnote{Le système de Lindebmayer}, inventé en 1968 par un biologiste hongrois du nom de Aristid Lindenmayer, est un système de réécriture \footnote{Modèle de calcul transformant des objets syntaxiques comme des mots, des termes ou encore des graphes en appliquant des règles données.} utilisé pour la modélisation de processus de developpement et de prolifération de bactéries ou de plantes.
\subsection{Qu'est-ce que le L-Système ?}
Le L-Système \footnote{Le système de Lindebmayer}, inventé en 1968 par un biologiste hongrois du nom de Aristid Lindenmayer, est un système de réécriture \footnote{Modèle de calcul transformant des objets syntaxiques comme des mots, des termes ou encore des graphes en appliquant des règles données.} utilisé pour la modélisation de processus de développement et de prolifération de bactéries ou de plantes.
\subsection{Comment fonctionne-t-il ?}
Ce système de réécriture fonctionne par le biais de plusieurs spécificités :
@ -12,27 +12,29 @@ 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 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}
En additionnant tout ces aspects, nous obtenons alors notre L-Système, commençant par l'axiome étant la base, puis, créant au fur et a 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éécriture de l'axiome pour obtenir le mot final} ), tout ceci étant possible grâce a 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 composes.
Ce mot passera ensuite par un moteur graphique dans le but d'être modélisé.
\section{Notre L-Système}
\subsection{Alphabet}
Notre alphabet est composés de plusieurs règles et constantes:\\
\label{sec:Alphabet}
Notre alphabet est composés de plusieurs règles et constantes :\\
\begin{itemize}
\item X permet de dessiner une branche et Y de dessinera rien, il permet 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 Enfin il est possible d'utiliser les crochets [] pour contrôler l'évolution et obtenir des branches à votre arbres, ces crochets vont conserver l'état, c'est à dire qu'une rotation appliqué aux crochets s'appliquera a tout les éléments étant à l'intérieur des crochets, par exemple: +[XYX] appliquera une rotation de 25° à XYX. Il est possible d'imbriquer des crochets.
\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.
\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, cest-à-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.}
\end{itemize}
\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.
Un bouton "Aide" est présent sur cette même interface aidant a 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!]
\centering
\includegraphics[width=0.8\linewidth]{pics/aideGUI.png}
\caption{Fenêtre d'aide}
\label{fig:my_label}
\centering
\includegraphics[width=0.8\linewidth]{pics/aideGUI.png}
\caption{Fenêtre d'aide}
\label{fig:help_frame}
\end{figure}

View File

@ -1,6 +1,12 @@
\chapter{Organisation et structure}
\section{Organisation du sujet}
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}
\item En premier lieu nous fallait créer l'alphabet de notre L-Système (voir section \ref{sec:Alphabet}).
\item
\item
\end{itemize}
\section{Structure du projet}
\begin{itemize}
@ -17,4 +23,7 @@
\item utils: contient l'objet Pair qui est essentiel au fonctionnement du projet
\end{itemize}
A détailler un peu plus
À détailler un peu plus
\problem{!!!! Ajouter le diagramme de classe !!!!!}

View File

@ -1,39 +1,51 @@
\chapter{Elements techniques}
\chapter{Élements techniques}
\section{Parser}\label{sec:parser}
\section{Moteur de réécriture}
Le moteur de réécriture est chargé d'appliquer les règles de réécritures itérativement à partir de l'axiome pour obtenir le mot final.
Nous avons d'un coté l'axiome qui est le mot de départ et une liste de règle qui contient 2 données: le mot a remplacer et son remplaçant.
Le mot est réécrit le mot en 2 temps:\\
Nous avons d'un côté l'axiome qui est le mot de départ et une liste de règles qui contient 2 données : le mot à remplacer et son remplaçant.
Le mot est réécrit en 2 temps :\\
\begin{itemize}
\item On change toutes les occurrences du mot à remplacer par \$\{identifiant de la règle\}
\item On remplace toutes les occurrences de \$\{identifiant de la règle\} apr la règle associé
\item On change toutes les occurrences du mot à remplacer par \$\{identifiant de la règle\}.
\item On remplace toutes les occurrences de \$\{identifiant de la règle\} par la règle associée.
\end{itemize}
On répète cette opération n fois, pour obtenir le mot final.
\section{Moteur graphique}\label{src: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.
Pour naviguer dans l'espace 3D, voir la section \ref{sec:nav_3d}
\begin{figure}[h!]
\centering
\includegraphics[width=0.8\linewidth]{pics/3dGUI.png}
\caption{Fenêtre 3D}
\label{fig:3d_frame}
\end{figure}
\clearpage
\section{Interface principale}\label{sec:menu}
\subsection{Composition de l'interface}
\paragraph{L'interface}
utilisateur de notre logiciel à été conçue grâce à la bibliothèque \textit{Swing} de Java. Elle se compose de trois classes, une contenant la fenêtre principale \classe{MainFrame}, un autre permettant de créer des onglets \classe{Tab} et une troisième classe gérant les événements \classe{Listener}.
utilisateur de notre logiciel a été conçu grâce à la bibliothèque \Swing \ de \Java. Elle se compose de trois classes, une contenant la fenêtre principale \classe{MainFrame}, une autre permettant de créer des onglets, \classe{Tab} et une troisième classe gérant les événements, \classe{Listener}.
\subsection{Classes de l'interface}
\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.\\
Elle comporte ainsi une instance de la classe JTabbedPane \label{jtpane}, un conteneur graphique donc le but est de disposer ses composants sous la forme d'onglets.
\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.
\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 Tab crées sont ensuites ajoutées par la 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 intances de \classe{Tab} créées sont ensuite ajoutées par la classe \classe{MainFrame} à son composant de la classe JTabbedPane \ref{jtpane}.
\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}

View File

@ -16,20 +16,21 @@ Blablabla commande ant run blablabla
\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 naivaguation 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 \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!]
\centering
\includegraphics[scale=0.5]{pics/MainFrameGUI.PNG}
\caption{Fenêtre principale}
\label{mainframe}
\end{figure}
Il ne vous reste ensuite plus qu'à renseinger votre axiome, ainsi que vos règles et de cniquer sur le bouton \button{Générer en 3D}. Le bouton \button{Close} permet de fermer l'onglet de génération et le bouton \button{Clear} de supprimer votre axiome et vos règles précedemment écrites. Grâce au compteur à droite, vous êtes en mesure de définir le nombre d'itérations de votre génération.
Il ne vous reste ensuite plus qu'à renseigner votre axiome, ainsi que vos règles et de cliquer sur le bouton \button{Générer en 3D}. Le bouton \button{Close} permet de fermer l'onglet de génération et le bouton \button{Clear} de supprimer votre axiome et vos règles précédemment écrites. Grâce au compteur à droite, vous êtes en mesure de définir le nombre d'itérations de votre génération.
\info{Vous pouvez ouvrir de nouveaux onglets de génération grâce au bouton \button{Nouvelle génération} mais sachez qu'un maximum de trois fenêtres est accepté}
\subsection{Navigation dans l'interface graphique en 3D}
\label{sec:nav_3d}
Pour naviguer dans l'espace 3D, vous pouvez utiliser votre clavier ainsi que votre souris \textbf{(La souris n'est pas essentielle, le clavier peut amplement suffir)}.
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}
\paragraph{Liste des commandes au clavier : }
\begin{itemize}
@ -41,27 +42,30 @@ Pour naviguer dans l'espace 3D, vous pouvez utiliser votre clavier ainsi que vot
\item \textbf{E} $\xrightarrow{} Tourner \ la \ caméra \ à \ droite$
\item \textbf{W} $\xrightarrow{} Prendre \ de \ la \ hauteur$
\item \textbf{X} $\xrightarrow{} Perde \ de \ la \ hauteur$
\end{itemize}
\end{itemize}
\paragraph{Liste des commandes à la souris :}
\begin{itemize}
\item \textbf{Mollette Avant} $\xrightarrow{}$ Zommer
\item \textbf{Mollette Arrière} $\xrightarrow{}$ Dézoomer
\item \textbf{Clic Droit} $\xrightarrow{}$ Maintenir puis bouger la souris pour changer l'orientation de la caméra
\begin{itemize}
\item \textbf{Mollette Avant} $\xrightarrow{} Zommer$
\item \textbf{Mollette Arrière} $\xrightarrow{} Dézoomer$
\item \textbf{Clic Droit} $\xrightarrow{} Maintenir \ puis \ bouger \ la \ souris \ pour \ changer \ l'orientation \ de \ la \ caméra$
\end{itemize}
\problem{Vous ne pouvez pas utiliser 2 touches ou plus en même temps pour naviguer par exemple Z et D pour aller la direction nord-est est impossible, tourner votre caméra dans la direction où vous voulez aller puis appuyer sur 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 fenetre 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-Systeme sans avoir à rouvrir l'application
\section{Tests de notre logiciel}
\subsection{exemple test 1}
\subsection{Exemple test 1}
\subsection{exemple test 2}
\subsection{Exemple test 2}
\subsection{Possibles problèmes}
StackOverflowError quand on met trop d'itérations
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.
\section{Mesures de performances}
\section{Possibles améliorations}
\section{Mesure de performance}

View File

@ -28,55 +28,57 @@
\definecolor{link}{HTML}{4169E1}
\usepackage[bottom=2cm,footskip=8mm]{geometry}
%%% Commandes de mise page propre au projet:
%%% Commandes de mise page propre au projet :
\newcommand{\button}[1]{\textit{\fbox{#1}}}
\newcommand{\classe}[1]{\textit{\textbf{#1}}}
\newcommand{\Java}{\textit{Java}}
\newcommand{\Swing}{\textit{Swing}}
\newmdenv[
rightline=false,
topline=false,
bottomline=false,
backgroundcolor=BurntOrange!5,
fontcolor=BrickRed,
linecolor=Red,
linewidth=1pt]{problemenv}
rightline=false,
topline=false,
bottomline=false,
backgroundcolor=BurntOrange!5,
fontcolor=BrickRed,
linecolor=Red,
linewidth=1pt]{problemenv}
\newcommand{\problem}[1]{
\begin{problemenv}
\sffamily
#1
\end{problemenv}
\begin{problemenv}
\sffamily
#1
\end{problemenv}
}
\newmdenv[
rightline=false,
topline=false,
bottomline=false,
backgroundcolor=ForestGreen!5,
fontcolor=OliveGreen,
linecolor=Green,
linewidth=1pt]{resultenv}
rightline=false,
topline=false,
bottomline=false,
backgroundcolor=ForestGreen!5,
fontcolor=OliveGreen,
linecolor=Green,
linewidth=1pt]{resultenv}
\newcommand{\result}[1]{
\begin{resultenv}
\sffamily
#1
\end{resultenv}
\begin{resultenv}
\sffamily
#1
\end{resultenv}
}
\newmdenv[
rightline=false,
topline=false,
bottomline=false,
backgroundcolor=Cyan!5,
fontcolor=Blue,
linecolor=NavyBlue,
linewidth=1pt]{infoenv}
rightline=false,
topline=false,
bottomline=false,
backgroundcolor=Cyan!5,
fontcolor=Blue,
linecolor=NavyBlue,
linewidth=1pt]{infoenv}
\newcommand{\info}[1]{
\begin{infoenv}
\sffamily
#1
\end{infoenv}
\begin{infoenv}
\sffamily
#1
\end{infoenv}
}
% Gestion d'abstracts multiples
@ -88,7 +90,7 @@ linewidth=1pt]{infoenv}
\renewenvironment{abstract}[1]
{\bigskip\selectlanguage{#1}%
\begin{center}\bfseries\abstractname\end{center}}
{\par\bigskip}
{\par\bigskip}
% Gestion des keywords
@ -105,7 +107,7 @@ linewidth=1pt]{infoenv}
\titlehead{
\includegraphics[width=0.25\textwidth]{pics/LOGO-UNICAEN_V-2.1-N.png}
\hfill
%\includegraphics[width=0.25\textwidth]{pics/}
%\includegraphics[width=0.25\textwidth]{pics/}
}
\subject{
\small
@ -113,8 +115,7 @@ linewidth=1pt]{infoenv}
UFR des Sciences\\
Département Informatique\\
\hfill\\
2ème année de licence d'informatique
}
2ème année de licence d'informatique}
\title{
\hrulefill
%\hrulefill
@ -140,7 +141,7 @@ linewidth=1pt]{infoenv}
\date{}
\newcommand{\placeholderwarning}{
\problem{CECI EST UN PLACEHOLDER. À REMPLACER AVEC LES DONNÉES INDIQUÉES.}
\problem{CECI EST UN PLACEHOLDER. À REMPLACER AVEC LES DONNÉES INDIQUÉES.}
}
\makeglossary
@ -150,46 +151,25 @@ linewidth=1pt]{infoenv}
\maketitle
\pagenumbering{Roman}
\tableofcontents
\listoffigures
\clearpage
%\begin{abstractpage}
% \begin{abstract}{french}
% \lipsum[1]
% \end{abstract}
%
% \begin{abstract}{english}
% \lipsum[1]
% \end{abstract}
% \hfill\\
% %\keywords{test lol boup incroyable rassuré}
%\end{abstractpage}
\pagenumbering{arabic}
\info{Placeholder info}
\problem{Placeholder problem}
\result{Placeholder result}
\input{chapters/chapitre1.tex}
\input{chapters/chapitre2.tex}
\input{chapters/chapitre3.tex}
\input{chapters/chapitre4.tex}
\input{chapters/chapitre5.tex}
\input{chapters/chapitre6.tex}
%\input{chapters/validation.tex}
%\input{chapters/conclusion.tex}
\cleardoublepage
\pagebreak
\pagenumbering{roman}
\chapter{Annexes}
\section{Remerciement}
\section{Remerciements}
Triss Jacquiot pour le modèle de rapport bien plus beau que l'original
\addcontentsline{toc}{section}{6.2\quad{}Bibliographie}
\begin{thebibliography}{}