1 // SMESH MEFISTO2 : algorithm for meshing
3 // Copyright (C) 2006 Laboratoire J.-L. Lions UPMC Paris
5 // This library is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU Lesser General Public
7 // License as published by the Free Software Foundation; either
8 // version 2.1 of the License.
10 // This library is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 // Lesser General Public License for more details.
15 // You should have received a copy of the GNU Lesser General Public
16 // License along with this library; if not, write to the Free Software
17 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 // See http://www.ann.jussieu.fr/~perronne or email Perronnet@ann.jussieu.fr
24 // Author : Alain PERRONNET
26 // Date : 13 novembre 2006
31 #include <climits> // limites min max int long real ...
33 #include <unistd.h> // gethostname, ...
37 #include <iostream> // pour cout cin ...
38 #include <iomanip> // pour le format des io setw, stx, setfill, ...
40 #include <string.h> // pour les fonctions sur les chaines de caracteres
43 #include <math.h> // pour les fonctions mathematiques
46 #include <sys/types.h>
52 #if defined MEFISTO2D_EXPORTS
53 #define MEFISTO2D_EXPORT __declspec( dllexport )
55 #define MEFISTO2D_EXPORT __declspec( dllimport )
58 #define MEFISTO2D_EXPORT
63 void aptrte( Z nutysu, R aretmx,
64 Z nblf, Z *nudslf, R2 *uvslf,
66 Z & nbst, R2 * & uvst, Z & nbt, Z * & nust,
68 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
69 // but : appel de la triangulation par un arbre-4 recouvrant
70 // ----- de triangles equilateraux
71 // le contour du domaine plan est defini par des lignes fermees
72 // la premiere ligne etant l'enveloppe de toutes les autres
73 // la fonction areteideale_(s,d) donne la taille d'arete
74 // au point s dans la direction d (direction inactive pour l'instant)
75 // des lors toute arete issue d'un sommet s devrait avoir une longueur
76 // comprise entre 0.65 areteideale_(s,d) et 1.3 areteideale_(s,d)
79 // Les tableaux uvslf et uvpti sont supposes ne pas avoir de sommets identiques!
80 // De meme, un sommet d'une ligne fermee ne peut appartenir a une autre ligne fermee
84 // nutysu : numero de traitement de areteideale_() selon le type de surface
85 // 0 pas d'emploi de la fonction areteideale_() et aretmx est active
86 // 1 il existe une fonction areteideale_(s,d)
87 // dont seules les 2 premieres composantes de uv sont actives
88 // ... autres options a definir ...
89 // aretmx : longueur maximale des aretes de la future triangulation
90 // nblf : nombre de lignes fermees de la surface
91 // nudslf : numero du dernier sommet de chacune des nblf lignes fermees
92 // nudslf(0)=0 pour permettre la difference sans test
93 // Attention le dernier sommet de chaque ligne est raccorde au premier
94 // tous les sommets et les points internes ont des coordonnees
95 // UV differentes <=> Pas de point double!
96 // uvslf : uv des nudslf(nblf) sommets des lignes fermees
97 // nbpti : nombre de points internes futurs sommets de la triangulation
98 // uvpti : uv des points internes futurs sommets de la triangulation
102 // nbst : nombre de sommets de la triangulation finale
103 // uvst : coordonnees uv des nbst sommets de la triangulation
104 // nbt : nombre de triangles de la triangulation finale
105 // nust : 3 numeros dans uvst des sommets des nbt triangles
106 // ierr : 0 si pas d'erreur
108 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
109 // auteur : Alain Perronnet Analyse Numerique Paris UPMC decembre 2001
110 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
113 #define tempscpu TEMPSCPU
114 #define deltacpu DELTACPU
115 #define insoar INSOAR
116 #define azeroi AZEROI
117 #define fasoar FASOAR
118 #define teajte TEAJTE
119 #define tehote TEHOTE
120 #define tetrte TETRTE
121 #define aisoar AISOAR
122 #define tedela TEDELA
123 #define terefr TEREFR
124 #define tesuex TESUEX
125 #define teamqt TEAMQT
126 #define nusotr NUSOTR
127 #define qutr2d QUTR2D
128 #define surtd2 SURTD2
129 #define qualitetrte QUALITETRTE
131 #define areteideale ARETEIDEALE
134 #define tempscpu tempscpu_
135 #define deltacpu deltacpu_
136 #define insoar insoar_
137 #define azeroi azeroi_
138 #define fasoar fasoar_
139 #define teajte teajte_
140 #define tehote tehote_
141 #define tetrte tetrte_
142 #define aisoar aisoar_
143 #define tedela tedela_
144 #define terefr terefr_
145 #define tesuex tesuex_
146 #define teamqt teamqt_
147 #define nusotr nusotr_
148 #define qutr2d qutr2d_
149 #define surtd2 surtd2_
150 #define qualitetrte qualitetrte_
152 #define areteideale areteideale_
161 qualitetrte( R3 *mnpxyd,
162 Z & mosoar, Z & mxsoar, Z *mnsoar,
163 Z & moartr, Z & mxartr, Z *mnartr,
164 Z & nbtria, R & quamoy, R & quamin ); }
165 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
166 // but : calculer la qualite moyenne et minimale de la triangulation
167 // ----- actuelle definie par les tableaux nosoar et noartr
170 // mnpxyd : tableau des coordonnees 2d des points
171 // par point : x y distance_souhaitee
172 // mosoar : nombre maximal d'entiers par arete et
173 // indice dans nosoar de l'arete suivante dans le hachage
174 // mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
175 // attention: mxsoar>3*mxsomm obligatoire!
176 // nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
177 // chainage des aretes frontalieres, chainage du hachage des aretes
178 // hachage des aretes = nosoar(1)+nosoar(2)*2
179 // avec mxsoar>=3*mxsomm
180 // une arete i de nosoar est vide <=> nosoar(1,i)=0 et
181 // nosoar(2,arete vide)=l'arete vide qui precede
182 // nosoar(3,arete vide)=l'arete vide qui suit
183 // moartr : nombre maximal d'entiers par arete du tableau noartr
184 // mxartr : nombre maximal de triangles declarables
185 // noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
186 // arete1 = 0 si triangle vide => arete2 = triangle vide suivant
189 // nbtria : nombre de triangles internes au domaine
190 // quamoy : qualite moyenne des triangles actuels
191 // quamin : qualite minimale des triangles actuels
192 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
198 tempscpu( double & tempsec );
201 //Retourne le temps CPU utilise en secondes
207 deltacpu( R & dtcpu );
210 //Retourne le temps CPU utilise en secondes depuis le precedent appel
212 //initialiser le tableau mnsoar pour le hachage des aretes
217 insoar( Z & mxsomm, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar );
220 //mettre a zero les nb entiers de tab
225 azeroi( Z & nb, Z * tab );
232 fasoar( Z & ns1, Z & ns2, Z & nt1, Z & nt2, Z & nolign,
233 Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z * mnarst,
234 Z & noar, Z & ierr );
236 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
237 // but : former l'arete de sommet ns1-ns2 dans le hachage du tableau
238 // ----- nosoar des aretes de la triangulation
241 // ns1 ns2: numero pxyd des 2 sommets de l'arete
242 // nt1 : numero du triangle auquel appartient l'arete
243 // nt1=-1 si numero inconnu
244 // nt2 : numero de l'eventuel second triangle de l'arete si connu
245 // nt2=-1 si numero inconnu
246 // nolign : numero de la ligne fermee de l'arete
247 // =0 si l'arete n'est une arete de ligne
248 // ce numero est ajoute seulement si l'arete est creee
249 // mosoar : nombre maximal d'entiers par arete du tableau nosoar
250 // mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
253 // n1soar : numero de la premiere arete vide dans le tableau nosoar
254 // une arete i de nosoar est vide <=> nosoar(1,i)=0
255 // chainage des aretes vides amont et aval
256 // l'arete vide qui precede=nosoar(4,i)
257 // l'arete vide qui suit =nosoar(5,i)
258 // nosoar : numero des 2 sommets, no ligne, 2 triangles de l'arete,
259 // chainage momentan'e d'aretes, chainage du hachage des aretes
260 // hachage des aretes = min( nosoar(1), nosoar(2) )
261 // noarst : noarst(np) numero d'une arete du sommet np
263 // ierr : si < 0 en entree pas d'affichage en cas d'erreur du type
264 // "arete appartenant a plus de 2 triangles et a creer!"
265 // si >=0 en entree affichage de ce type d'erreur
268 // noar : >0 numero de l'arete retrouvee ou ajoutee
269 // ierr : =0 si pas d'erreur
270 // =1 si le tableau nosoar est sature
271 // =2 si arete a creer et appartenant a 2 triangles distincts
272 // des triangles nt1 et nt2
273 // =3 si arete appartenant a 2 triangles distincts
274 // differents des triangles nt1 et nt2
275 // =4 si arete appartenant a 2 triangles distincts
276 // dont le second n'est pas le triangle nt2
277 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
279 //initialisation du tableau letree et ajout dans letree des sommets 1 a nbsomm
284 teajte( Z & mxsomm, Z & nbsomm, R3 * mnpxyd, R3 * comxmi,
285 R & aretmx, Z & mxtree, Z * letree,
293 tehote( Z & nutysu, Z & nbarpi, Z & mxsomm, Z & nbsomm, R3 * mnpxyd,
294 R3 * comxmi, R & aretmx,
295 Z * letree, Z & mxqueu, Z * mnqueu,
298 // homogeneisation de l'arbre des te a un saut de taille au plus
299 // prise en compte des tailles d'aretes souhaitees autour des sommets initiaux
305 tetrte( R3 * comxmi, R & aretmx, Z & nbarpi, Z & mxsomm, R3 * mnpxyd,
306 Z & mxqueu, Z * mnqueu, Z * mntree,
307 Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar,
308 Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst,
311 // trianguler les triangles equilateraux feuilles a partir de leurs 3 sommets
312 // et des points de la frontiere, des points internes imposes interieurs
318 aisoar( Z & mosoar, Z & mxsoar, Z * mnsoar, Z & na );
320 // formation du chainage 6 des aretes internes a echanger eventuellement
326 tedela( R3 * mnpxyd, Z * mnarst,
327 Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z & na,
328 Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z & n );
330 // boucle sur les aretes internes (non sur une ligne de la frontiere)
331 // avec echange des 2 diagonales afin de rendre la triangulation delaunay
337 terefr( Z & nbarpi, R3 * mnpxyd,
338 Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar,
339 Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst,
340 Z & mxarcf, Z * mnarc1, Z * mnarc2,
341 Z * mnarc3, Z * mnarc4,
344 // detection des aretes frontalieres initiales perdues
345 // triangulation frontale pour les restaurer
351 tesuex( Z & nblf, Z * nulftr,
352 Z & ndtri0, Z & nbsomm, R3 * mnpxyd, Z * mnslig,
353 Z & mosoar, Z & mxsoar, Z * mnsoar,
354 Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst,
355 Z & nbtria, Z * mntrsu, Z & ierr );
357 // suppression des triangles externes a la surface
363 teamqt( Z & nutysu, R & aretmx, R & airemx,
364 Z * mnarst, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar,
365 Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr,
366 Z & mxarcf, Z * mntrcf, Z * mnstbo,
367 Z * n1arcf, Z * mnarcf, Z * mnarc1,
368 Z & nbarpi, Z & nbsomm, Z & mxsomm,
369 R3 * mnpxyd, Z * mnslig,
372 // amelioration de la qualite de la triangulation par
373 // barycentrage des sommets internes a la triangulation
374 // suppression des aretes trop longues ou trop courtes
375 // modification de la topologie des groupes de triangles
376 // mise en delaunay de la triangulation
382 nusotr( Z & nt, Z & mosoar, Z * mnsoar, Z & moartr, Z * mnartr,Z * nosotr );
384 //retrouver les numero des 3 sommets du triangle nt
390 qutr2d( R3 & p1, R3 & p2, R3 & p3, R & qualite );
392 //calculer la qualite d'un triangle de R2 de sommets p1, p2, p3
398 surtd2( R3 & p1, R3 & p2, R3 & p3 );
400 //calcul de la surface d'un triangle defini par 3 points de r**2