EnoncŽ du projet.

 

Diagramme de Vorono•

Soit un ensemble V = {v1,...,vN}, N ³ 3 de points du plan euclidien E2. Si d(vi,vj) dŽsigne la distance entre les points vi et vj, la rŽgion V(i) = {xëE2 | d(x,vi) £ d(x,vj), j=1,...,N} qui est le lieu des points plus prs de vi que tout autre point de V est appelŽe le polygone de Vorono• associŽ au point vi.

La structuration des polygones de Vorono• est analogue ˆ celle dĠun processus d'expansion cellulaire. Supposons que chaque point de V soit le noyau d'une cellule. La cellule se propage dans toutes les directions ˆ vitesse uniforme. L'expansion s'arrte quand le bord en expansion d'une cellule rencontre le bord d'une autre cellule. Le processus d'expansion cellulaire s'arrte quand les cellules couvrent le plan entier de polygones convexes, ce sont les polygones de Vorono•. Eventuellement, certaines cellules dont le noyau est situŽ sur H(V), le polygone convexe entourant V, voient leur expansion continuer indŽfiniment. La Figure 1 montre un exemple de diagramme de Vorono•.

 

Figure 1 : A gauche, le diagramme de Vorono•. A droite, la triangulation de Delaunay

Triangulation de Delaunay

Regardons maintenant de plus prs ce processus. Puisque toutes les cellules croissent ˆ la mme vitesse, le premier point de contact entre cellules se situe au point milieu de la droite reliant leurs noyaux. De la mme faon, chaque point de contact se situera sur la bissectrice du segment reliant les deux noyaux. Cette bissectrice continue jusqu'ˆ ce qu'elle rencontre une troisime cellule. Le point de rencontre est appelŽ point du Vorono• et la tranche de bissectrice arte de Vorono•. Deux cellules partageant une arte commune sont appelŽes voisins du Voronoi. La construction DT(V) qui consiste ˆ rejoindre les noyaux des polygones voisins est appelŽe tessellation (ou triangulation) de Delaunay. Les points du Vorono• seront Žvidemment les centres des cercles circonscrits aux triangles. La triangulation de Delaunay et le diagramme de Vorono• sont deux constructions duales.

Algorithme de Bowyer et Watson

La triangulation de Delaunay possde certaines propriŽtŽs intŽressantes. Nous en citerons une qui va nous servir pour la crŽation d'un triangulateur automatique de Delaunay. Soit un ensemble de points V = {v1,...,vN}, Dvivjvk est un triangle de Delaunay de DT(V) si et seulement si son cercle circonscrit ne contient aucun autre point que vi, vj et vk. C'est le thŽorme du cercle.

Notons quĠil existe de nombreux algorithmes permettant de trianguler un nuage de points sans passer par la gŽnŽration du diagramme de Vorono•.

L'algorithme de Bowyer est un algorithme itŽratif. Il utilise le thŽorme du cercle. ConsidŽrons la triangulation de Delaunay DT(VN) avec VN = {v1,...,vN}. Soit un point vN+1 ë H(VN) (Figure 2). L'algorithme suivant permet de gŽnŽrer la triangulation de Delaunay DT(VN+1) avec VN+1 = { v1,...,vN, vN+1 }.

á      On commence par Žliminer tous les triangles de DT(VN) dont le cercle circonscrit contient vN+1, et cela en accord avec le thŽorme du cercle. Il est possible de dŽmontrer que le polygone E(VN, vN+1) construit ˆ partir des triangles ŽliminŽs est convexe et d'un seul tenant (Figure 2).

á       On reconstruit la triangulation en reliant le point vN+1 aux points de H(E). On obtient ainsi une nouvelle triangulation de Delaunay (Figure 2).

 

Figure 2 : Algorithme de Bowyer et Watson.

 

Notez que vous avez le choix dans lĠalgorithme pour la gŽnŽration de la triangulation. Vous pouvez, outre lĠalgorithme de Bowyer et Watson, utiliser lĠalgorithme de Lawson ou la technique Ç divide and conquer È (diviser pour rŽgner en franais).

Cahier des charges

Reconstruire un objet ˆ partir de donnŽes partielles est un problme important et ayant de nombreuses applications dans de nombreux domaines. En mŽdecine par exemple, on cherche ˆ reconstruire des modles tri-dimensionnels des organes ˆ partir de coupes scanner ; en gŽologie, la structure du sous-sol ˆ partir de mesures sismiques, en ingŽnierie, un modle CAO ˆ partir de points mesurŽs sur une maquette.

La triangulation de Delaunay et le diagramme de Vorono• dŽfinissent une technique permettant de reconstruire une surface 2D (ou un volume si on travaille en 3D), si l'on dispose uniquement de points sur cette surface (ou sur ce volume).

Le but de ce projet est de construire une triangulation de Delaunay ˆ partir dĠune liste de donnŽes. Ces donnŽes sont fournies sous la forme dĠun fichier organisŽ de la faon suivante :

X         Y         VAL

X         Y         VAL

            É       

X         Y         VAL

 

Le champ VAL du fichier est variable en fonction du type de champs ˆ reprŽsenter :

á      Une seule valeur rŽelle pour les champs scalaires ;

á      Deux valeurs pour les deux composantes vx et vy dĠun vecteur v ;

á      Trois valeurs pour les trois composantes sx, sy et sxy indŽpendantes dĠun tenseur symŽtrique dĠordre 2 s.

Les rŽsultats du programme ˆ dŽvelopper se prŽsenteront sous la forme dĠun fichier de sortie dont le format est dŽfini dans la section 9.2.1 de la documentation de gmsh (http://www.geuz.org/gmsh/doc/texinfo/gmsh-full.html). On utilisera des triangles scalaires comme objets de sortie (voir la doc de gmsh ou lĠexemple fourni en annexe).

Le rŽsultat se prŽsentera sous la forme dĠun exŽcutable qui devra pouvoir tre utilisŽ de la faon suivante :

programme  [options] fichier.in     fichier.out.

Le fichier.in se prŽsentera sous la forme dŽfinie plus haut et le fichier.out devra tre lisible par gmsh. Les [options] du programme sont facultatives sauf une, lĠoption ‑help. Quand lĠoption ‑help est activŽe, le programme doit Žcrire dans la sortie standard std::cout (ou stdout en langage C) une note explicative sur lĠutilisation de celui-ci.

Deux dŽliverables devront tre fournis dans le cadre de ce projet

á      Une archive compressŽe (zip, rar ou tar.gz) contenant le code source ainsi quĠun fichier README dans lequel se trouveront les instructions pour la compilation et lĠinstallation du programme. LĠutilisation dĠun makefile, de autoconf, la gŽnŽration dĠune manpage seront considŽrŽes avec la plus grande bienveillance par vos correcteurs.

á      Un rapport concis (au maximum 7 pages A4 en Times 12) ou seront expliquŽes clairement vos choix de design tant au point de vue des structures de donnŽes que des algorithmes.

LĠŽvaluation portera sur

á      La facilitŽ dĠinstallation, de compilation ainsi que la qualitŽ de la documentation (option –help ou man page). Si un programme ne compile pas, notre indulgence sera minime.

á      La justesse du programme pour les exemples fournis par nos soins ;

á      La robustesse du programme pour une sŽrie dĠautres exemples. On veillera en outre ˆ ce que la mŽmoire allouŽe soit bien libŽrŽe en vue dĠŽviter les fuites de mŽmoire (memory leaks). Dans lĠenvironnement linux, il existe un logiciel pour dŽtecter des fuites de mŽmoire automatiquement : Ç valgrind È ;

á      LĠefficacitŽ du programme. Il serait judicieux de tester votre programme en utilisant au moins 10000, voire 100000 donnŽes. Si N est le nombre de points, un bon algorithme devrait avoir une complexitŽ (temps dĠexŽcution) de type N log(N). Un mauvais algorithme aura une complexitŽ de N;

á      La qualitŽ du design ainsi que la qualitŽ de lĠimplŽmentation. Trois classes devront obligatoirement tre dŽfinies (dĠautres classes pourront tre dŽfinies en outre de celles lˆ). Une classe pour les points, une classe pour les triangles et une classe pour les donnŽes. La classe Ç donnŽe È sera une classe virtuelle pure dont devront dŽriver des classes de donnŽe scalaire, vectorielle et tensorielle. Notez que vous allez tre amenŽs ˆ manipuler des conteneurs (listes, tableaux) de taille variable (le nombre de triangles augmente et certains triangles seront ŽliminŽs de la liste au cours de lĠalgorithme). LĠutilisation de la Standard Template Library (STL, www.sgi.com/tech/stl) pourrait vous faciliter grandement la t‰che.

ModalitŽs

Le dŽveloppement du programme se fera obligatoirement dans lĠenvironnement LINUX. Pour ceux qui utiliseraient leur ordinateur personnel sous Windows, vous avez la possibilitŽ dĠinstaller un environnement de type LINUX (gratuit) en tŽlŽchargeant lĠenvironnement cygwin (www.cygwin.com). Si vous deviez installer cygwin, installez lĠensemble des composants, y compris les outils de dŽveloppement. Il existe une version minimale de cygwin sur http://www.mingw.org/ que nous nĠavons pas vraiment testŽe mais qui jouit dĠune bonne rŽputation. Il nĠest Žvidemment pas interdit de dŽvelopper votre code en utilisant autre chose mais il faut savoir que certains logiciels commerciaux bien connus ne fournissent pas un compilateur C++ qui respecte scrupuleusement la norme ANSI. Votre programme pourrait donc trs bien compiler sur votre plateforme mais PAS sous LINUX.

Le logiciel gmsh est tŽlŽchargeable en version exŽcutable pour la plupart des plateformes standard (www.geuz.org/gmsh).

Exemple

Voici un exemple simple qui montre le type de rŽsultats attendus (les donnŽes sont disponibles sur le site Web du cours). Nous avons gŽnŽrŽ ˆ lĠaide de MATLAB trois fichiers Exemple1.in, Exemple2.in et Exemple3.in qui contiennent respectivement 200, 2000 et 20000 points entre dans les intervalles Xë[–2p et 2p] et Yë[–2p et 2p]. Les points sont choisis au hasard (fonction rand) et, en chaque point X Y (r, q), on a calculŽ la fonction v(r, q)=J1(r)sin(5q). Les rŽsultats sont prŽsentŽs dans les Figures 3,4 et 5.

 

Figure 3 : RŽsultats de la triangulation pour lĠexemple Exemple1.in avec 200 points.

 

Figure 4 : RŽsultats de la triangulation pour lĠexemple Exemple2.in avec 2000 points.

 

Figure 5 : RŽsultats de la triangulation pour lĠexemple Exemple3.in avec 20000 points.

á      Notez que, pour les 20000 points, lĠalgorithme utilisŽ par nos soins a nŽcessitŽ beaucoup moins dĠune seconde pour effectuer son travail (juste pour vous Žnerver un peu).

Bon travail.