ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur2d_outil.cpp
Revision: 446
Committed: Fri Oct 25 19:30:16 2013 UTC (11 years, 6 months ago) by francois
File size: 31233 byte(s)
Log Message:
suppression de la vieille compatibilité avec la these de VF sur la carte de taille. Maintenant la carte de taille est a priori obligatoirement

File Contents

# User Rev Content
1 5 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4 francois 331 // Jean Christophe Cuilli�re et Vincent FRANCOIS
5     // D�partement de G�nie M�canique - UQTR
6 5 //------------------------------------------------------------
7 francois 331 // Le projet MAGIC est un projet de recherche du d�partement
8     // de g�nie m�canique de l'Universit� du Qu�bec �
9     // Trois Rivi�res
10     // Les librairies ne peuvent �tre utilis�es sans l'accord
11 5 // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // mailleur2d_outil.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20 francois 331 // Version du 02/03/2006 � 11H23
21 5 //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26     #include <math.h>
27     #include "mailleur2d.h"
28     #include "ot_mathematique.h"
29     #include "ot_boite_2D.h"
30     #include "tpl_map_entite.h"
31     #include "m3d_triangle.h"
32    
33    
34    
35    
36    
37    
38     int MAILLEUR2D::noeud_est_dans_triangle(MG_NOEUD* noeud,MG_TRIANGLE *triangle)
39     {
40     return noeud_est_dans_triangle(noeud,triangle->get_noeud1(),triangle->get_noeud2(),triangle->get_noeud3());
41     }
42    
43    
44     int MAILLEUR2D::noeud_est_dans_triangle(MG_NOEUD* noeud,MG_NOEUD *noeud1,MG_NOEUD *noeud2,MG_NOEUD *noeud3)
45     {
46     double du=decalage->calcul_decalage_parametre_u(noeud1->get_u());
47     double dv=decalage->calcul_decalage_parametre_v(noeud1->get_v());
48    
49     double u1=decalage->decalage_parametre_u(noeud1->get_u(),du);
50     double v1=decalage->decalage_parametre_v(noeud1->get_v(),dv);
51     double u2=decalage->decalage_parametre_u(noeud2->get_u(),du);
52     double v2=decalage->decalage_parametre_v(noeud2->get_v(),dv);
53     double u3=decalage->decalage_parametre_u(noeud3->get_u(),du);
54     double v3=decalage->decalage_parametre_v(noeud3->get_v(),dv);
55     double u=decalage->decalage_parametre_u(noeud->get_u(),du);
56     double v=decalage->decalage_parametre_v(noeud->get_v(),dv);
57     double eps=0.0001;
58     double delta=(u2-u1)*(v3-v1)-(v2-v1)*(u3-u1);
59     double precision=std::max(fabs(u1),fabs(v1));
60     precision=std::max(precision,fabs(u2));
61     precision=std::max(precision,fabs(v2));
62     precision=std::max(precision,fabs(u3));
63     precision=std::max(precision,fabs(v3));
64     precision=std::max(precision,fabs(u));
65     precision=std::max(precision,fabs(v));
66     if (OPERATEUR::egal(delta,0.0,precision*eps)) return(0);
67     double xsi=1.0/delta*((v3-v1)*(u-u1)-(u3-u1)*(v-v1));
68     double eta=1.0/delta*((u2-u1)*(v-v1)-(v2-v1)*(u-u1));
69     if (!((eta > eps) && (xsi > eps) && ((eta+xsi) < 1.0-eps))) return(0);
70     return (1);
71     }
72    
73    
74    
75    
76    
77    
78     int MAILLEUR2D::insere_segment(MG_FACE *mgface,MG_SEGMENT **nv_segment,MG_NOEUD* noeud1,MG_NOEUD* noeud2,int type_validation)
79     {
80    
81     double du=decalage->calcul_decalage_parametre_u(noeud1->get_u());
82     double dv=decalage->calcul_decalage_parametre_v(noeud1->get_v());
83     double u1=decalage->decalage_parametre_u(noeud1->get_u(),du);
84     double v1=decalage->decalage_parametre_v(noeud1->get_v(),dv);
85     double u2=decalage->decalage_parametre_u(noeud2->get_u(),du);
86     double v2=decalage->decalage_parametre_v(noeud2->get_v(),dv);
87     double ui=0.5*(u1+u2);
88     double vi=0.5*(v1+v2);
89     double uii=decalage->decalage_parametre_u(ui,-du);
90     double vii=decalage->decalage_parametre_v(vi,-dv);
91     double longueur=sqrt((u2-u1)*(u2-u1)+(v2-v1)*(v2-v1));
92    
93     if (type_validation==TOUS_SEGMENT)
94     {
95     TPL_MAP_ENTITE<MG_SEGMENT*> liste_trouvee;
96     quadtree_de_segment->rechercher(uii,vii,longueur/2.,liste_trouvee);
97     for (int j=0;j<liste_trouvee.get_nb();j++)
98     {
99     MG_SEGMENT* mgsegment=liste_trouvee.get(j);
100     if ( ((noeud1==mgsegment->get_noeud1()) && (noeud2==mgsegment->get_noeud2())) || ((noeud1==mgsegment->get_noeud2()) && (noeud2==mgsegment->get_noeud1())))
101     return(0);
102     int res=intersection_segment_segment(noeud1,noeud2,mgsegment->get_noeud1(),mgsegment->get_noeud2());
103     if (res!=0)
104     return(0);
105     }
106     }
107     if (type_validation==TOUS_FRONT)
108     {
109     TPL_MAP_ENTITE<MG_FRONT_2D*> liste_trouvee;
110     quadtree_de_front->rechercher(uii,vii,longueur/2.,liste_trouvee);
111     for (int j=0;j<liste_trouvee.get_nb();j++)
112     {
113     MG_FRONT_2D* ft=liste_trouvee.get(j);
114     MG_SEGMENT* mgsegment=ft->get_segment();
115     if ( ((noeud1==mgsegment->get_noeud1()) && (noeud2==mgsegment->get_noeud2())) || ((noeud1==mgsegment->get_noeud2()) && (noeud2==mgsegment->get_noeud1())))
116     return(0);
117     int res=intersection_segment_segment(noeud1,noeud2,mgsegment->get_noeud1(),mgsegment->get_noeud2());
118     if (res!=0)
119     return(0);
120     }
121     }
122    
123 francois 35 MG_SEGMENT* mgsegment=mg_maillage->ajouter_mg_segment(mgface,noeud1,noeud2,MAILLEUR_AUTO);
124 5 quadtree_de_segment->inserer(mgsegment);
125     *nv_segment=mgsegment;
126     return(1);
127     }
128    
129    
130     void MAILLEUR2D::supprime_segment(MG_SEGMENT* mgsegment)
131     {
132     quadtree_de_segment->supprimer(mgsegment);
133     mg_maillage->supprimer_mg_segmentid(mgsegment->get_id());
134     }
135    
136    
137     int MAILLEUR2D::genere_noeud(MG_FACE* mgface,MG_FRONT_2D* front,MG_FRONT_2D **front_rencontre,MG_NOEUD **noeud_rencontre)
138     {
139     OT_VECTEUR_3D w(0.,0.,1.);
140     MG_NOEUD* noeud1=front->get_noeud1();
141     MG_NOEUD* noeud2=front->get_noeud2();
142     double du=decalage->calcul_decalage_parametre_u(noeud1->get_u());
143     double dv=decalage->calcul_decalage_parametre_v(noeud1->get_v());
144     double u1=decalage->decalage_parametre_u(noeud1->get_u(),du);
145     double v1=decalage->decalage_parametre_v(noeud1->get_v(),dv);
146     double u2=decalage->decalage_parametre_u(noeud2->get_u(),du);
147     double v2=decalage->decalage_parametre_v(noeud2->get_v(),dv);
148    
149     double longueur_segment=calcule_longueur_segment_metrique(mgface,front->get_segment());
150     double longueur_desiree=0.8660254037844386*(MAILLEUR2D::priorite_metrique+longueur_segment-longueur_segment*MAILLEUR2D::priorite_metrique);
151     longueur_desiree=longueur_desiree/front->get_ifail();
152    
153    
154     double longueur_calculee=0.;
155     double longueur_calculee_pas_precedent;
156     double umilieu=0.5*(u1+u2);
157     double vmilieu=0.5*(v1+v2);
158     double param_milieu[2]={umilieu-du,vmilieu-dv};
159     double E,F,G;
160    
161     // je pense qu il faudrait changer ici
162     // perpendiculaire dans l espace parametrique ou perpendiculaire dans la metrique ou dans la combinaison des deux
163     mgface->get_EFG(param_milieu,E,F,G);
164     double deno=E*(u2-u1)*(u2-u1)+G*(v2-v1)*(v2-v1)+2*F*(u2-u1)*(v2-v1);
165     double nume=(v2-v1)*(u2-u1)*(E-G)+F*((v2-v1)*(v2-v1)-(u2-u1)*(u2-u1));
166     double teta=atan(nume/deno);
167    
168     /*double tenseur_metrique[9];
169     double xyzdu[3];
170     double xyzdv[3];
171     metrique->evaluer(param_milieu,tenseur_metrique);
172     mgface->deriver(param_milieu,xyzdu,xyzdv);
173    
174     E = (xyzdu[0]*tenseur_metrique[0]+xyzdu[1]*tenseur_metrique[1]+xyzdu[2]*tenseur_metrique[2])*xyzdu[0]+(xyzdu[0]*tenseur_metrique[1]+xyzdu[1]*tenseur_metrique[4]+xyzdu[2]*tenseur_metrique[5])*xyzdu[1]+(xyzdu[0]*tenseur_metrique[2]+xyzdu[1]*tenseur_metrique[5]+xyzdu[2]*tenseur_metrique[8])*xyzdu[2];
175     F = (xyzdv[0]*tenseur_metrique[0]+xyzdv[1]*tenseur_metrique[1]+xyzdv[2]*tenseur_metrique[2])*xyzdu[0]+(xyzdv[0]*tenseur_metrique[1]+xyzdv[1]*tenseur_metrique[4]+xyzdv[2]*tenseur_metrique[5])*xyzdu[1]+(xyzdv[0]*tenseur_metrique[2]+xyzdv[1]*tenseur_metrique[5]+xyzdv[2]*tenseur_metrique[8])*xyzdu[2];
176     G = (xyzdv[0]*tenseur_metrique[0]+xyzdv[1]*tenseur_metrique[1]+xyzdv[2]*tenseur_metrique[2])*xyzdv[0]+(xyzdv[0]*tenseur_metrique[1]+xyzdv[1]*tenseur_metrique[4]+xyzdv[2]*tenseur_metrique[5])*xyzdv[1]+(xyzdv[0]*tenseur_metrique[2]+xyzdv[1]*tenseur_metrique[5]+xyzdv[2]*tenseur_metrique[8])*xyzdv[2];
177    
178     double deno=E*(u2-u1)*(u2-u1)+G*(v2-v1)*(v2-v1)+2*F*(u2-u1)*(v2-v1);
179     double nume=(v2-v1)*(u2-u1)*(E-G)+F*((v2-v1)*(v2-v1)-(u2-u1)*(u2-u1));
180     double teta=atan(nume/deno);
181    
182     */
183    
184     OT_VECTEUR_3D vecteur_du_front(u2-u1,v2-v1,0.);
185     OT_VECTEUR_3D vecteur_normal_front=w&vecteur_du_front;
186     double longueur_parametrique=vecteur_du_front.get_longueur();
187     vecteur_du_front.norme();
188     vecteur_normal_front.norme();
189     double dt=0.03125;
190     double ti;
191     double tii=0;
192     double uii;
193     double vii;
194     while (longueur_calculee<longueur_desiree)
195     {
196     refresh();
197     ti=tii;
198     dt=0.03125;
199     double param_tii[2];
200     int valide_u=0;
201     int valide_v=0;
202     int valide_xyz=0;
203     while ((valide_u & valide_v & valide_xyz)!=1)
204     {
205     tii=ti+longueur_parametrique*dt;
206     uii=umilieu+tii*(vecteur_du_front.get_x()*sin(teta)+vecteur_normal_front.get_x()*cos(teta));
207     vii=vmilieu+tii*(vecteur_du_front.get_y()*sin(teta)+vecteur_normal_front.get_y()*cos(teta));
208     param_tii[0]=uii-du;
209     param_tii[1]=vii-dv;
210     if (mgface->valide_parametre_u(param_tii[0])) valide_u=1;
211     if (mgface->valide_parametre_v(param_tii[1])) valide_v=1;
212     if ((valide_u & valide_v)!=1) dt=dt/2.;
213     if ((valide_u & valide_v)==1)
214     {
215     double xyz[3];
216     mgface->evaluer(param_tii,xyz);
217     valide_xyz=metrique->valide_parametre(xyz);
218     if ((valide_xyz)!=1) dt=dt/2.;
219     }
220     if (dt<0.0000001) return ERREUR;
221     }
222     longueur_calculee_pas_precedent=longueur_calculee;
223     double t=0.7886751345*ti+0.2113248654*tii;
224     double ut=vecteur_du_front.get_x()*sin(teta)+vecteur_normal_front.get_x()*cos(teta);
225     double vt=vecteur_du_front.get_y()*sin(teta)+vecteur_normal_front.get_y()*cos(teta);
226     double u=umilieu+t*ut;
227     double v=vmilieu+t*vt;;
228     double param_integration1[2]={u-du,v-dv};
229     double tenseur_metrique[9];
230     double xyzdu[3];
231     double xyzdv[3];
232 francois 446 double xyz[3];
233 5 mgface->evaluer(param_integration1,xyz);
234     metrique->evaluer(xyz,tenseur_metrique);
235     mgface->deriver(param_integration1,xyzdu,xyzdv);
236     double t3 = xyzdu[0]*ut+xyzdv[0]*vt;
237     double t7 = xyzdu[1]*ut+xyzdv[1]*vt;
238     double t11 = xyzdu[2]*ut+xyzdv[2]*vt;
239     double t13 = t3*tenseur_metrique[0]+t7*tenseur_metrique[3]+t11*tenseur_metrique[6];
240     double t18 = t3*tenseur_metrique[1]+t7*tenseur_metrique[4]+t11*tenseur_metrique[7];
241     double t23 = t3*tenseur_metrique[2]+t7*tenseur_metrique[5]+t11*tenseur_metrique[8];
242     double facteur = (t13*xyzdu[0]+t18*xyzdu[1]+t23*xyzdu[2])*ut+(t13*xyzdv[0]+t18*xyzdv[1]+t23*xyzdv[2])*vt;
243     longueur_calculee=longueur_calculee+0.5*(tii-ti)*sqrt(facteur);
244     t=0.7886751345*tii+0.2113248654*ti;
245     u=umilieu+t*ut;
246     v=vmilieu+t*vt;;
247     double param_integration2[2]={u-du,v-dv};
248     mgface->evaluer(param_integration2,xyz);
249     metrique->evaluer(xyz,tenseur_metrique);
250     mgface->deriver(param_integration2,xyzdu,xyzdv);
251     t3 = xyzdu[0]*ut+xyzdv[0]*vt;
252     t7 = xyzdu[1]*ut+xyzdv[1]*vt;
253     t11 = xyzdu[2]*ut+xyzdv[2]*vt;
254     t13 = t3*tenseur_metrique[0]+t7*tenseur_metrique[3]+t11*tenseur_metrique[6];
255     t18 = t3*tenseur_metrique[1]+t7*tenseur_metrique[4]+t11*tenseur_metrique[7];
256     t23 = t3*tenseur_metrique[2]+t7*tenseur_metrique[5]+t11*tenseur_metrique[8];
257     facteur = (t13*xyzdu[0]+t18*xyzdu[1]+t23*xyzdu[2])*ut+(t13*xyzdv[0]+t18*xyzdv[1]+t23*xyzdv[2])*vt;
258     longueur_calculee=longueur_calculee+0.5*(tii-ti)*sqrt(facteur);
259     }
260     double ut=vecteur_du_front.get_x()*sin(teta)+vecteur_normal_front.get_x()*cos(teta);
261     double vt=vecteur_du_front.get_y()*sin(teta)+vecteur_normal_front.get_y()*cos(teta);
262     double t=ti+(tii-ti)*(longueur_desiree-longueur_calculee_pas_precedent)/(longueur_calculee-longueur_calculee_pas_precedent);
263     double udecale=umilieu+t*ut;
264     double vdecale=vmilieu+t*vt;
265     double u=decalage->decalage_parametre_u(udecale,-du);
266     double v=decalage->decalage_parametre_v(vdecale,-dv);
267     double param_noeud_cree[2]={u,v};
268    
269    
270     // recherhce des element du front proche de u,v;
271     TPL_MAP_ENTITE<MG_FRONT_2D*> liste_trouvee;
272    
273     double umin=std::min(u1,u2);
274     umin=std::min(umin,udecale);
275     double umax=std::max(u1,u2);
276     umax=std::max(umax,udecale);
277     double vmin=std::min(v1,v2);
278     vmin=std::min(vmin,vdecale);
279     double vmax=std::max(v1,v2);
280     vmax=std::max(vmax,vdecale);
281     BOITE_2D boite_recherche(umin,vmin,umax,vmax);
282     double longueur_recherche=boite_recherche.get_rayon()*2.;
283    
284     quadtree_de_front->rechercher(u,v,longueur_recherche,liste_trouvee);
285     int nb_entite=liste_trouvee.get_nb();
286    
287     double distance_reference = -1.;
288     double angle_reference=2.*M_PI;
289     unsigned long id_noeud_reference = 0;
290     MG_FRONT_2D* front_reference=NULL;
291    
292     for (int i=0;i<nb_entite;i++)
293     {
294     MG_FRONT_2D* front_courant=liste_trouvee.get(i);
295     MG_NOEUD* noeud_front1=front_courant->get_noeud1();
296     MG_NOEUD* noeud_front2=front_courant->get_noeud2();
297     double unoeudfront1=decalage->decalage_parametre_u(noeud_front1->get_u(),du);
298     double vnoeudfront1=decalage->decalage_parametre_v(noeud_front1->get_v(),dv);
299     double unoeudfront2=decalage->decalage_parametre_u(noeud_front2->get_u(),du);
300     double vnoeudfront2=decalage->decalage_parametre_v(noeud_front2->get_v(),dv);
301     double distance_noeudfront1=calcule_distance_metrique(mgface,udecale,vdecale,unoeudfront1,vnoeudfront1,du,dv);
302     if ((distance_noeudfront1<distance_reference) || (distance_reference<0.) || (id_noeud_reference==noeud_front1->get_id()))
303     if (noeud_front1->get_id()!=noeud1->get_id())
304     if (noeud_front1->get_id()!=noeud2->get_id())
305     if (id_noeud_reference==noeud_front1->get_id())
306     {
307     refresh();
308     OT_VECTEUR_3D vecteur_baseu(u1-unoeudfront1,v1-vnoeudfront1,0.);
309     OT_VECTEUR_3D vecteur_front(unoeudfront2-unoeudfront1,vnoeudfront2-vnoeudfront1,0.);
310     OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
311     vecteur_baseu.norme();
312     vecteur_basev.norme();
313     vecteur_front.norme();
314     double cosangle=vecteur_baseu*vecteur_front;
315     double sinangle=vecteur_basev*vecteur_front;
316     sinangle=-sinangle;
317     if (cosangle>1.) cosangle=1.;
318     if (cosangle<-1.) cosangle=(-1.);
319     double angle=acos(cosangle);
320     if (sinangle<(-0.0001)) angle=(-angle);
321     if (angle<0.) angle=angle+2.*M_PI;
322     if (angle<angle_reference)
323     {
324     angle_reference=angle;
325     front_reference=front_courant;
326     }
327     }
328     else
329     {
330     refresh();
331     OT_VECTEUR_3D vecteur_baseu(u1-unoeudfront1,v1-vnoeudfront1,0.);
332     OT_VECTEUR_3D vecteur_front(unoeudfront2-unoeudfront1,vnoeudfront2-vnoeudfront1,0.);
333     OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
334     vecteur_baseu.norme();
335     vecteur_basev.norme();
336     vecteur_front.norme();
337     double cosangle=vecteur_baseu*vecteur_front;
338     double sinangle=vecteur_basev*vecteur_front;
339     sinangle=-sinangle;
340     if (cosangle>1.) cosangle=1.;
341     if (cosangle<-1.) cosangle=(-1.);
342     double angle=acos(cosangle);
343     if (sinangle<(-0.0001)) angle=(-angle);
344     if (angle<0.) angle=angle+2.*M_PI;
345     distance_reference=distance_noeudfront1;
346     angle_reference=angle;
347     id_noeud_reference=noeud_front1->get_id();
348     front_reference=front_courant;
349     }
350     }
351    
352     if ((front_reference!=NULL) && (distance_reference<longueur_desiree*2./sqrt(3)))
353     {
354     MG_NOEUD* noeud=mg_maillage->get_mg_noeudid(id_noeud_reference);
355     double uref=decalage->decalage_parametre_u(noeud->get_u(),du);
356     double vref=decalage->decalage_parametre_v(noeud->get_v(),dv);
357     double distance=calcule_distance_metrique(mgface,umilieu,vmilieu,uref,vref,du,dv);
358     if (distance<1.5*longueur_desiree)
359     {
360     (*front_rencontre)=front_reference;
361     (*noeud_rencontre)=noeud;
362     return FRONT_RENCONTRE;
363     }
364     }
365     double coord[3];
366     mgface->evaluer(param_noeud_cree,coord);
367 francois 35 MG_NOEUD* noeud=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],MAILLEUR_AUTO);
368 5 noeud->change_u(param_noeud_cree[0]);
369     noeud->change_v(param_noeud_cree[1]);
370     (*noeud_rencontre)=noeud;
371     (*front_rencontre)=NULL;
372     return NOEUD_CREE;
373     }
374    
375    
376     double MAILLEUR2D::calcule_longueur_segment_metrique(MG_FACE* mgface,MG_SEGMENT* mgsegment)
377     {
378     MG_NOEUD* noeud1=mgsegment->get_noeud1();
379     MG_NOEUD* noeud2=mgsegment->get_noeud2();
380    
381     double du=decalage->calcul_decalage_parametre_u(noeud1->get_u());
382     double dv=decalage->calcul_decalage_parametre_v(noeud1->get_v());
383     double u1=decalage->decalage_parametre_u(noeud1->get_u(),du);
384     double v1=decalage->decalage_parametre_v(noeud1->get_v(),dv);
385     double u2=decalage->decalage_parametre_u(noeud2->get_u(),du);
386     double v2=decalage->decalage_parametre_v(noeud2->get_v(),dv);
387     return calcule_distance_metrique(mgface,u1,v1,u2,v2,du,dv);
388     }
389    
390    
391     double MAILLEUR2D::calcule_distance_metrique(MG_FACE* mgface,double u1,double v1,double u2,double v2,double du,double dv)
392     {
393     double longueur_calculee=0.;
394     double param_debut[2]={u1-du,v1-dv};
395     double E,F,G;
396     mgface->get_EFG(param_debut,E,F,G);
397    
398     double dt=0.03125;
399     double ti;
400     double tii=0;
401    
402     while (tii<1.)
403     {
404     refresh();
405     ti=tii;
406     tii=ti+dt;
407     if (tii>1.) tii=1.;
408     double t=0.7886751345*ti+0.2113248654*tii;
409     double u=u1+t*(u2-u1);
410     double v=v1+t*(v2-v1);
411     double ut=u2-u1;
412     double vt=v2-v1;
413     double param_integration1[2]={u-du,v-dv};
414     double tenseur_metrique[9];
415     double xyzdu[3];
416     double xyzdv[3];
417     double xyz[3];
418     mgface->evaluer(param_integration1,xyz);
419 francois 331 if (metrique->valide_parametre(xyz)) metrique->evaluer(xyz,tenseur_metrique);
420     else return 1e308;
421 francois 446 mgface->deriver(param_integration1,xyzdu,xyzdv);
422 5 double t3 = xyzdu[0]*ut+xyzdv[0]*vt;
423     double t7 = xyzdu[1]*ut+xyzdv[1]*vt;
424     double t11 = xyzdu[2]*ut+xyzdv[2]*vt;
425     double t13 = t3*tenseur_metrique[0]+t7*tenseur_metrique[3]+t11*tenseur_metrique[6];
426     double t18 = t3*tenseur_metrique[1]+t7*tenseur_metrique[4]+t11*tenseur_metrique[7];
427     double t23 = t3*tenseur_metrique[2]+t7*tenseur_metrique[5]+t11*tenseur_metrique[8];
428     double facteur = (t13*xyzdu[0]+t18*xyzdu[1]+t23*xyzdu[2])*ut+(t13*xyzdv[0]+t18*xyzdv[1]+t23*xyzdv[2])*vt;
429     longueur_calculee=longueur_calculee+0.5*(tii-ti)*sqrt(facteur);
430     t=0.7886751345*tii+0.2113248654*ti;
431     u=u1+t*(u2-u1);
432     v=v1+t*(v2-v1);
433     double param_integration2[2]={u-du,v-dv};
434     mgface->evaluer(param_integration2,xyz);
435 francois 331 if (metrique->valide_parametre(xyz)) metrique->evaluer(xyz,tenseur_metrique);
436     else return 1e308;
437 5 mgface->deriver(param_integration2,xyzdu,xyzdv);
438     t3 = xyzdu[0]*ut+xyzdv[0]*vt;
439     t7 = xyzdu[1]*ut+xyzdv[1]*vt;
440     t11 = xyzdu[2]*ut+xyzdv[2]*vt;
441     t13 = t3*tenseur_metrique[0]+t7*tenseur_metrique[3]+t11*tenseur_metrique[6];
442     t18 = t3*tenseur_metrique[1]+t7*tenseur_metrique[4]+t11*tenseur_metrique[7];
443     t23 = t3*tenseur_metrique[2]+t7*tenseur_metrique[5]+t11*tenseur_metrique[8];
444     facteur = (t13*xyzdu[0]+t18*xyzdu[1]+t23*xyzdu[2])*ut+(t13*xyzdv[0]+t18*xyzdv[1]+t23*xyzdv[2])*vt;
445     longueur_calculee=longueur_calculee+0.5*(tii-ti)*sqrt(facteur);
446     }
447     return longueur_calculee;
448     }
449    
450    
451    
452    
453    
454    
455     MG_TRIANGLE* MAILLEUR2D::insere_triangle(MG_ELEMENT_TOPOLOGIQUE* topo,class MG_NOEUD *mgnoeud1,class MG_NOEUD *mgnoeud2,class MG_NOEUD *mgnoeud3)
456     {
457     MG_SEGMENT* mgsegment1=mg_maillage->get_mg_segment(mgnoeud1->get_id(),mgnoeud2->get_id());
458     MG_SEGMENT* mgsegment2=mg_maillage->get_mg_segment(mgnoeud2->get_id(),mgnoeud3->get_id());
459     MG_SEGMENT* mgsegment3=mg_maillage->get_mg_segment(mgnoeud3->get_id(),mgnoeud1->get_id());
460 francois 35 if (mgsegment1==NULL) mgsegment1=mg_maillage->ajouter_mg_segment(topo,mgnoeud1,mgnoeud2,MAILLEUR_AUTO);
461     if (mgsegment2==NULL) mgsegment2=mg_maillage->ajouter_mg_segment(topo,mgnoeud2,mgnoeud3,MAILLEUR_AUTO);
462     if (mgsegment3==NULL) mgsegment3=mg_maillage->ajouter_mg_segment(topo,mgnoeud3,mgnoeud1,MAILLEUR_AUTO);
463 francois 54 M3D_TRIANGLE* mtriangle=new M3D_TRIANGLE(topo,mgnoeud1,mgnoeud2,mgnoeud3,mgsegment1,mgsegment2,mgsegment3,MAILLEUR_AUTO);
464 5 mg_maillage->ajouter_mg_triangle(mtriangle);
465     double qual=OPERATEUR::qualite_triangle(mgnoeud1->get_coord(),mgnoeud2->get_coord(),mgnoeud3->get_coord());
466     mtriangle->change_qualite(qual);
467     std::pair<const double,M3D_TRIANGLE*> tmp(mtriangle->get_qualite(),mtriangle);
468     lst_tri_qual.insert(tmp);
469     return mtriangle;
470     }
471    
472     int MAILLEUR2D::triangle_est_dans_bon_sens(MG_FACE* face,MG_NOEUD* noeud1,MG_NOEUD *noeud2,MG_NOEUD *noeud3)
473     {
474     double* xyz1=noeud1->get_coord();
475     double* xyz2=noeud2->get_coord();
476     double* xyz3=noeud3->get_coord();
477     OT_VECTEUR_3D n1n3(xyz1,xyz3);
478     OT_VECTEUR_3D n1n2(xyz1,xyz2);
479     double uv[2];
480     face->inverser(uv,xyz1);
481     double n[3];
482     face->calcul_normale_unitaire(uv,n);
483     OT_VECTEUR_3D nmat=n&n1n3;
484     nmat.norme();
485     n1n2.norme();
486     if (nmat*n1n2<0) return 0;
487     return 1;
488     }
489    
490     int MAILLEUR2D::bouge_point(MG_FACE* mgface,MG_NOEUD* mg_noeud,double& crit,double &u,double& v,double& x,double& y, double& z)
491     {
492     if (mg_noeud->get_lien_topologie()!=mgface) return 0;
493     if (mg_noeud->get_id()<=idavantprogresse) return 0;
494     double du=decalage->calcul_decalage_parametre_u(mg_noeud->get_u());
495     double dv=decalage->calcul_decalage_parametre_v(mg_noeud->get_v());
496     double u1=decalage->decalage_parametre_u(mg_noeud->get_u(),du);
497     double v1=decalage->decalage_parametre_v(mg_noeud->get_v(),dv);
498    
499     double uopt=0.;
500     double vopt=0.;
501     double qual_dep=1.;
502     int nb_tri=mg_noeud->get_lien_triangle()->get_nb();
503     for (int i=0;i<nb_tri;i++)
504     {
505     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)mg_noeud->get_lien_triangle()->get(i);
506     qual_dep=std::min(qual_dep,tri->get_qualite());
507     MG_NOEUD* no1=tri->get_noeud1();
508     MG_NOEUD* no2=tri->get_noeud2();
509     MG_NOEUD* no3=tri->get_noeud3();
510     MG_NOEUD *noeud1,*noeud2;
511     if (no1==mg_noeud)
512     {
513     noeud1=no2;
514     noeud2=no3;
515     }
516     if (no2==mg_noeud)
517     {
518     noeud1=no1;
519     noeud2=no3;
520     }
521     if (no3==mg_noeud)
522     {
523     noeud1=no1;
524     noeud2=no2;
525     }
526     double u2=noeud1->get_u()+du;
527     double v2=noeud1->get_v()+dv;
528     uopt=uopt+u2;
529     vopt=vopt+v2;
530     u2=noeud2->get_u()+du;
531     v2=noeud2->get_v()+dv;
532     uopt=uopt+u2;
533     vopt=vopt+v2;
534     }
535     uopt=uopt/2./nb_tri;
536     vopt=vopt/2./nb_tri;
537    
538     double ddeb=sqrt((u1-uopt)*(u1-uopt)+(v1-vopt)*(v1-vopt));
539     double alpha=0.5;
540     double d=alpha*ddeb;
541     double qual=qual_dep;
542     double testu[8]={1.,-1.,0.,0.,0.707106781,-0.707106781,-0.707106781,0.707106781};
543     double testv[8]={0.,0.,1.,-1.,0.707106781,0.707106781,-0.707106781,-0.707106781};
544     double uu=u1;
545     double vv=v1;
546     while (alpha>0.09)
547     {
548     double qualcoq=0.;
549     for (int nb_essai=0;nb_essai<8;nb_essai++)
550     {
551     double uv[2];
552     double xyz[3];
553     uv[0]=uu+d*testu[nb_essai]-du;
554     uv[1]=vv+d*testv[nb_essai]-dv;
555     int valide1=mgface->valide_parametre_u(uv[0]);
556     int valide2=mgface->valide_parametre_v(uv[1]);
557     if (!((valide1) && (valide2) )) break;
558     mgface->evaluer(uv,xyz);
559     double qual1=1.;
560     for (int i=0;i<nb_tri;i++)
561     {
562     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)mg_noeud->get_lien_triangle()->get(i);
563     MG_NOEUD* no1=tri->get_noeud1();
564     MG_NOEUD* no2=tri->get_noeud2();
565     MG_NOEUD* no3=tri->get_noeud3();
566     double *xyz1=no1->get_coord();
567     double *xyz2=no2->get_coord();
568     double *xyz3=no3->get_coord();
569     if (no1==mg_noeud) xyz1=xyz;
570     if (no2==mg_noeud) xyz2=xyz;
571     if (no3==mg_noeud) xyz3=xyz;
572     double qualtmp=OPERATEUR::qualite_triangle(xyz1,xyz2,xyz3);
573     OT_VECTEUR_3D n1n3(xyz1,xyz3);
574     OT_VECTEUR_3D n1n2(xyz1,xyz2);
575     double xyznormal[3];
576     mgface->calcul_normale_unitaire(uv,xyznormal);
577     OT_VECTEUR_3D normalface(xyznormal);
578     OT_VECTEUR_3D normal=normalface&n1n3;
579     normal.norme();
580     n1n2.norme();
581     if (normal*n1n2<0.0001) qualtmp=0.;
582     if (qualtmp<qual1) qual1=qualtmp;
583     }
584     if (qual1>qualcoq)
585     {
586     qualcoq=qual1;
587     crit=qualcoq;
588     u=uv[0]+du;
589     v=uv[1]+dv;
590     }
591     }
592    
593     if (qualcoq<qual+0.0001) alpha=alpha-0.1;
594     else
595     {
596     qual=qualcoq;
597     uu=u;
598     vv=v;
599     }
600     d=ddeb*alpha;
601    
602     }
603     if (qual>qual_dep)
604     {
605     u=decalage->decalage_parametre_u(u,-du);
606     v=decalage->decalage_parametre_v(v,-dv);
607     double uv[2];
608     uv[0]=u;
609     uv[1]=v;
610     double xyz[3];
611     mgface->evaluer(uv,xyz);
612     x=xyz[0];
613     y=xyz[1];
614     z=xyz[2];
615     return 1;
616     }
617     return 0;
618     }
619    
620    
621    
622    
623    
624    
625    
626    
627    
628    
629    
630    
631    
632    
633    
634     // PARTIE DE CODE RECUPERER DE MON PROJET DE DEA
635     // TRES ILLISIBLE MAIS FONCTIONNEL
636     // POIL AU MARRON
637    
638     #define PSCA(a,b) (a[0]*b[0]+a[1]*b[1]+a[2]*b[2])
639     #define EGAL(x,y,eps) (float)fabs((double)(x-y))<eps
640     #define DETER(a,b,c,d) (a*d-b*c)
641    
642     int MAILLEUR2D::intersection_segment_segment(MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4)
643     {
644    
645     double du=decalage->calcul_decalage_parametre_u(noeud1->get_u());
646     double dv=decalage->calcul_decalage_parametre_v(noeud1->get_v());
647     double ua=decalage->decalage_parametre_u(noeud1->get_u(),du);
648     double va=decalage->decalage_parametre_v(noeud1->get_v(),dv);
649     double ub=decalage->decalage_parametre_u(noeud2->get_u(),du);
650     double vb=decalage->decalage_parametre_v(noeud2->get_v(),dv);
651     double um=decalage->decalage_parametre_u(noeud3->get_u(),du);
652     double vm=decalage->decalage_parametre_v(noeud3->get_v(),dv);
653     double un=decalage->decalage_parametre_u(noeud4->get_u(),du);
654     double vn=decalage->decalage_parametre_v(noeud4->get_v(),dv);
655     double ab[3];
656     double nm[3];
657     double am[3];
658     ab[0]=ub-ua;
659     ab[1]=vb-va;
660     ab[2]=0.;
661     nm[0]=um-un;
662     nm[1]=vm-vn;
663     nm[2]=0.;
664     am[0]=um-ua;
665     am[1]=vm-va;
666     am[2]=0.;
667     int equation[4];
668     equation[0]=1; /* etat de l'equation 0 */
669     equation[1]=1;
670     equation[2]=1;
671     equation[3]=3; /* cette variable comporte le bilan du nombre d'equation */
672     double eps2=PSCA(ab,ab);
673     double eps=sqrt(eps2);
674     eps=eps*0.0001;
675     eps2=eps2*0.0001;
676     /* recherche du nombre d'equation -> inter franche ou para ou confondu */
677     if ( (EGAL(ab[0],0,eps)) && (EGAL(nm[0],0,eps)) )
678     if (EGAL(am[0],0,eps)) equation[0]=0; else return(0);
679     if ( (EGAL(ab[1],0,eps)) && (EGAL(nm[1],0,eps)) )
680     if (EGAL(am[1],0,eps)) equation[1]=0; else return(0);
681     if ( (EGAL(ab[2],0,eps)) && (EGAL(nm[2],0,eps)) )
682     if (EGAL(am[2],0,eps)) equation[2]=0; else return(0);
683     equation[3]=equation[0]+equation[1]+equation[2];
684     if (equation[3]==3)
685     {
686     double det=DETER(ab[0],nm[0],ab[1],nm[1]);
687     if (fabs(det)>eps2)
688     {
689     det=1/det;
690     double sol1=det*DETER(am[0],nm[0],am[1],nm[1]);
691     double sol2=det*DETER(ab[0],am[0],ab[1],am[1]);
692     if ( (float)fabs((double)(sol1*ab[2]-sol2*nm[2]-am[2]))>eps2) return(0);
693     return(examine_solution(sol1,sol2,1));
694     }
695     else
696     {
697     equation[0]=0;
698     equation[3]=2;
699     /* on verifie la compatibilite des deux equations dont le det est nul*/
700     double tmp;
701     if (ab[0]!=0) tmp=ab[1]*am[0]/ab[0]; else tmp=nm[1]*am[0]/nm[0];
702     if (!(EGAL(tmp,am[1],eps))) return(0);
703     }
704     }
705     if (equation[3]==2)
706     {
707     /* on repere les equations qui existent */
708     int ne1;
709     int ne2;
710     if (equation[0]!=0)
711     {
712     ne1=0;
713     if (equation[1]!=0) ne2=1; else ne2=2;
714     }
715     else
716     {
717     ne1=1;
718     ne2=2;
719     }
720    
721     double det=DETER(ab[ne1],nm[ne1],ab[ne2],nm[ne2]);
722     if (fabs(det)>eps2)
723     {
724     det=1/det;
725     double sol1=det*DETER(am[ne1],nm[ne1],am[ne2],nm[ne2]);
726     double sol2=det*DETER(ab[ne1],am[ne1],ab[ne2],am[ne2]);
727     return(examine_solution(sol1,sol2,1));
728     }
729     else
730     {
731     equation[ne1]=0;
732     equation[3]=1;
733     /* on verifie la compatibilite des deux equations dont le det est nul */
734     double tmp;
735     if (ab[ne1]!=0) tmp=ab[ne2]*am[ne1]/ab[ne1]; else tmp=nm[ne2]*am[ne1]/nm[ne1];
736     if (!(EGAL(tmp,am[ne2],eps))) return(0);
737     }
738    
739     }
740     if (equation[3]==1)
741     {
742     /* on repere l' equation qui existe */
743     int ne1;
744     if (equation[0]!=0) ne1=0; else
745     if (equation[1]!=0) ne1=1; else ne1=2;
746     double an[3];
747     an[0]=un-ua;
748     an[1]=vn-va;
749     an[2]=0.;
750     double tmp=1/ab[ne1];
751     double sol1=am[ne1]*tmp;
752     double sol2=an[ne1]*tmp;
753     return(examine_solution(sol1,sol2,2));
754     }
755     return(0);
756     }
757    
758    
759    
760     int MAILLEUR2D::examine_solution(double sol1,double sol2,int type)
761     {
762     double epsilon=0.0001;
763    
764     if (type==1)
765     {
766     if ( (sol1>epsilon) && ((sol1)<(1-epsilon)) && (sol2>epsilon) && ((sol2)<(1-epsilon)) ) return 1;
767     if ( ( (EGAL(sol1,0,epsilon)) || (EGAL(sol1,1,epsilon))) && ( (sol2>epsilon) && ((sol2)<(1-epsilon)) ) ) return 1;
768     if ( ( (EGAL(sol2,0,epsilon)) || (EGAL(sol2,1,epsilon))) && ( (sol1>epsilon) && ((sol1)<(1-epsilon)) ) ) return 1;
769     if ( (sol1>epsilon) && ((sol1)<(1-epsilon)) && (sol2>(-0.1-epsilon)) && ((sol2)<(1.1-epsilon)) ) return 1;
770     if ( (sol2>epsilon) && ((sol2)<(1-epsilon)) && (sol1>(-0.1-epsilon)) && ((sol1)<(1.1-epsilon)) ) return 1;
771    
772     }
773     if (type==2)
774     {
775     if ( (sol1>epsilon) && ((sol1)<(1-epsilon)) ) return 1;
776     if ( (sol2>epsilon) && ((sol2)<(1-epsilon)) ) return 1;
777     if ( ((sol1)>(1+epsilon)) && ((-sol2)>epsilon) ) return 1;
778     if ( ((sol2)>(1+epsilon)) && ((-sol1)>epsilon) ) return 1;
779     }
780     return 0;
781     }
782     #undef EGAL
783     #undef PSCA
784     #undef DETER
785     ///FIN DU CODE DE DEA