Soit un ensemble V = {v1,...,vN}, N ³ 3 de points du plan euclidien E2. Si d(vi,vj) dsigne la distance entre les points vi et vj, la rgion V(i) = {xëE2 | d(x,vi) £ d(x,vj), j=1,...,N} qui est le lieu des points plus prs de vi que tout autre point de V est appele 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'arrte quand le bord en expansion d'une cellule
rencontre le bord d'une autre cellule. Le processus d'expansion cellulaire
s'arrte 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 indfiniment. La Figure 1 montre un exemple de diagramme de Vorono.
|
|
|
Figure 1 : A gauche,
le diagramme de Vorono. A droite, la triangulation de Delaunay |
||
Regardons maintenant de plus prs ce processus. Puisque
toutes les cellules croissent la mme vitesse, le premier point de contact
entre cellules se situe au point milieu de la droite reliant leurs noyaux. De
la mme faon, chaque point de contact se situera sur la bissectrice du segment
reliant les deux noyaux. Cette bissectrice continue jusqu' ce qu'elle
rencontre une troisime cellule. Le point de rencontre est appel point du
Vorono et la tranche de bissectrice arte de Vorono. Deux cellules partageant
une arte commune sont appeles voisins du Voronoi. La construction DT(V) qui
consiste rejoindre les noyaux des polygones voisins est appele 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.
La triangulation de Delaunay possde certaines proprits intressantes. Nous en citerons une qui va nous servir pour la cration 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 thorme du cercle.
Notons quĠil existe de nombreux algorithmes permettant de trianguler un nuage de points sans passer par la gnration du diagramme de Vorono.
L'algorithme de Bowyer est un algorithme itratif. Il utilise le thorme du cercle. Considrons la triangulation de Delaunay DT(VN) avec VN = {v1,...,vN}. Soit un point vN+1 ë H(VN) (Figure 2). L'algorithme suivant permet de gnrer 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 thorme du cercle. Il est possible de dmontrer que le polygone E(VN, vN+1) construit partir des triangles limins 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 gnration 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 rgner en franais).
Reconstruire un objet partir de donnes partielles est un problme important et ayant de nombreuses applications dans de nombreux domaines. En mdecine par exemple, on cherche reconstruire des modles tri-dimensionnels des organes partir de coupes scanner ; en gologie, la structure du sous-sol partir de mesures sismiques, en ingnierie, un modle CAO partir de points mesurs sur une maquette.
La triangulation de Delaunay et le diagramme de Vorono dfinissent 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 donnes. Ces donnes sont fournies sous la forme dĠun fichier organis de la faon suivante :
X Y VAL
X Y VAL
É
X Y VAL
Le champ VAL du fichier est variable en fonction du type de champs reprsenter :
á Une seule valeur relle 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 indpendantes dĠun tenseur symtrique dĠordre 2 s.
Les rsultats du programme dvelopper se prsenteront sous la forme dĠun fichier de sortie dont le format est dfini 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 rsultat se prsentera sous la forme dĠun excutable qui devra pouvoir tre utilis de la faon suivante :
programme [options] fichier.in fichier.out.
Le fichier.in se prsentera sous la forme dfinie 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 active, 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 dliverables devront tre fournis dans le cadre de ce projet
á Une archive compresse (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 gnration dĠune manpage seront considres avec la plus grande bienveillance par vos correcteurs.
á Un rapport concis (au maximum 7 pages A4 en Times 12) ou seront expliques clairement vos choix de design tant au point de vue des structures de donnes 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 srie dĠautres exemples. On veillera en outre ce que la mmoire alloue soit bien libre en vue dĠviter les fuites de mmoire (memory leaks). Dans lĠenvironnement linux, il existe un logiciel pour dtecter des fuites de mmoire automatiquement : Ç valgrind È ;
á LĠefficacit du programme. Il serait judicieux de tester votre programme en utilisant au moins 10000, voire 100000 donnes. Si N est le nombre de points, un bon algorithme devrait avoir une complexit (temps dĠexcution) de type N log(N). Un mauvais algorithme aura une complexit de N2 ;
á La qualit du design ainsi que la qualit de lĠimplmentation. Trois classes devront obligatoirement tre dfinies (dĠautres classes pourront tre dfinies en outre de celles l). Une classe pour les points, une classe pour les triangles et une classe pour les donnes. La classe Ç donne È sera une classe virtuelle pure dont devront driver des classes de donne scalaire, vectorielle et tensorielle. Notez que vous allez tre amens manipuler des conteneurs (listes, tableaux) de taille variable (le nombre de triangles augmente et certains triangles seront limins 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 tche.
Le dveloppement 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 tlchargeant lĠenvironnement cygwin (www.cygwin.com). Si vous deviez installer cygwin, installez lĠensemble des composants, y compris les outils de dveloppement. Il existe une version minimale de cygwin sur http://www.mingw.org/ que nous nĠavons pas vraiment teste mais qui jouit dĠune bonne rputation. Il nĠest videmment pas interdit de dvelopper 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 trs bien compiler sur votre plateforme mais PAS sous LINUX.
Le logiciel gmsh est tlchargeable en version excutable
pour la plupart des plateformes standard (www.geuz.org/gmsh).
Voici un
exemple simple qui montre le type de rsultats attendus (les donnes sont
disponibles sur le site Web du cours). Nous avons gnr 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 rsultats sont prsents dans les Figures 3,4 et 5.
|
|
|
Figure 3 : Rsultats de la triangulation pour
lĠexemple Exemple1.in avec 200 points.
|
|
|
Figure 4 : Rsultats de la triangulation pour
lĠexemple Exemple2.in avec 2000 points.
|
|
|
Figure 5 : Rsultats de la triangulation pour
lĠexemple Exemple3.in avec 20000 points.
á Notez que, pour les 20000 points,
lĠalgorithme utilis par nos soins a ncessit beaucoup moins dĠune seconde
pour effectuer son travail (juste pour vous nerver un peu).
Bon travail.