\documentclass[a4paper,12pt]{article}

\usepackage[french]{babel}
\usepackage[T1]{fontenc} 
\usepackage[latin1]{inputenc}
\usepackage{epsfig}
\usepackage{times}
%\usepackage{amsmath}

\author{Rémi Synave, Stefka Gueorguieva, Pascal Desbarats}
\title{Manuel de la bibliothèque GRAPH}
\date{}

\begin{document}
\maketitle

\section{Utilisation}
Cette bibliothèque implémente toutes les fonctions ayant un rapport avec la théorie des graphes. Un maillage étant un graphe plongé dans l'espace $\mathbf{R}^3$, il peut être considéré comme un graphe.


\section{Fonctions}
\section{Fonctions utilisant les \texttt{vf\_model}}
\textbullet \texttt{void vf\_model\_dijkstra(vf\_model *m, int ve\_dep, int ve\_fin, int **list, int *size)}\\
Fonction qui calcule le chemin le plus court entre les sommets \texttt{ve\_dep} et \texttt{ve\_fin} avec l'algorithme de Dijkstra~\cite{D1971}. La longueur totale du chemin est retournée. Le chemin est retournée sous forme d'une liste de sommets parcourus.\\
L'algorithme de Dijkstra est illustré sur les figures \ref{maillage_base} et \ref{maillage_dijkstra}. L'algorithme peut fournir un résultat assez éloigné de la ligne droite comme montré sur la figure \ref{maillage_bad_dijkstra}. Bien que le chemin soit éloigné de la ligne droite, le chemin est le plus court.\\
L'algorithme utilisé est une base de Dijkstra. La fin de l'algortihme a été modifiée afin d'éviter les cas de la figure \ref{maillage_bad_dijkstra}.\\
\textbf{Algorithme} : (http://fr.wikipedia.org/wiki/Algorithme\_de\_Dijkstra)\\
\begin{verbatim}
Pour tous les sommets S du maillage
  S.parcouru=INFINI
  S.precedent=-1
FinPour

listeNonParcouru={ensemble des sommets}
ve_deb.parcouru=0

TantQue listeNonParcouru!={liste vide}
  S1=minimum(listeNonParcouru)
  listeNonParcouru.retirer(S1)
  Pour tous les voisins S2 de S1
    si S2.parcouru>S1.parcouru+|S1 S2| alors
      S2.parcouru=S1.parcouru+|S1 S2|
      S2.precedent=S1
    FinSi
  FinPour
FinTantQue

chemin={liste vide}
S=ve_fin

/*** PARTIE MODIFIE ***/
TantQue S!=ve_deb
  Pour tous les voisins S2 de S
    Si S2.parcouru==S.precedent.parcouru && 
       |S2 ve_fin|<|S.parcouru ve_fin|
      S.precedent=S2
    FinSi
  FinPour
  chemin.ajouterDebut(S)
  S=S.precedent
FinTantQue
chemin.ajouterDebut(S)

retourner ve_fin.parcouru
\end{verbatim}
~\\
\underline{Paramètres et type de retour :}\\
\texttt{m} : le modèle de type \texttt{vf\_model}.\\
\texttt{ve\_dep} : numéro du sommet de départ.\\
\texttt{ve\_fin} : numéro du sommet de fin.\\
\texttt{list} : liste contenant les sommets parcourus.\\
\texttt{size} : taille de la liste \texttt{list}.\\
\texttt{retour} : la longueur du chemin entre les deux sommets.\\

\begin{figure}[htbp]
\centering
\includegraphics[width=5cm]{./images/grille.eps}
\caption{}
\label{maillage_base}
\end{figure}
\begin{figure}[htbp]
\centering
\includegraphics[width=5cm]{./images/grille_dijkstra.eps}
\caption{Résultat de l'algorithme de Dijkstra}
\label{maillage_dijkstra}
\end{figure}
\begin{figure}[htbp]
\centering
\includegraphics[width=5cm]{./images/grille_dijkstra_bad.eps}
\caption{Autre résultat possible de l'algorithme de Dijkstra}
\label{maillage_bad_dijkstra}
\end{figure}


\textbullet \texttt{void vf\_model\_chemin\_plus\_proche(vf\_model *m, int ve\_dep, int ve\_fin, int **list, int *size)}\\
Fonction qui calcule le chemin le plus court entre les sommets \texttt{ve\_dep} et \texttt{ve\_fin}. La longueur totale du chemin est retournée. Le chemin est retournée sous forme d'une liste de sommets parcourus.\\
\textbf{Algorithme} : \\
\begin{verbatim}
chemin.ajouter(ve_dep)
S=ve_dep
distance=0

TantQue on trouve un sommet à ajouter
  Si l'un des voisins S2 de S est plus proche de ve_fin
    distance=distance+|S S2|
    S=S2
    chemin.ajouter(S)
  FinSi
FinTantQue

Si S!=ve_fin
  retourner -1
Sinon
  retourner distance
\end{verbatim}
~\\
\underline{Paramètres et type de retour :}\\
\texttt{m} : le modèle de type \texttt{vf\_model}.\\
\texttt{ve\_dep} : numéro du sommet de départ.\\
\texttt{ve\_fin} : numéro du sommet de fin.\\
\texttt{list} : liste contenant les sommets parcourus.\\
\texttt{size} : taille de la liste \texttt{list}.\\
\texttt{retour} : la longueur du chemin entre les deux sommets.\\






\section{Fonctions utilisant les \texttt{vf\_model}}
\textbullet \texttt{void vef\_model\_dijkstra(vf\_model *m, int ve\_dep, int ve\_fin, int **list, int *size)}\\
Fonction qui calcule le chemin le plus court entre les sommets \texttt{ve\_dep} et \texttt{ve\_fin} avec l'algorithme de Dijkstra~\cite{D1971}. La longueur totale du chemin est retournée. Le chemin est retournée sous forme d'une liste de sommets parcourus.\\
L'algorithme de Dijkstra est illustré sur les figures \ref{maillage_base} et \ref{maillage_dijkstra}. L'algorithme peut fournir un résultat assez éloigné de la ligne droite comme montré sur la figure \ref{maillage_bad_dijkstra}. Bien que le chemin soit éloigné de la ligne droite, le chemin est le plus court.\\
L'algorithme utilisé est une base de Dijkstra. La fin de l'algortihme a été modifiée afin d'éviter les cas de la figure \ref{maillage_bad_dijkstra}.\\
\textbf{Algorithme} : (http://fr.wikipedia.org/wiki/Algorithme\_de\_Dijkstra)\\
\begin{verbatim}
Pour tous les sommets S du maillage
  S.parcouru=INFINI
  S.precedent=-1
FinPour

listeNonParcouru={ensemble des sommets}
ve_deb.parcouru=0

TantQue listeNonParcouru!={liste vide}
  S1=minimum(listeNonParcouru)
  listeNonParcouru.retirer(S1)
  Pour tous les voisins S2 de S1
    si S2.parcouru>S1.parcouru+|S1 S2| alors
      S2.parcouru=S1.parcouru+|S1 S2|
      S2.precedent=S1
    FinSi
  FinPour
FinTantQue

chemin={liste vide}
S=ve_fin

/*** PARTIE MODIFIE ***/
TantQue S!=ve_deb
  Pour tous les voisins S2 de S
    Si S2.parcouru==S.precedent.parcouru && 
       |S2 ve_fin|<|S.parcouru ve_fin|
      S.precedent=S2
    FinSi
  FinPour
  chemin.ajouterDebut(S)
  S=S.precedent
FinTantQue
chemin.ajouterDebut(S)

retourner ve_fin.parcouru
\end{verbatim}
~\\
\underline{Paramètres et type de retour :}\\
\texttt{m} : le modèle de type \texttt{vef\_model}.\\
\texttt{ve\_dep} : numéro du sommet de départ.\\
\texttt{ve\_fin} : numéro du sommet de fin.\\
\texttt{list} : liste contenant les sommets parcourus.\\
\texttt{size} : taille de la liste \texttt{list}.\\
\texttt{retour} : la longueur du chemin entre les deux sommets.\\

\begin{figure}[htbp]
\centering
\includegraphics[width=5cm]{./images/grille.eps}
\caption{}
\label{maillage_base}
\end{figure}
\begin{figure}[htbp]
\centering
\includegraphics[width=5cm]{./images/grille_dijkstra.eps}
\caption{Résultat de l'algorithme de Dijkstra}
\label{maillage_dijkstra}
\end{figure}
\begin{figure}[htbp]
\centering
\includegraphics[width=5cm]{./images/grille_dijkstra_bad.eps}
\caption{Autre résultat possible de l'algorithme de Dijkstra}
\label{maillage_bad_dijkstra}
\end{figure}

\textbullet \texttt{vef\_model* vef\_model\_nearest\_neighbour\_graph(vef\_model *m)}\\
Calcul du graphe de voisin le plus proche tel que défini dans \cite{AS2000}.\\
\textbf{Définition du graphe de voisin le plus proche :}\\
Considérons un nuage de point $P$. Le graphe des voisins le plus proche est l'ensemble des aretes $E$ telles que :\\
$E \subseteq P \times P$ et $E=\{e_k=(P_i,P_j),k=1,\cdots ,n / P_j\textrm{ est le point le plus proche de }P_i\}$.\\
~\\
\underline{Paramètres et type de retour :}\\
\texttt{m} : le modèle de type \texttt{vef\_model}.\\
\texttt{retour} : un \texttt{vef\_model} contenant les sommets et les aretes du graphe des voisins les plus proche.\\

\textbullet \texttt{vef\_model* vef\_model\_gabriel\_graph(vef\_model *m)}\\
Calcul du "Gabriel graph" tel que défini dans \cite{AS2000}.\\
\textbf{Définition du "Gabriel graph" :}\\
Considérons un nuage de point $P$. Le "Gabriel graph" est le graphe maximal contenant l'ensemble des aretes $E$ telles que :\\
$E \subseteq P \times P$ et $E=\{e_k=(P_i,P_j),k=1,\cdots ,n /\textrm{ la sphère minimal contenant }P_i$\\$\textrm{et }P_j\textrm{ ne contient aucun autre point}\}$.\\
Le "Gabriel graph" est donc l'ensemble des aretes reliant deux points et dont la sphère minimale ne contient pas d'autres points.\\
~\\
\underline{Paramètres et type de retour :}\\
\texttt{m} : le modèle de type \texttt{vef\_model}.\\
\texttt{retour} : un \texttt{vef\_model} contenant les sommets et les aretes du "Gabriel Graph".\\

\textbullet \texttt{vef\_model* vef\_model\_extended\_gabriel\_hypergraph(vef\_model *m)}\\
Calcul du "Extended Gabriel hypergraph" tel que défini dans \cite{AS2000}.\\
\textbf{Définition du "Extended Gabriel hypergraph" :}\\
Considérons le "Gabriel graph (GG)" (voir fonction correspondante) d'un nuage de point $P$. Le "Extended Gabriel hypergraph" est défini tel que :\\
\begin{itemize}
\item $\forall e_1,e_2 \in GG(P), e_1=(v_1,v_2)\textrm{ et }e_2=(v_2,v_3),$ si $v_1,v_2 \textrm{ et } v_3$ sont non alignés et que la sphère minimal de ces trois points ne contient aucun autre point, alors l'arete $(v_1,v_3)$ est ajouté aà l'"Extended Gabriel hypergraph".
\item tout cycle de trois aretes dans l'"Extended Gabriel hypergraph" forme un triangle.
\end{itemize}
~\\
\underline{Paramètres et type de retour :}\\
\texttt{m} : le modèle de type \texttt{vef\_model}.\\
\texttt{retour} : un \texttt{vef\_model} contenant les sommets, les aretes et les faces du "Extended Gabriel hypergraph".\\


\textbullet \texttt{vef\_model* vef\_model\_euclidean\_minimal\_spanning\_tree(vef\_model *m)}\\
Calcul de l'arbre minimal couvrant avec la méthode Prim \cite{P1957}.\\
\textbf{Définition du "Euclidean Minimal Spanning Tree" :}\\
L'arbre minimal couvrant d'un graphe est le sous ensemble d'arete formant un arbre incluant toutes les aretes et donc la somme des poids des aretes est minimal.\\
\textbf{Algorithme :} http://en.wikipedia.org/wiki/Prim\%27s\_algorithm\\
\begin{verbatim}
V désigne l'ensemble des sommets
E désigne l'ensemble des aretes

Choisir un sommet S arbitrairement
Vnew={S}
Enew={}
TantQue Vnew!=V
  choisir une arete(u,v) ayant le poids minimal telle que:
    u appartient à Vnew
    v n'appartient pas à Vnew
  ajouter v à Vnew
  ajouter (u,v) à Enew
FinTantQue

Vnew et Enew est l'arbre couvrant minimal
\end{verbatim}
~\\
\underline{Paramètres et type de retour :}\\
\texttt{m} : le modèle de type \texttt{vef\_model}.\\
\texttt{retour} : un \texttt{vef\_model} contenant les sommets et les aretes du "Euclidean Minimal Spanning Tree".\\

\bibliographystyle{unsrt}
\bibliography{manuel}

\end{document}
