ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/comparaison/src/vct_comparaison.cpp
Revision: 276
Committed: Wed Jun 15 18:25:46 2011 UTC (13 years, 11 months ago) by francois
Original Path: magic/lib/vectorisation/src/vct_comparaison.cpp
File size: 131524 byte(s)
Log Message:
Correction de bug + Version toIbrep  version du premier exmple complet + construction de la vectorisation a la lecture du fichier

File Contents

# User Rev Content
1 souaissa 66 //---------------------------------------------------------------------------
2     #include"gestionversion.h"
3    
4     #pragma hdrstop
5 francois 253 #include <string.h>
6 souaissa 66 #include "vct_comparaison.h"
7 souaissa 153 #include "vct_volume.h"
8 souaissa 87 #include "vct_face.h"
9     #include "vct_surface.h"
10 francois 169 #include <iomanip>
11 souaissa 153 #include "vct_outils.h"
12 souaissa 158 #include "constantegeo.h"
13 francois 253 #include "mg_geometrie_outils.h"
14 francois 276 #include "ot_cpu.h"
15 souaissa 158
16 souaissa 66 //---------------------------------------------------------------------------
17    
18     #pragma package(smart_init)
19    
20    
21 francois 275 VCT_COMPARAISON::VCT_COMPARAISON(MG_GESTIONNAIRE *gst1,MG_GEOMETRIE *mgeo1,MG_GESTIONNAIRE *gst2,MG_GEOMETRIE *mgeo2):mggeo1(mgeo1),mggeo2(mgeo2),gest1(gst1),gest2(gst2),affichageactif(0)
22 souaissa 66 {
23 souaissa 153 MG_VOLUME*vol1=mggeo1->get_mg_volume(0);
24     MG_VOLUME*vol2=mggeo2->get_mg_volume(0);
25 francois 258 eps=mggeo1->get_valeur_precision();
26 francois 89 }
27 souaissa 66
28 souaissa 99 VCT_COMPARAISON::~VCT_COMPARAISON()
29     {
30     }
31 francois 275
32     void VCT_COMPARAISON::active_affichage(void (*fonc)(char*))
33     {
34     affiche=fonc;
35     affichageactif=1;
36     }
37    
38    
39 francois 276 void VCT_COMPARAISON::compare(VCT_COMPARAISON_RESULTAT &cmp,MG_VOLUME* vol1,MG_VOLUME* vol2,OT_CPU *cpu)
40 francois 253 {
41     if (vol1==NULL) vol1=mggeo1->get_mg_volume(0);
42     if (vol2==NULL) vol2=mggeo2->get_mg_volume(0);
43 francois 275 if (affichageactif==1)
44     {
45     char mess[300];
46     sprintf(mess," Fichier 1 : %d faces",mggeo1->get_nb_mg_face());
47     affiche((char*)mess);
48     sprintf(mess," Fichier 2 : %d faces",mggeo2->get_nb_mg_face());
49     affiche((char*)mess);
50     affiche((char*)" Recherche de similarité");
51     }
52 francois 253 trouve_similarite();
53 francois 276 if (cpu!=NULL) cpu->ajouter_etape("Similarite");
54 francois 275 if (affichageactif==1)
55     {
56     char mess[300];
57     sprintf(mess," Nombre de paires de faces similaires : %d",similarite.get_nb()/2);
58     affiche((char*)mess);
59     affiche((char*)" Recherche d'identite");
60     }
61 francois 253 trouve_identite();
62 francois 276 if (cpu!=NULL) cpu->ajouter_etape("Identite");
63 francois 275 if (affichageactif==1)
64     {
65     char mess[300];
66     sprintf(mess," Nombre de paires de faces identiques : %d",identite.get_nb()/2);
67     affiche((char*)mess);
68     affiche((char*)" Recherche de localisation");
69     }
70 francois 253 trouve_localise(cmp);
71 francois 276 if (cpu!=NULL) cpu->ajouter_etape("Localisation");
72 francois 275 if (affichageactif==1)
73     {
74     char mess[300];
75     sprintf(mess," Matrice de changement de repere : %lf %lf %lf %lf",transformation(0,0).get_x(),transformation(0,1).get_x(),transformation(0,2).get_x(),transformation(0,3).get_x());
76     affiche((char*)mess);
77     sprintf(mess," : %lf %lf %lf %lf",transformation(1,0).get_x(),transformation(1,1).get_x(),transformation(1,2).get_x(),transformation(1,3).get_x());
78     affiche((char*)mess);
79     sprintf(mess," R1 vers R2 : %lf %lf %lf %lf",transformation(2,0).get_x(),transformation(2,1).get_x(),transformation(2,2).get_x(),transformation(2,3).get_x());
80     affiche((char*)mess);
81     sprintf(mess," : %lf %lf %lf %lf",transformation(3,0).get_x(),transformation(3,1).get_x(),transformation(3,2).get_x(),transformation(3,3).get_x());
82     affiche((char*)mess);
83    
84     sprintf(mess," Nombre de paires de faces localisées : %d",localise.get_nb()/2);
85     affiche((char*)mess);
86     affiche((char*)" Recherche des arêtes et des sommets correspondants");
87     }
88 francois 253 affecter_les_couleurs(localise);
89 francois 258 identifie_correspondance(cmp);
90 francois 276 if (cpu!=NULL) cpu->ajouter_etape("Correspondance");
91 francois 275 if (affichageactif==1) affiche((char*)" Recherche des modifications partielles");
92 francois 258 trouve_modification_partielle(cmp);
93 francois 276 if (cpu!=NULL) cpu->ajouter_etape("Modifications partielles");
94 francois 253 }
95 souaissa 66
96 francois 253 void VCT_COMPARAISON::trouve_similarite(void)
97     {
98     int nb_face1=mggeo1->get_nb_mg_face();
99     int nb_face2=mggeo2->get_nb_mg_face();
100     similarite.vide();
101     for(int i=0;i<nb_face1; i++)
102     {
103     MG_FACE* face1=mggeo1->get_mg_face(i);
104     MG_SURFACE*surf1=face1->get_surface();
105     int nb_top1_pts= face1->get_vectorisation().get_nb_points();
106     int nb_geo1_pts= surf1->get_vectorisation().get_nb_points();
107 francois 89
108 francois 253 OT_TENSEUR *tns1_face=face1->get_vectorisation().get_tenseur_metrique();
109     OT_TENSEUR *tns1_surf=surf1->get_vectorisation().get_tenseur_metrique();
110    
111     for(int j=0;j<nb_face2;j++)
112     {
113     MG_FACE* face2=mggeo2->get_mg_face(j);
114     MG_SURFACE*surf2=face2->get_surface();
115     int nb_top2_pts= face2->get_vectorisation().get_nb_points();
116     int nb_geo2_pts= surf2->get_vectorisation().get_nb_points();
117     OT_TENSEUR* tns2_face=face2->get_vectorisation().get_tenseur_metrique();
118     OT_TENSEUR* tns2_surf=surf2->get_vectorisation().get_tenseur_metrique();
119    
120     if(nb_geo1_pts==nb_geo2_pts&&nb_top1_pts==nb_top2_pts)
121     {
122     if(tns1_face->est_til_equivalent(*tns2_face))
123     {
124     if(tns1_surf->est_til_equivalent(*tns2_surf))
125     {
126     similarite.ajouter(face1->get_id());
127     similarite.ajouter(face2->get_id());
128     }
129     }
130     }
131     }
132     }
133     }
134    
135     void VCT_COMPARAISON::trouve_identite(void)
136     {
137     identite.vide();
138     int nbpaire=similarite.get_nb()/2;
139     for (int i=0;i<nbpaire;i++)
140     {
141     MG_FACE* face1=mggeo1->get_mg_faceid(similarite.get(2*i));
142     MG_SURFACE*surf1=face1->get_surface();
143     MG_FACE* face2=mggeo2->get_mg_faceid(similarite.get(2*i+1));
144     MG_SURFACE*surf2=face1->get_surface();
145     OT_TENSEUR *tns1_face=face1->get_vectorisation().get_tenseur_inertie_base_locale_4d();
146     OT_TENSEUR *tns1_surf=surf1->get_vectorisation().get_tenseur_inertie_base_locale_4d();
147     OT_TENSEUR *tns2_face=face2->get_vectorisation().get_tenseur_inertie_base_locale_4d();
148     OT_TENSEUR *tns2_surf=surf2->get_vectorisation().get_tenseur_inertie_base_locale_4d();
149     if(tns1_face->est_til_equivalent(*tns2_face))
150     if(tns1_surf->est_til_equivalent(*tns2_surf))
151     {
152     identite.ajouter(face1->get_id());
153     identite.ajouter(face2->get_id());
154     }
155     }
156     }
157     void VCT_COMPARAISON::trouve_localise(VCT_COMPARAISON_RESULTAT &cmp)
158     {
159 francois 258
160 francois 253 localise.vide();
161     TPL_LISTE_ENTITE<int> localisetmp;
162     int nbpaire=identite.get_nb()/2.;
163 francois 275 if (nbpaire==0)
164     {
165     OT_TENSEUR tmp(4,4);
166     tmp.identite();
167     transformation=tmp;
168     transformation_inverse=tmp;
169     return;
170     }
171 francois 253 int *paire=new int[nbpaire];
172     for (int i=0;i<nbpaire;i++)
173     paire[i]=0;
174     for (int ident=0;ident<nbpaire;ident++)
175     {
176     if (paire[ident]==1) continue;
177     MG_FACE* faceref1=mggeo1->get_mg_faceid(identite.get(2*ident));
178     MG_FACE* faceref2=mggeo2->get_mg_faceid(identite.get(2*ident+1));
179     OT_TENSEUR tnsref1(3,3);
180     OT_TENSEUR tnsref2(3,3);
181     std::vector<OT_TENSEUR> list;
182     recale_repere_reference(faceref1,faceref2,list);
183     int nbessai=list.size()/2;
184     for (int essai=0;essai<nbessai;essai++)
185     {
186     localisetmp.vide();
187     int *pairetmp=new int[nbpaire];
188     for (int i=0;i<nbpaire;i++)
189     pairetmp[i]=0;
190     OT_VECTEUR_3DD *baryref1=faceref1->get_vectorisation().get_barycentre_3d();
191     OT_VECTEUR_3DD *baryref2=faceref2->get_vectorisation().get_barycentre_3d();
192     OT_TENSEUR tnsref1=list[essai*2];
193     OT_TENSEUR tnsref2=list[essai*2+1];
194     OT_TENSEUR tnsrefinv1=tnsref1.transpose();
195     OT_TENSEUR tnsrefinv2=tnsref2.transpose();
196     for (int i=0;i<nbpaire;i++)
197     {
198     MG_FACE* face1=mggeo1->get_mg_faceid(identite.get(2*i));
199     MG_FACE* face2=mggeo2->get_mg_faceid(identite.get(2*i+1));
200     OT_TENSEUR *tns1=face1->get_vectorisation().get_base_locale_3d();
201     OT_TENSEUR trans1=tns1->transpose();
202     trans1=trans1*tnsref1;
203     OT_TENSEUR tns2=trans1.transpose();
204     tns2=tnsref2*tns2;
205     OT_TENSEUR *iner2=face2->get_vectorisation().get_tenseur_inertie_3d();
206     OT_TENSEUR *inerloc2=face2->get_vectorisation().get_tenseur_inertie_base_locale_3d();
207     OT_TENSEUR inerloc2prime=tns2.transpose();
208     inerloc2prime=inerloc2prime*(*iner2);
209     inerloc2prime=inerloc2prime*tns2;
210     OT_VECTEUR_3DD *bary1=face1->get_vectorisation().get_barycentre_3d();
211     OT_VECTEUR_3DD baryloc1=(*bary1)-(*baryref1);
212     baryloc1=tnsrefinv1*baryloc1;
213     OT_VECTEUR_3DD *bary2=face2->get_vectorisation().get_barycentre_3d();
214     OT_VECTEUR_3DD baryloc2=(*bary2)-(*baryref2);
215     baryloc2=tnsrefinv2*baryloc2;
216     if (inerloc2prime.est_til_equivalent(*inerloc2))
217     if (baryloc1==baryloc2)
218     {
219     localisetmp.ajouter(face1->get_id());
220     localisetmp.ajouter(face2->get_id());
221     pairetmp[i]=1;
222     }
223     }
224     if (localisetmp.get_nb()>localise.get_nb())
225     {
226     int n=localisetmp.get_nb();
227     localise.vide();
228     for (int i=0;i<n;i++)
229     localise.ajouter(localisetmp.get(i));
230     for (int i=0;i<nbpaire;i++)
231     paire[i]=pairetmp[i];
232     ident=0;
233 francois 258 transformation=calcul_transformation(*baryref1,*baryref2,tnsref1,tnsref2);
234 francois 253 }
235     delete [] pairetmp;
236     }
237     }
238     delete [] paire;
239 francois 258 transformation_inverse=transformation.inverse_homogene();
240     OT_VECTEUR_3D vec1(transformation(0,0).get_x(),transformation(1,0).get_x(),transformation(2,0).get_x());
241     OT_VECTEUR_3D vec2(transformation(0,1).get_x(),transformation(1,1).get_x(),transformation(2,1).get_x());
242     OT_VECTEUR_3D vec3(transformation(0,2).get_x(),transformation(1,2).get_x(),transformation(2,2).get_x());
243     OT_VECTEUR_3D vec4(transformation(0,3).get_x(),transformation(1,3).get_x(),transformation(2,3).get_x());
244 francois 253 cmp.initialise_changement_repere(vec1,vec2,vec3,vec4);
245 francois 258
246 francois 253 }
247 francois 258 void VCT_COMPARAISON::identifie_correspondance(VCT_COMPARAISON_RESULTAT &cmp)
248     {
249 francois 275 int sommetparfait=0,areteparfait=0;
250 francois 258 int nbpaire=localise.get_nb()/2.;
251     for (int i=0;i<nbpaire;i++)
252     {
253     MG_FACE* face1=mggeo1->get_mg_faceid(localise.get(2*i));
254     MG_FACE* face2=mggeo2->get_mg_faceid(localise.get(2*i+1));
255     CORRESPONDANCE cor(face1,face2,CORRESPONDANCE::PARFAITE);
256     cmp.ajouter_liste_topologie(cor);
257     cmp.ajouter_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_CONSERVEE,face1);
258     cmp.ajouter_liste_topologie(VCT_COMPARAISON_RESULTAT::MODIFIE_CONSERVEE,face2);
259 francois 275 identifie_topologie_sous_jacente(cmp,face1,face2,sommetparfait,areteparfait);
260 francois 258 }
261 francois 275 if (affichageactif==1)
262     {
263     char mess[300];
264     sprintf(mess," Nombre de paires de sommets localisés : %d",sommetparfait);
265     affiche((char*)mess);
266     sprintf(mess," Nombre de paires d'aretes localisées : %d",areteparfait);
267     affiche((char*)mess);
268     }
269 francois 258 }
270 francois 253
271 francois 275 void VCT_COMPARAISON::identifie_topologie_sous_jacente(VCT_COMPARAISON_RESULTAT &cmp,MG_FACE* face1,MG_FACE* face2,int& sommetparfait,int& areteparfait)
272 francois 258 {
273     double2 UN(1.0);
274     std::map<OT_VECTEUR_3DD,MG_SOMMET*,lessOT_VECTEUR_3DD > tabsom1;
275     std::map<OT_VECTEUR_3DD,MG_SOMMET*,lessOT_VECTEUR_3DD > tabsom2;
276     std::multimap<OT_VECTEUR_3DD,MG_ARETE*,lessOT_VECTEUR_3DD > tabare1;
277     std::multimap<OT_VECTEUR_3DD,MG_ARETE*,lessOT_VECTEUR_3DD > tabare2;
278     int nb_boucle=face1->get_nb_mg_boucle();
279     for (int i=0;i<nb_boucle;i++)
280     {
281     MG_BOUCLE* bou1=face1->get_mg_boucle(i);
282     int nb_arete=bou1->get_nb_mg_coarete();
283     for (int j=0;j<nb_arete;j++)
284     {
285     MG_ARETE *are=bou1->get_mg_coarete(j)->get_arete();
286     OT_VECTEUR_3DD *bary=are->get_vectorisation().get_barycentre_3d();
287     std::pair<OT_VECTEUR_3DD,MG_ARETE*> tmp(*bary,are);
288     tabare1.insert(tmp);
289     MG_SOMMET *som1=are->get_cosommet1()->get_sommet();
290     double xyz[3];
291     som1->get_point()->evaluer(xyz);
292     OT_VECTEUR_3DD vec(xyz[0],xyz[1],xyz[2]);
293     std::pair<OT_VECTEUR_3DD,MG_SOMMET*> tmp2(vec,som1);
294     tabsom1.insert(tmp2);
295     MG_SOMMET *som2=are->get_cosommet2()->get_sommet();
296     som2->get_point()->evaluer(xyz);
297     OT_VECTEUR_3DD vec2(xyz[0],xyz[1],xyz[2]);
298     std::pair<OT_VECTEUR_3DD,MG_SOMMET*> tmp3(vec2,som2);
299     tabsom1.insert(tmp3);
300     }
301     MG_BOUCLE* bou2=face2->get_mg_boucle(i);
302     nb_arete=bou1->get_nb_mg_coarete();
303     for (int j=0;j<nb_arete;j++)
304     {
305     MG_ARETE *are=bou2->get_mg_coarete(j)->get_arete();
306     OT_VECTEUR_3DD *bary=are->get_vectorisation().get_barycentre_3d();
307     OT_VECTEUR_4DD baryhomo(bary->get_x(),bary->get_y(),bary->get_z(),UN);
308     OT_VECTEUR_4DD barytranshomo=transformation_inverse*baryhomo;
309     OT_VECTEUR_3DD barytrans(barytranshomo.get_x(),barytranshomo.get_y(),barytranshomo.get_z());
310     double2 w=UN/barytranshomo.get_w();
311     barytrans=barytrans*w;
312     std::pair<OT_VECTEUR_3DD,MG_ARETE*> tmp(barytrans,are);
313     tabare2.insert(tmp);
314     MG_SOMMET *som1=are->get_cosommet1()->get_sommet();
315     double xyz[3];
316     som1->get_point()->evaluer(xyz);
317     OT_VECTEUR_4DD vechomo(xyz[0],xyz[1],xyz[2],1.);
318     OT_VECTEUR_4DD vectranshomo=transformation_inverse*vechomo;
319     OT_VECTEUR_3DD vectrans(vectranshomo.get_x(),vectranshomo.get_y(),vectranshomo.get_z());
320     w=UN/vectranshomo.get_w();
321     vectrans=vectrans*w;
322     std::pair<OT_VECTEUR_3DD,MG_SOMMET*> tmp2(vectrans,som1);
323     tabsom2.insert(tmp2);
324     MG_SOMMET *som2=are->get_cosommet2()->get_sommet();
325     som2->get_point()->evaluer(xyz);
326     OT_VECTEUR_4DD vechomo2(xyz[0],xyz[1],xyz[2],1.);
327     OT_VECTEUR_4DD vectranshomo2=transformation_inverse*vechomo2;
328     OT_VECTEUR_3DD vectrans2(vectranshomo2.get_x(),vectranshomo2.get_y(),vectranshomo2.get_z());
329     w=UN/vectranshomo2.get_w();
330     vectrans2=vectrans2*w;
331     std::pair<OT_VECTEUR_3DD,MG_SOMMET*> tmp3(vectrans2,som2);
332     tabsom2.insert(tmp3);
333     }
334     //arete
335     std::multimap<OT_VECTEUR_3DD,MG_ARETE*,lessOT_VECTEUR_3DD >::iterator it1;
336     std::multimap<OT_VECTEUR_3DD,MG_ARETE*,lessOT_VECTEUR_3DD >::iterator it2;
337     it1=tabare1.begin();
338     int ok=0;
339     if (it1==tabare1.end()) ok=1;
340     while (ok==0)
341     {
342     MG_ARETE* are1=(*it1).second;
343     OT_VECTEUR_3DD bary1=(*it1).first;
344     int nb_top1_pts= are1->get_vectorisation().get_nb_points();
345     int nb_geo1_pts= are1->get_courbe()->get_vectorisation().get_nb_points();
346     OT_TENSEUR *tns1_metrique_are=are1->get_vectorisation().get_tenseur_metrique();
347     OT_TENSEUR *tns1_metrique_crb=are1->get_courbe()->get_vectorisation().get_tenseur_metrique();
348     OT_TENSEUR *tns1_inertie_are=are1->get_vectorisation().get_tenseur_inertie_base_locale_4d();
349     OT_TENSEUR *tns1_inertie_crb=are1->get_courbe()->get_vectorisation().get_tenseur_inertie_base_locale_4d();
350     it2=tabare2.find(bary1);
351     int ok2=0;
352     do
353     {
354     if (it2==tabare2.end()) ok2=1;
355     else
356     {
357     MG_ARETE* are2=(*it2).second;
358     OT_VECTEUR_3DD bary2=(*it2).first;
359     if (!(bary2==bary1)) ok2=1;
360     else
361     {
362     int nb_top2_pts= are2->get_vectorisation().get_nb_points();
363     int nb_geo2_pts= are2->get_courbe()->get_vectorisation().get_nb_points();
364     OT_TENSEUR *tns2_metrique_are=are2->get_vectorisation().get_tenseur_metrique();
365     OT_TENSEUR *tns2_metrique_crb=are2->get_courbe()->get_vectorisation().get_tenseur_metrique();
366     OT_TENSEUR *tns2_inertie_are=are2->get_vectorisation().get_tenseur_inertie_base_locale_4d();
367     OT_TENSEUR *tns2_inertie_crb=are2->get_courbe()->get_vectorisation().get_tenseur_inertie_base_locale_4d();
368     if (nb_top1_pts==nb_top2_pts)
369     if (nb_geo1_pts==nb_geo2_pts)
370     if (tns1_metrique_are->est_til_equivalent(*tns2_metrique_are))
371     if (tns1_metrique_crb->est_til_equivalent(*tns2_metrique_crb))
372     if (tns1_inertie_are->est_til_equivalent(*tns2_inertie_are))
373     if (tns1_inertie_crb->est_til_equivalent(*tns2_inertie_crb))
374     {
375     CORRESPONDANCE cor(are1,are2,CORRESPONDANCE::PARFAITE);
376 francois 275 int res=cmp.ajouter_liste_topologie(cor);
377     if (res==1)
378     {
379     cmp.ajouter_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_CONSERVEE,are1);
380     cmp.ajouter_liste_topologie(VCT_COMPARAISON_RESULTAT::MODIFIE_CONSERVEE,are2);
381     areteparfait++;
382     }
383 francois 258 }
384     it2++;
385     }
386     }
387     }
388     while (ok2==0);
389     it1++;
390     if (it1==tabare1.end()) ok=1;
391     }
392    
393     //sommet
394     std::map<OT_VECTEUR_3DD,MG_SOMMET*,lessOT_VECTEUR_3DD >::iterator its1;
395     std::map<OT_VECTEUR_3DD,MG_SOMMET*,lessOT_VECTEUR_3DD >::iterator its2;
396     its1=tabsom1.begin();
397     ok=0;
398     do
399     {
400     MG_SOMMET* som=(*its1).second;
401     its2=tabsom2.find((*its1).first);
402     if (its2!=tabsom2.end())
403     {
404     CORRESPONDANCE cor((*its1).second,(*its2).second,CORRESPONDANCE::PARFAITE);
405 francois 275 int res=cmp.ajouter_liste_topologie(cor);
406     if (res==1)
407     {
408     cmp.ajouter_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_CONSERVEE,(*its1).second);
409     cmp.ajouter_liste_topologie(VCT_COMPARAISON_RESULTAT::MODIFIE_CONSERVEE,(*its2).second);
410     sommetparfait++;
411     }
412 francois 258 }
413     its1++;
414     if (its1==tabsom1.end()) ok=1;
415     }
416     while (ok==0);
417     }
418     }
419    
420     void VCT_COMPARAISON::trouve_modification_partielle(VCT_COMPARAISON_RESULTAT &cmp)
421     {
422     double2 ZERO(0.);
423     double2 UN(1.);
424 francois 275 int sommetpartiel=0,aretepartiel=0,facepartiel=0;
425 francois 258 //tableau des entites qui n'ont pas pu associees
426     std::map<OT_VECTEUR_3DD,MG_SOMMET*,lessOT_VECTEUR_3DD > tabsom1;
427     std::map<OT_VECTEUR_3DD,MG_SOMMET*,lessOT_VECTEUR_3DD > tabsom2;
428     std::multimap<int,MG_ARETE* > tabare1;
429     std::multimap<int,MG_ARETE* > tabare2;
430     std::multimap<int,MG_FACE* > tabface1;
431     std::multimap<int,MG_FACE*> tabface2;
432    
433     LISTE_MG_SOMMET::iterator itsom;
434     LISTE_MG_ARETE::iterator itare;
435     LISTE_MG_FACE::iterator itface;
436     for (MG_SOMMET* som=mggeo1->get_premier_sommet(itsom);som!=NULL;som=mggeo1->get_suivant_sommet(itsom))
437     {
438     unsigned long num=cmp.get_liste_correspondance_modifie(som->get_id());
439     if (num==0)
440     {
441     double xyz[3];
442     som->get_point()->evaluer(xyz);
443     OT_VECTEUR_3DD vec(xyz[0],xyz[1],xyz[2]);
444     std::pair<OT_VECTEUR_3DD,MG_SOMMET*> tmp(vec,som);
445     tabsom1.insert(tmp);
446     }
447     }
448     for (MG_ARETE* are=mggeo1->get_premier_arete(itare);are!=NULL;are=mggeo1->get_suivant_arete(itare))
449     {
450     unsigned long num=cmp.get_liste_correspondance_modifie(are->get_id());
451     if (num==0)
452     {
453     TPL_LISTE_ENTITE<double> param;
454     int typecrb=are->get_courbe()->get_type_geometrique(param);
455     std::pair<int,MG_ARETE*> tmp(typecrb,are);
456     tabare1.insert(tmp);
457     }
458     }
459     for (MG_FACE* face=mggeo1->get_premier_face(itface);face!=NULL;face=mggeo1->get_suivant_face(itface))
460     {
461     unsigned long num=cmp.get_liste_correspondance_modifie(face->get_id());
462     if (num==0)
463     {
464     TPL_LISTE_ENTITE<double> param;
465     int typesurf=face->get_surface()->get_type_geometrique(param);
466     std::pair<int,MG_FACE*> tmp(typesurf,face);
467     tabface1.insert(tmp);
468     }
469     }
470     for (MG_SOMMET* som=mggeo2->get_premier_sommet(itsom);som!=NULL;som=mggeo2->get_suivant_sommet(itsom))
471     {
472     unsigned long num=cmp.get_liste_correspondance_origine(som->get_id());
473     if (num==0)
474     {
475     double xyz[3];
476     som->get_point()->evaluer(xyz);
477     OT_VECTEUR_4DD vec(xyz[0],xyz[1],xyz[2],1.);
478     OT_VECTEUR_4DD vectranshomo=transformation_inverse*vec;
479     OT_VECTEUR_3DD vectrans(vectranshomo.get_x(),vectranshomo.get_y(),vectranshomo.get_z());
480     double2 w=UN/vectranshomo.get_w();
481     vectrans=vectrans*w;
482     std::pair<OT_VECTEUR_3DD,MG_SOMMET*> tmp(vectrans,som);
483     tabsom2.insert(tmp);
484     }
485     }
486     for (MG_ARETE* are=mggeo2->get_premier_arete(itare);are!=NULL;are=mggeo2->get_suivant_arete(itare))
487     {
488     unsigned long num=cmp.get_liste_correspondance_origine(are->get_id());
489     if (num==0)
490     {
491     TPL_LISTE_ENTITE<double> param;
492     int typecrb=are->get_courbe()->get_type_geometrique(param);
493     std::pair<int,MG_ARETE*> tmp(typecrb,are);
494     tabare2.insert(tmp);
495     }
496     }
497     for (MG_FACE* face=mggeo2->get_premier_face(itface);face!=NULL;face=mggeo2->get_suivant_face(itface))
498     {
499     unsigned long num=cmp.get_liste_correspondance_origine(face->get_id());
500     if (num==0)
501     {
502     TPL_LISTE_ENTITE<double> param;
503     int typesurf=face->get_surface()->get_type_geometrique(param);
504     std::pair<int,MG_FACE*> tmp(typesurf,face);
505     tabface2.insert(tmp);
506     }
507     }
508     //analyse sommet
509     std::map<OT_VECTEUR_3DD,MG_SOMMET*,lessOT_VECTEUR_3DD >::iterator its1;
510     std::map<OT_VECTEUR_3DD,MG_SOMMET*,lessOT_VECTEUR_3DD >::iterator its2;
511     its1=tabsom1.begin();
512     int ok=0;
513     if (tabsom1.size()==0) ok=1;
514     while (ok==0)
515     {
516     its2=tabsom2.find((*its1).first);
517     if (its2!=tabsom2.end())
518     {
519     CORRESPONDANCE cor((*its1).second,(*its2).second,CORRESPONDANCE::MODIFIE);
520     cmp.ajouter_liste_topologie(cor);
521     cmp.ajouter_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_CONSERVEE,(*its1).second);
522     cmp.ajouter_liste_topologie(VCT_COMPARAISON_RESULTAT::MODIFIE_CONSERVEE,(*its2).second);
523 francois 275 sommetpartiel++;
524 francois 258 }
525     its1++;
526     if (its1==tabsom1.end()) ok=1;
527     }
528     //analyse arete
529     std::multimap<int,MG_ARETE* >::iterator ita1;
530     std::multimap<int,MG_ARETE* >::iterator ita2;
531     ita1=tabare1.begin();
532     ok=0;
533     if (tabare1.size()==0) ok=1;
534     while (ok==0)
535     {
536     MG_ARETE* are1=(*ita1).second;
537     int typecrb1=(*ita1).first;
538     int nb_geo1_pts= are1->get_courbe()->get_vectorisation().get_nb_points();
539     OT_TENSEUR *tns1_metrique_crb=are1->get_courbe()->get_vectorisation().get_tenseur_metrique();
540     OT_TENSEUR *tns1_inertie_crb=are1->get_courbe()->get_vectorisation().get_tenseur_inertie_base_locale_4d();
541     ita2=tabare2.find(typecrb1);
542     int ok2=0;
543     do
544     {
545     if (ita2==tabare2.end()) ok2=1;
546     else
547     {
548     MG_ARETE* are2=(*ita2).second;
549     int typecrb2=(*ita2).first;
550     if (!(typecrb2==typecrb1)) ok2=1;
551     else
552     {
553     int nb_geo2_pts= are2->get_courbe()->get_vectorisation().get_nb_points();
554     OT_TENSEUR *tns2_metrique_crb=are2->get_courbe()->get_vectorisation().get_tenseur_metrique();
555     OT_TENSEUR *tns2_inertie_crb=are2->get_courbe()->get_vectorisation().get_tenseur_inertie_base_locale_4d();
556     if (nb_geo1_pts==nb_geo2_pts)
557     if (tns1_metrique_crb->est_til_equivalent(*tns2_metrique_crb))
558     if (tns1_inertie_crb->est_til_equivalent(*tns2_inertie_crb))
559     if (localise_courbe(are1->get_courbe(),are2->get_courbe()))
560     {
561     CORRESPONDANCE cor(are1,are2,CORRESPONDANCE::MODIFIE);
562     cmp.ajouter_liste_topologie(cor);
563     cmp.ajouter_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_CONSERVEE,are1);
564     cmp.ajouter_liste_topologie(VCT_COMPARAISON_RESULTAT::MODIFIE_CONSERVEE,are2);
565 francois 275 aretepartiel++;
566 francois 258 }
567     ita2++;
568     }
569     }
570     }
571     while (ok2==0);
572     ita1++;
573     if (ita1==tabare1.end()) ok=1;
574     }
575    
576     //analyse face
577     std::multimap<int,MG_FACE* >::iterator itf1;
578     std::multimap<int,MG_FACE* >::iterator itf2;
579     itf1=tabface1.begin();
580     ok=0;
581     if (tabface1.size()==0) ok=1;
582     while (ok==0)
583     {
584     MG_FACE* face1=(*itf1).second;
585     int typefac1=(*itf1).first;
586     int nb_geo1_pts= face1->get_surface()->get_vectorisation().get_nb_points();
587     OT_TENSEUR *tns1_metrique_surface=face1->get_surface()->get_vectorisation().get_tenseur_metrique();
588     OT_TENSEUR *tns1_inertie_surface=face1->get_surface()->get_vectorisation().get_tenseur_inertie_base_locale_4d();
589     itf2=tabface2.find(typefac1);
590     int ok2=0;
591     do
592     {
593     if (itf2==tabface2.end()) ok2=1;
594     else
595     {
596     MG_FACE* face2=(*itf2).second;
597     int typefac2=(*itf2).first;
598     if (typefac1!=typefac2) ok2=1;
599     else
600     {
601     int nb_geo2_pts= face2->get_surface()->get_vectorisation().get_nb_points();
602     OT_TENSEUR *tns2_metrique_surface=face2->get_surface()->get_vectorisation().get_tenseur_metrique();
603     OT_TENSEUR *tns2_inertie_surface=face2->get_surface()->get_vectorisation().get_tenseur_inertie_base_locale_4d();
604     if (nb_geo1_pts==nb_geo2_pts)
605     //if (tns1_metrique_surface->est_til_equivalent(*tns2_metrique_surface))
606     //if (tns1_inertie_surface->est_til_equivalent(*tns2_inertie_surface))
607     if (localise_surface(face1->get_surface(),face2->get_surface()))
608     {
609     CORRESPONDANCE cor(face1,face2,CORRESPONDANCE::MODIFIE);
610     cmp.ajouter_liste_topologie(cor);
611     cmp.ajouter_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_CONSERVEE,face1);
612     cmp.ajouter_liste_topologie(VCT_COMPARAISON_RESULTAT::MODIFIE_CONSERVEE,face2);
613 francois 275 facepartiel++;
614 francois 258 }
615     itf2++;
616     }
617     }
618     }
619     while (ok2==0);
620     itf1++;
621     if (itf1==tabface1.end()) ok=1;
622     }
623     //fin remplissage cmp
624     for (its1=tabsom1.begin();its1!=tabsom1.end();its1++)
625     {
626     unsigned long num=cmp.get_liste_correspondance_modifie((*its1).second->get_id());
627     if (num==0) cmp.ajouter_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_DISPARUE,(*its1).second);
628     }
629     for (its1=tabsom2.begin();its1!=tabsom2.end();its1++)
630     {
631     unsigned long num=cmp.get_liste_correspondance_origine((*its1).second->get_id());
632     if (num==0) cmp.ajouter_liste_topologie(VCT_COMPARAISON_RESULTAT::MODIFIE_APPARUE,(*its1).second);
633     }
634     for (ita1=tabare1.begin();ita1!=tabare1.end();ita1++)
635     {
636     unsigned long num=cmp.get_liste_correspondance_modifie((*ita1).second->get_id());
637     if (num==0) cmp.ajouter_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_DISPARUE,(*ita1).second);
638     }
639     for (ita1=tabare2.begin();ita1!=tabare2.end();ita1++)
640     {
641     unsigned long num=cmp.get_liste_correspondance_origine((*ita1).second->get_id());
642     if (num==0) cmp.ajouter_liste_topologie(VCT_COMPARAISON_RESULTAT::MODIFIE_APPARUE,(*ita1).second);
643     }
644     for (itf1=tabface1.begin();itf1!=tabface1.end();itf1++)
645     {
646     unsigned long num=cmp.get_liste_correspondance_modifie((*itf1).second->get_id());
647     if (num==0) cmp.ajouter_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_DISPARUE,(*itf1).second);
648     }
649     for (itf1=tabface2.begin();itf1!=tabface2.end();itf1++)
650     {
651     unsigned long num=cmp.get_liste_correspondance_origine((*itf1).second->get_id());
652     if (num==0) cmp.ajouter_liste_topologie(VCT_COMPARAISON_RESULTAT::MODIFIE_APPARUE,(*itf1).second);
653     }
654 francois 275 if (affichageactif==1)
655     {
656     char mess[300];
657     sprintf(mess," Nombre de paires de sommets : %d",sommetpartiel);
658     affiche((char*)mess);
659     sprintf(mess," Nombre de paires d'aretes : %d",aretepartiel);
660     affiche((char*)mess);
661     sprintf(mess," Nombre de paires de faces : %d",facepartiel);
662     affiche((char*)mess);
663     }
664    
665 francois 258 }
666    
667    
668     int VCT_COMPARAISON::localise_courbe(MG_COURBE *crb1,MG_COURBE *crb2)
669     {
670     double xyz1[3],xyz2[3],xyz3[3],xyz[3];
671     double t=0.5*(crb2->get_tmax()+crb2->get_tmin());
672     double dt=(crb2->get_tmax()-crb2->get_tmin())/max(fabs(crb2->get_tmax()),fabs(crb2->get_tmin()));
673     crb2->evaluer(t,xyz1);
674     t=t+dt;
675     crb2->evaluer(t,xyz2);
676     t=t+dt;
677     crb2->evaluer(t,xyz3);
678     change_point_inverse(xyz1);
679     change_point_inverse(xyz2);
680     change_point_inverse(xyz3);
681     OT_VECTEUR_3D vec(xyz1,xyz3);
682     crb1->inverser(t,xyz1);
683     crb1->evaluer(t,xyz);
684     OT_VECTEUR_3D vec1(xyz,xyz1);
685     if (vec1.get_longueur()>eps) return 0;
686     crb1->inverser(t,xyz2);
687     crb1->evaluer(t,xyz);
688     OT_VECTEUR_3D vec2(xyz,xyz2);
689     if (vec2.get_longueur()>eps) return 0;
690     crb1->inverser(t,xyz3);
691     crb1->evaluer(t,xyz);
692     OT_VECTEUR_3D vec3(xyz,xyz3);
693     if (vec3.get_longueur()>eps) return 0;
694     return 1;
695     }
696    
697     int VCT_COMPARAISON::localise_surface(MG_SURFACE *surf1,MG_SURFACE *surf2)
698     {
699     double du=surf2->get_umax()-surf2->get_umin();
700     double dv=surf2->get_vmax()-surf2->get_vmin();
701     du=du/max(fabs(surf2->get_umax()),fabs(surf2->get_umin()));
702     dv=dv/max(fabs(surf2->get_vmax()),fabs(surf2->get_vmin()));
703     double ou=0.5*(surf2->get_umax()+surf2->get_umin());
704     double ov=0.5*(surf2->get_vmax()+surf2->get_vmin());
705     for (int i=0;i<3;i++)
706     for (int j=0;j<3;j++)
707     {
708     double uv[2],xyz[3];
709     uv[0]=ou+i*du;
710     uv[1]=ov+j*dv;
711     surf2->evaluer(uv,xyz);
712     change_point_inverse(xyz);
713     double xyz1[3];
714     surf1->inverser(uv,xyz);
715     surf1->evaluer(uv,xyz1);
716     OT_VECTEUR_3D vec(xyz,xyz1);
717     if (vec.get_longueur()>eps) return 0;
718     }
719     return 1;
720     }
721    
722    
723    
724     void VCT_COMPARAISON::change_point_inverse(double *xyz)
725     {
726     double2 UN(1.);
727     OT_VECTEUR_4DD vec(xyz[0],xyz[1],xyz[2],1.);
728     OT_VECTEUR_4DD vectranshomo=transformation_inverse*vec;
729     OT_VECTEUR_3DD vectrans(vectranshomo.get_x(),vectranshomo.get_y(),vectranshomo.get_z());
730     double2 w=UN/vectranshomo.get_w();
731     vectrans=vectrans*w;
732     xyz[0]=vectrans.get_x().get_x();
733     xyz[1]=vectrans.get_y().get_x();
734     xyz[2]=vectrans.get_z().get_x();
735     }
736    
737     void VCT_COMPARAISON::change_point(double *xyz)
738     {
739     double2 UN(1.);
740     OT_VECTEUR_4DD vec(xyz[0],xyz[1],xyz[2],1.);
741     OT_VECTEUR_4DD vectranshomo=transformation*vec;
742     OT_VECTEUR_3DD vectrans(vectranshomo.get_x(),vectranshomo.get_y(),vectranshomo.get_z());
743     double2 w=UN/vectranshomo.get_w();
744     vectrans=vectrans*w;
745     xyz[0]=vectrans.get_x().get_x();
746     xyz[1]=vectrans.get_y().get_x();
747     xyz[2]=vectrans.get_z().get_x();
748     }
749    
750    
751    
752 francois 253 OT_TENSEUR VCT_COMPARAISON::calcul_transformation(OT_VECTEUR_3DD &bary1,OT_VECTEUR_3DD &bary2,OT_TENSEUR &tns1,OT_TENSEUR &tns2)
753     {
754     double2 zero(0.),un(1.);
755     OT_TENSEUR t1(4,4);
756     t1(0,0)=tns1(0,0);t1(1,0)=tns1(1,0);t1(2,0)=tns1(2,0);t1(3,0)=zero;
757     t1(0,1)=tns1(0,1);t1(1,1)=tns1(1,1);t1(2,1)=tns1(2,1);t1(3,1)=zero;
758     t1(0,2)=tns1(0,2);t1(1,2)=tns1(1,2);t1(2,2)=tns1(2,2);t1(3,2)=zero;
759     t1(0,3)=bary1.get_x();
760     t1(1,3)=bary1.get_y();
761     t1(2,3)=bary1.get_z();
762     t1(3,3)=un;
763     OT_TENSEUR t2(4,4);
764     t2(0,0)=tns2(0,0);t2(1,0)=tns2(1,0);t2(2,0)=tns2(2,0);t2(3,0)=zero;
765     t2(0,1)=tns2(0,1);t2(1,1)=tns2(1,1);t2(2,1)=tns2(2,1);t2(3,1)=zero;
766     t2(0,2)=tns2(0,2);t2(1,2)=tns2(1,2);t2(2,2)=tns2(2,2);t2(3,2)=zero;
767     t2(0,3)=bary2.get_x();
768     t2(1,3)=bary2.get_y();
769     t2(2,3)=bary2.get_z();
770     t2(3,3)=un;
771     OT_TENSEUR t1inv=t1.inverse_homogene();
772     OT_TENSEUR trans=t2*t1inv;
773     return trans;
774     }
775    
776     void VCT_COMPARAISON::recale_repere_reference(MG_FACE* faceref1,MG_FACE* faceref2,vector<OT_TENSEUR> &list)
777     {
778     OT_TENSEUR tnsref1(3,3),tnsref2(3,3);
779     double2 zero(0.);
780     // repere1
781     OT_VECTEUR_3DD *bary1=faceref1->get_vectorisation().get_barycentre_3d();
782     double xyz1[3]={bary1->get_x().get_x(),bary1->get_y().get_x(),bary1->get_z().get_x()};
783     MG_GEOMETRIE_OUTILS ot;
784     double uvproj1[2],xyzproj1[3];
785     ot.projete(xyz1,faceref1,uvproj1,xyzproj1);
786     double normal1[3];
787     faceref1->calcul_normale_unitaire(uvproj1,normal1);
788     double2 normal12[3];normal12[0]=normal1[0];normal12[1]=normal1[1];normal12[2]=normal1[2];
789     OT_VECTEUR_3DD nor1(normal12);
790     int sens1=faceref1->get_mg_coface(0)->get_orientation();
791     nor1=sens1*nor1;
792     OT_TENSEUR *axe1=faceref1->get_vectorisation().get_base_locale_3d();
793     int n13=-1;
794     int signe13=1;
795     double2 limit1(0.);
796     for (int i=0;i<3;i++)
797     {
798     OT_VECTEUR_3DD veci;
799     veci[0]=(*axe1)(0,i);
800     veci[1]=(*axe1)(1,i);
801     veci[2]=(*axe1)(2,i);
802     double2 ps=veci*nor1;
803     if (f2abs(ps)>limit1)
804     {
805     n13=i;
806     if (ps<zero) signe13=-1;
807     limit1=f2abs(ps);
808     }
809     }
810     int n11,n12;
811     if (n13==0) {n11=1;n12=2;}
812     if (n13==1) {n11=0;n12=2;}
813     if (n13==2) {n11=0;n12=1;}
814     OT_TENSEUR *inertie_base_locale1=faceref1->get_vectorisation().get_tenseur_inertie_base_locale_3d();
815     if ((*inertie_base_locale1)(n11,n11)<(*inertie_base_locale1)(n12,n12)) {int tmp=n11;n11=n12;n12=tmp;}
816     OT_VECTEUR_3DD x11((*axe1)(0,n11),(*axe1)(1,n11),(*axe1)(2,n11));
817     OT_VECTEUR_3DD x13((*axe1)(0,n13)*signe13,(*axe1)(1,n13)*signe13,(*axe1)(2,n13)*signe13);
818     OT_VECTEUR_3DD x12=x13 & x11;
819     (tnsref1)(0,0)=x11.get_x();(tnsref1)(1,0)=x11.get_y();(tnsref1)(2,0)=x11.get_z();
820     (tnsref1)(0,1)=x12.get_x();(tnsref1)(1,1)=x12.get_y();(tnsref1)(2,1)=x12.get_z();
821     (tnsref1)(0,2)=x13.get_x();(tnsref1)(1,2)=x13.get_y();(tnsref1)(2,2)=x13.get_z();
822     int nbtest1=1;
823     if ((*inertie_base_locale1)(n11,n11)==(*inertie_base_locale1)(n12,n12)) nbtest1=0; //nbtest1=2;
824     for (int test1=0;test1<nbtest1;test1++)
825     {
826     if (test1==1)
827     {
828     OT_VECTEUR_3DD x11((*axe1)(0,n12),(*axe1)(1,n12),(*axe1)(2,n12));
829     OT_VECTEUR_3DD x12=x13 & x11;
830     (tnsref1)(0,0)=x11.get_x();(tnsref1)(1,0)=x11.get_y();(tnsref1)(2,0)=x11.get_z();
831     (tnsref1)(0,1)=x12.get_x();(tnsref1)(1,1)=x12.get_y();(tnsref1)(2,1)=x12.get_z();
832     (tnsref1)(0,2)=x13.get_x();(tnsref1)(1,2)=x13.get_y();(tnsref1)(2,2)=x13.get_z();
833     }
834     OT_TENSEUR inv1=tnsref1.transpose();
835     int nbpt1=faceref1->get_vectorisation().get_points_controle().size();
836     OT_VECTEUR_3DD bary1xp,bary1yp,bary1xn,bary1yn;
837     int xp1=0,yp1=0,xn1=0,yn1=0;
838     for (int i=0;i<nbpt1;i++)
839     {
840     OT_VECTEUR_4DD pt=faceref1->get_vectorisation().get_points_controle()[i];
841     OT_VECTEUR_3DD point(pt[0],pt[1],pt[2]);
842     point=point-(*bary1);
843     point=inv1*point;
844     if (point.get_x()>zero)
845     {
846     bary1xp=bary1xp+point;
847     xp1++;
848     }
849     if (point.get_x()<zero)
850     {
851     bary1xn=bary1xn+point;
852     xn1++;
853     }
854     if (point.get_y()>zero)
855     {
856     bary1yp=bary1yp+point;
857     yp1++;
858     }
859     if (point.get_y()<zero)
860     {
861     bary1xn=bary1xn+point;
862     yn1++;
863     }
864     }
865     bary1xp=bary1xp/xp1;
866     bary1xn=bary1xn/xn1;
867     bary1yp=bary1yp/yp1;
868     bary1yp=bary1yp/yn1;
869     //repere2
870     OT_VECTEUR_3DD *bary2=faceref2->get_vectorisation().get_barycentre_3d();
871     double xyz2[3]={bary2->get_x().get_x(),bary2->get_y().get_x(),bary2->get_z().get_x()};
872     double uvproj2[2],xyzproj2[3];
873     ot.projete(xyz2,faceref2,uvproj2,xyzproj2);
874     double normal2[3];
875     faceref2->calcul_normale_unitaire(uvproj2,normal2);
876     double2 normal22[3];normal22[0]=normal2[0];normal22[1]=normal2[1];normal22[2]=normal2[2];
877     OT_VECTEUR_3DD nor2(normal22);
878     int sens2=faceref2->get_mg_coface(0)->get_orientation();
879     nor2=sens2*nor2;
880     OT_TENSEUR *axe2=faceref2->get_vectorisation().get_base_locale_3d();
881     int n23=-1;
882     int signe23=1;
883     double2 limit2(0.);
884     for (int i=0;i<3;i++)
885     {
886     OT_VECTEUR_3DD veci;
887     veci[0]=(*axe2)(0,i);
888     veci[1]=(*axe2)(1,i);
889     veci[2]=(*axe2)(2,i);
890     double2 ps=veci*nor2;
891     if (f2abs(ps)>limit2)
892     {
893     n23=i;
894     if (ps<zero) signe23=-1;
895     limit2=f2abs(ps);
896     }
897     }
898     int n21,n22;
899     if (n23==0) {n21=1;n22=2;}
900     if (n23==1) {n21=0;n22=2;}
901     if (n23==2) {n21=0;n22=1;}
902     OT_TENSEUR *inertie_base_locale2=faceref2->get_vectorisation().get_tenseur_inertie_base_locale_3d();
903     if ((*inertie_base_locale2)(n21,n21)<(*inertie_base_locale2)(n22,n22)) {int tmp=n21;n21=n22;n22=tmp;}
904     OT_VECTEUR_3DD x21((*axe2)(0,n21),(*axe2)(1,n21),(*axe2)(2,n21));
905     OT_VECTEUR_3DD x23((*axe2)(0,n23)*signe23,(*axe2)(1,n23)*signe23,(*axe2)(2,n23)*signe23);
906     OT_VECTEUR_3DD x22=x23 & x21;
907     (tnsref2)(0,0)=x21.get_x();(tnsref2)(1,0)=x21.get_y();(tnsref2)(2,0)=x21.get_z();
908     (tnsref2)(0,1)=x22.get_x();(tnsref2)(1,1)=x22.get_y();(tnsref2)(2,1)=x22.get_z();
909     (tnsref2)(0,2)=x23.get_x();(tnsref2)(1,2)=x23.get_y();(tnsref2)(2,2)=x23.get_z();
910     int nbtest2=1;
911     if ((*inertie_base_locale2)(n21,n21)==(*inertie_base_locale2)(n22,n22)) nbtest1=0; //nbtest2=2;
912     for (int test2=0;test2<nbtest2;test2++)
913     {
914     if (test2==1)
915     {
916     OT_VECTEUR_3DD x21((*axe1)(0,n22),(*axe1)(1,n22),(*axe1)(2,n22));
917     OT_VECTEUR_3DD x22=x23 & x21;
918     (tnsref2)(0,0)=x21.get_x();(tnsref2)(1,0)=x21.get_y();(tnsref2)(2,0)=x21.get_z();
919     (tnsref2)(0,1)=x22.get_x();(tnsref2)(1,1)=x22.get_y();(tnsref2)(2,1)=x22.get_z();
920     (tnsref2)(0,2)=x23.get_x();(tnsref2)(1,2)=x23.get_y();(tnsref2)(2,2)=x23.get_z();
921     }
922     OT_TENSEUR inv2=tnsref2.transpose();
923     int nbpt2=faceref2->get_vectorisation().get_points_controle().size();
924     OT_VECTEUR_3DD bary2xp,bary2yp,bary2xn,bary2yn;
925     int xp2=0,yp2=0,xn2=0,yn2=0;
926     for (int i=0;i<nbpt2;i++)
927     {
928     OT_VECTEUR_4DD pt=faceref2->get_vectorisation().get_points_controle()[i];
929     OT_VECTEUR_3DD point(pt[0],pt[1],pt[2]);
930     point=point-(*bary2);
931     point=inv2*point;
932     if (point.get_x()>zero)
933     {
934     bary2xp=bary2xp+point;
935     xp2++;
936     }
937     if (point.get_x()<zero)
938     {
939     bary2xn=bary2xn+point;
940     xn2++;
941     }
942     if (point.get_y()>zero)
943     {
944     bary2yp=bary2yp+point;
945     yp2++;
946     }
947     if (point.get_y()<zero)
948     {
949     bary2xn=bary2xn+point;
950     yn2++;
951     }
952     }
953     bary2xp=bary2xp/xp2;
954     bary2xn=bary2xn/xn2;
955     bary2yp=bary2yp/yp2;
956     bary2yp=bary2yp/yn2;
957    
958     if ((bary2xp==bary1xp) && (bary2xn==bary1xn) && (bary2yp==bary1yp) && (bary2yn==bary1yn))
959     {
960     list.insert(list.end(),tnsref1);
961     list.insert(list.end(),tnsref2);
962     }
963     OT_VECTEUR_3DD vnul(zero,zero,zero);
964     bary2xp=vnul;
965     bary2xn=vnul;
966     bary2yp=vnul;
967     bary2yp=vnul;
968    
969     tnsref2(0,0)=zero-tnsref2(0,0);
970     tnsref2(1,0)=zero-tnsref2(1,0);
971     tnsref2(2,0)=zero-tnsref2(2,0);
972     tnsref2(0,1)=zero-tnsref2(0,1);
973     tnsref2(1,1)=zero-tnsref2(1,1);
974     tnsref2(2,1)=zero-tnsref2(2,1);
975    
976     inv2=tnsref2.transpose();
977     xp2=0,yp2=0,xn2=0,yn2=0;
978     for (int i=0;i<nbpt2;i++)
979     {
980     OT_VECTEUR_4DD pt=faceref2->get_vectorisation().get_points_controle()[i];
981     OT_VECTEUR_3DD point(pt[0],pt[1],pt[2]);
982     point=point-(*bary2);
983     point=inv2*point;
984     if (point.get_x()>zero)
985     {
986     bary2xp=bary2xp+point;
987     xp2++;
988     }
989     if (point.get_x()<zero)
990     {
991     bary2xn=bary2xn+point;
992     xn2++;
993     }
994     if (point.get_y()>zero)
995     {
996     bary2yp=bary2yp+point;
997     yp2++;
998     }
999     if (point.get_y()<zero)
1000     {
1001     bary2xn=bary2xn+point;
1002     yn2++;
1003     }
1004     }
1005     bary2xp=bary2xp/xp2;
1006     bary2xn=bary2xn/xn2;
1007     bary2yp=bary2yp/yp2;
1008     bary2yp=bary2yp/yn2;
1009     if ((bary2xp==bary1xp) && (bary2xn==bary1xn) && (bary2yp==bary1yp) && (bary2yn==bary1yn))
1010     {
1011     list.insert(list.end(),tnsref1);
1012     list.insert(list.end(),tnsref2);
1013     }
1014     }
1015     }
1016    
1017     }
1018    
1019    
1020     void VCT_COMPARAISON::choisir_une_couleur(double& val)
1021     {
1022     unsigned char r=rand() % 255;
1023     unsigned char g=rand() % 255;
1024     unsigned char b=rand() % 255;
1025     val=0.;
1026     unsigned char* p =(unsigned char*)&val;
1027     *p=r;
1028     p++;*p=g;
1029     p++;*p=b;
1030    
1031     }
1032    
1033    
1034     double VCT_COMPARAISON::recherche_couleur(MG_ELEMENT_TOPOLOGIQUE* ele)
1035     {
1036     double val=-1;
1037     int nbccf=ele->get_nb_ccf();
1038     for (int i=0;i<nbccf;i++)
1039     {
1040     char nom[10];
1041     ele->get_type_ccf(i,nom);
1042     if (strcmp(nom,"Cc")==0) val=ele->get_valeur_ccf(i);
1043     }
1044     return val;
1045     }
1046    
1047     void VCT_COMPARAISON::supprime_couleur(MG_ELEMENT_TOPOLOGIQUE* ele)
1048     {
1049     int nbccf=ele->get_nb_ccf();
1050     for (int i=0;i<nbccf;i++)
1051     {
1052     char nom[10];
1053     ele->get_type_ccf(i,nom);
1054     if (strcmp(nom,"Cc")==0) {ele->supprimer_ccf(i);nbccf--;i--;}
1055     }
1056     }
1057    
1058     void VCT_COMPARAISON::affecter_les_couleurs(TPL_LISTE_ENTITE<int>& liste)
1059     {
1060     int nb_face1=mggeo1->get_nb_mg_face();
1061     for (int i=0;i<nb_face1;i++)
1062     supprime_couleur(mggeo1->get_mg_face(i));
1063     int nb_face2=mggeo2->get_nb_mg_face();
1064     for (int i=0;i<nb_face2;i++)
1065     supprime_couleur(mggeo2->get_mg_face(i));
1066     TPL_LISTE_ENTITE<double> lst_val;
1067     int nbpaire=liste.get_nb()/2;
1068     for (int i=0;i<nbpaire;i++)
1069     {
1070     MG_FACE* ele1=mggeo1->get_mg_faceid(liste.get(2*i));
1071     MG_FACE* ele2=mggeo2->get_mg_faceid(liste.get(2*i+1));
1072     double val1=recherche_couleur(ele1);
1073     double val2=recherche_couleur(ele2);
1074     double val;
1075     if (val1<0.)
1076     {
1077     if (val2<0.)
1078     {
1079     do
1080     {
1081     choisir_une_couleur(val);
1082     }
1083     while (lst_val.est_dans_la_liste(val));
1084     lst_val.ajouter(val);
1085     }
1086     else val=val2;
1087     }
1088     else val=val1;
1089 francois 272 if (val1<0.) ele1->ajouter_ccf((char*)"Cc",val);
1090     if (val2<0.) ele2->ajouter_ccf((char*)"Cc",val);
1091 francois 253 }
1092     }
1093    
1094    
1095    
1096    
1097    
1098    
1099    
1100    
1101    
1102    
1103    
1104    
1105    
1106    
1107     #ifdef TA_GUEULE
1108 souaissa 143 void VCT_COMPARAISON::compare_les_deux_geometries(int affiche_couleur)
1109 souaissa 153 {
1110     int nb_face1=mggeo1->get_nb_mg_face();
1111     int nb_face2=mggeo2->get_nb_mg_face();
1112 souaissa 66
1113 souaissa 87 for(int i=0;i<nb_face1; i++)
1114     {
1115 souaissa 153 OT_VECTEUR_4DD Dv1,Dv2,G1,G2;
1116     OT_TENSEUR V1(4),V2(4);
1117     MG_FACE* face1=mggeo1->get_mg_face(i);
1118     MG_SURFACE*surf1=face1->get_surface();
1119     G1=surf1->get_vectorisation().calcule_barycentre(T1);
1120     G1=surf1->get_vectorisation().get_nouveau_pt(T1,G1);
1121     int id1=face1->get_id();
1122     OT_TENSEUR tns1_face(4),tns1_surf(4);
1123     OT_TENSEUR ttns1_face(4),ttns1_surf(4);
1124     int nb_top1_pts= face1->get_vectorisation().get_nb_points();
1125     int nb_geo1_pts= surf1->get_vectorisation().get_nb_points();
1126 souaissa 87
1127 souaissa 153 face1->get_vectorisation().calcule_axes_dinertie(T1,Dv1,V1);
1128     tns1_face=face1->get_vectorisation().calcule_tenseur_metrique();
1129     tns1_surf=surf1->get_vectorisation().calcule_tenseur_metrique();
1130 souaissa 87
1131 souaissa 153 ttns1_face=face1->get_vectorisation().calcule_tenseur_inertie_base_locale(T1);
1132     ttns1_surf=surf1->get_vectorisation().calcule_tenseur_inertie_base_locale(T1);
1133     vector<double2> ifac1; vector<double2>isurf1;
1134     for(int r=0;r<4;r++)
1135     {
1136     ifac1.insert( ifac1.end(), ttns1_face(r,r));
1137     isurf1.insert( isurf1.end(), ttns1_surf(r,r));
1138     }
1139     int cmpt=0;
1140     for(int j=0;j<nb_face2;j++)
1141     {
1142     MG_FACE* face2=mggeo2->get_mg_face(j);
1143     MG_SURFACE*surf2=face2->get_surface();
1144     G2=surf2->get_vectorisation().calcule_barycentre(T2);
1145     int id2=face2->get_id();
1146     OT_TENSEUR tns2_face(4),tns2_surf(4);
1147     OT_TENSEUR ttns2_face(4),ttns2_surf(4);
1148     int nb_top2_pts= face2->get_vectorisation().get_nb_points();
1149     int nb_geo2_pts= surf2->get_vectorisation().get_nb_points();
1150 souaissa 87
1151 souaissa 153 face2->get_vectorisation().calcule_axes_dinertie(T2,Dv1,V1);
1152     tns2_face=face2->get_vectorisation().calcule_tenseur_metrique();
1153     tns2_surf=surf2->get_vectorisation().calcule_tenseur_metrique();
1154 souaissa 87
1155 souaissa 153 ttns2_face=face2->get_vectorisation().calcule_tenseur_inertie_base_locale(T2);
1156     ttns2_surf=surf2->get_vectorisation().calcule_tenseur_inertie_base_locale(T2);
1157     vector<double2> ifac2; vector<double2> isurf2;
1158     for(int r=0;r<4;r++)
1159     {
1160     ifac2.insert( ifac2.end(), ttns2_face(r,r));
1161     isurf2.insert( isurf2.end(), ttns2_surf(r,r));
1162     }
1163    
1164     if(nb_geo1_pts==nb_geo2_pts&&nb_top1_pts==nb_top2_pts)
1165     {
1166     if(tns1_face.est_til_equivalent(tns2_face))
1167     {
1168     verifier_le_repere(V1,V2,ifac1,ifac2);
1169     if(tns1_surf.est_til_equivalent(tns2_surf))
1170     {
1171     similarite.ajouter(id1);
1172     similarite.ajouter(id2);
1173     vector<unsigned int> indx1,indx2;
1174     if(ttns1_face.listes_equivalentes(isurf1,isurf2,indx2))
1175     {
1176     if(G1==G2)
1177     {
1178     surf_ident.ajouter(id1);
1179     surf_ident.ajouter(id2);
1180     }
1181    
1182     if(ttns1_face.listes_equivalentes(ifac1,ifac2,indx1))
1183     {
1184     sim_double.ajouter(id1) ;
1185     sim_double.ajouter(id2) ;
1186     cmpt++;
1187     }
1188     }
1189    
1190     }
1191     }
1192     }
1193     }
1194    
1195     nb_sim.ajouter(cmpt);
1196 souaissa 87 }
1197 souaissa 153
1198     if(sim_double.get_nb()==0)
1199     {
1200     sim_double=surf_ident;
1201     }
1202     if (affiche_couleur) this->affecter_les_couleurs(23);
1203     }
1204 souaissa 66
1205    
1206    
1207 souaissa 143 void VCT_COMPARAISON::trouver_les_identites(int affiche_couleur)
1208 souaissa 87 {
1209 souaissa 142
1210     TPL_LISTE_ENTITE<int> lst_fin;
1211 souaissa 87 TPL_LISTE_ENTITE<int> lst;
1212 souaissa 143 this->compare_les_deux_geometries(0);
1213 souaissa 99 int nb_face1=mggeo1->get_nb_mg_face();
1214     int nb_face2=mggeo2->get_nb_mg_face();
1215 souaissa 90
1216 souaissa 87
1217    
1218    
1219 souaissa 99 this->trouve_face_de_reference(face_ref1,face_ref2);//,ls,lst_fin
1220 souaissa 87
1221 souaissa 153 OT_VECTEUR_4DD Dv,Dv1,Dv2,G1ref,G2ref,g1g2;
1222 souaissa 99 OT_TENSEUR V(4),V1(4),V2(4);
1223     OT_VECTEUR_4DD g1_ref,g2_ref;
1224     MG_FACE* face1_ref=mggeo1->get_mg_faceid(face_ref1);
1225 souaissa 153 //MG_SURFACE* surf1_ref=face1_ref->get_surface();
1226     //G1ref= surf1_ref->get_vectorisation().calcule_barycentre(T1);
1227     G1ref= face1_ref->get_vectorisation().calcule_barycentre(T1);
1228     G1ref= face1_ref->get_vectorisation().get_nouveau_pt(T1,G1ref);
1229     //face1_ref->get_vectorisation().calcule_axes_dinertie(T1,Dv1,V1);
1230     /*
1231 souaissa 99 for(int r=0;r<4;r++) {
1232     for(int s=0;s<4;s++) {
1233     g1_ref[r]= g1_ref[r]+V1(s,r)*G1[s];
1234     }
1235     }
1236 souaissa 153 */
1237 souaissa 99
1238     MG_FACE* face2_ref=mggeo2->get_mg_faceid(face_ref2);
1239 souaissa 153 //face2_ref->get_vectorisation().calcule_axes_dinertie(T2,Dv2,V2);
1240     //MG_SURFACE* surf2_ref=face2_ref->get_surface();
1241     //G2ref= surf2_ref->get_vectorisation().calcule_barycentre(T2);
1242     G2ref= face2_ref->get_vectorisation().calcule_barycentre(T2);
1243     /*
1244 souaissa 99 for(int r=0;r<4;r++) {
1245     for(int s=0;s<4;s++) {
1246     g2_ref[r]= g2_ref[r]+V2(s,r)*G2[s];
1247     }
1248     }
1249 souaissa 153 */
1250 souaissa 99
1251     OT_VECTEUR_4DD g1refg1,g2refg2;
1252    
1253    
1254 souaissa 153
1255 souaissa 99 for(int i=0;i<nb_face1;i++)
1256     {
1257 souaissa 153
1258 souaissa 99 OT_VECTEUR_4DD g1,G1;
1259     MG_FACE* face1=mggeo1->get_mg_face(i);
1260     int id1=face1->get_id();
1261 souaissa 153 G1= face1->get_vectorisation().calcule_barycentre(T1);
1262     G1= face1->get_vectorisation().get_nouveau_pt(T1,G1);
1263     /*
1264 souaissa 99 for(int r=0;r<4;r++) {
1265     for(int s=0;s<4;s++) {
1266     g1[r]= g1[r]+V1(s,r)*G1[s];
1267     }
1268     }
1269 souaissa 153 */
1270     g1refg1=G1-G1ref;
1271     g1refg1=face1->get_vectorisation().get_nouveau_pt(T1,g1refg1);
1272     //g1refg1=g1-g1_ref;
1273 souaissa 99 // num2=list.get(2*i+1);
1274     for(int j=0;j<nb_face2;j++)
1275     {
1276    
1277 souaissa 153 OT_VECTEUR_4DD g2,G2,g12refg2;
1278    
1279 souaissa 99 MG_FACE* face2=mggeo2->get_mg_face(j);
1280     int id2=face2->get_id();
1281 souaissa 153 G2= face2->get_vectorisation().calcule_barycentre(T2);
1282    
1283     /* for(int r=0;r<4;r++) {
1284 souaissa 99 for(int s=0;s<4;s++) {
1285     g2[r]= g2[r]+V2(s,r)*G2[s];
1286     }
1287     }
1288 souaissa 153 */
1289     //OT_VECTEUR_4DD g2refg2=g2-g2_ref;
1290     // g12refg2=G2-G2ref;
1291     OT_VECTEUR_4DD g2refg2=G2-G2ref;
1292     //OT_VECTEUR_4DD dif= g1refg1-g2refg2;
1293     //double2 prec=1e-6;
1294     // if(dif[0].get_fabs()<=prec&&dif[1].get_fabs()<=prec&&dif[2].get_fabs()<=prec&&dif[3].get_fabs()<=prec)
1295     if(g2refg2==g1refg1)
1296 souaissa 99 {
1297     identite.ajouter(id1);
1298     identite.ajouter(id2);
1299    
1300     break;
1301     }
1302 souaissa 153 }
1303 souaissa 99 }
1304    
1305    
1306    
1307    
1308 souaissa 143 if(affiche_couleur) this->affecter_les_couleurs(1);
1309 souaissa 87
1310     }
1311    
1312    
1313    
1314 souaissa 143 void VCT_COMPARAISON::compare_les_deux_geometries_vectoriellement(int affiche_couleur)
1315 souaissa 87 {
1316 souaissa 66 int nb_face1=mggeo1->get_nb_mg_face();
1317     int nb_face2=mggeo2->get_nb_mg_face();
1318 souaissa 87 similarite.vide();
1319     for(int i=0;i<nb_face1; i++)
1320     {
1321     MG_FACE* face1=mggeo1->get_mg_face(i);
1322     MG_SURFACE*surf1=face1->get_surface();
1323     int id1=face1->get_id();
1324     OT_TENSEUR tns1_face(4),tns1_surf(4);
1325     OT_TENSEUR ttns1_face(4),ttns1_surf(4);
1326     int nb_top1_pts= face1->get_vectorisation().get_nb_points();
1327     int nb_geo1_pts= surf1->get_vectorisation().get_nb_points();
1328 souaissa 66
1329 souaissa 87 tns1_face=face1->get_vectorisation().calcule_tenseur_metrique();
1330     tns1_surf=surf1->get_vectorisation().calcule_tenseur_metrique();
1331 souaissa 66
1332 souaissa 87 for(int j=0;j<nb_face2;j++)
1333     {
1334     MG_FACE* face2=mggeo2->get_mg_face(j);
1335     MG_SURFACE*surf2=face2->get_surface();
1336     int id2=face2->get_id();
1337     OT_TENSEUR tns2_face(4),tns2_surf(4);
1338     OT_TENSEUR ttns2_face(4),ttns2_surf(4);
1339     int nb_top2_pts= face2->get_vectorisation().get_nb_points();
1340     int nb_geo2_pts= surf2->get_vectorisation().get_nb_points();
1341     tns2_face=face2->get_vectorisation().calcule_tenseur_metrique();
1342     tns2_surf=surf2->get_vectorisation().calcule_tenseur_metrique();
1343 souaissa 66
1344 souaissa 87 if(nb_geo1_pts==nb_geo2_pts&&nb_top1_pts==nb_top2_pts)
1345     {
1346     if(tns1_face.est_til_equivalent(tns2_face))
1347     {
1348     if(tns1_surf.est_til_equivalent(tns2_surf))
1349     {
1350     similarite.ajouter(id1);
1351     similarite.ajouter(id2);
1352     }
1353     }
1354     }
1355     }
1356     }
1357 souaissa 143 if (affiche_couleur)this->affecter_les_couleurs(21);
1358 souaissa 87
1359     }
1360    
1361 souaissa 143 void VCT_COMPARAISON::compare_les_deux_geometries_inertiellement (int affiche_couleur)
1362 souaissa 87 {
1363 souaissa 153
1364    
1365 souaissa 87 int nb_face1=mggeo1->get_nb_mg_face();
1366     int nb_face2=mggeo2->get_nb_mg_face();
1367     ssimilarite.vide();
1368     for(int i=0;i<nb_face1; i++)
1369     {
1370     MG_FACE* face1=mggeo1->get_mg_face(i);
1371     MG_SURFACE*surf1=face1->get_surface();
1372     int id1=face1->get_id();
1373     OT_TENSEUR tns1_face(4),tns1_surf(4);
1374     int nb_top1_pts= face1->get_vectorisation().get_nb_points();
1375     int nb_geo1_pts= surf1->get_vectorisation().get_nb_points();
1376    
1377 souaissa 153 tns1_face=face1->get_vectorisation().calcule_tenseur_inertie_base_locale(T1);
1378     tns1_surf=surf1->get_vectorisation().calcule_tenseur_inertie_base_locale(T1);
1379 souaissa 87 vector<double2> ifac1; vector<double2>isurf1;
1380     for(int r=0;r<4;r++)
1381     {
1382     ifac1.insert( ifac1.end(), tns1_face(r,r));
1383     isurf1.insert( isurf1.end(), tns1_surf(r,r));
1384     }
1385    
1386 souaissa 66 for(int j=0;j<nb_face2;j++)
1387     {
1388    
1389     MG_FACE* face2=mggeo2->get_mg_face(j);
1390 souaissa 74 MG_SURFACE*surf2=face2->get_surface();
1391 souaissa 66 int id2=face2->get_id();
1392 souaissa 74 OT_TENSEUR tns2_face(4),tns2_surf(4);
1393     int nb_top2_pts= face2->get_vectorisation().get_nb_points();
1394     int nb_geo2_pts= surf2->get_vectorisation().get_nb_points();
1395 francois 253 *tns2_face=face2->get_vectorisation().get_tenseur_inertie_base_locale();
1396     *tns2_surf=surf2->get_vectorisation().get_tenseur_inertie_base_locale();
1397 souaissa 87 vector<double2> ifac2; vector<double2> isurf2;
1398     for(int r=0;r<4;r++)
1399     {
1400 francois 253 ifac2.insert( ifac2.end(), *tns2_face(r,r));
1401     isurf2.insert( isurf2.end(), *tns2_surf(r,r));
1402 souaissa 87 }
1403 souaissa 66
1404 souaissa 74 if(nb_geo1_pts==nb_geo2_pts&&nb_top1_pts==nb_top2_pts)
1405 souaissa 66 {
1406 souaissa 87 vector<unsigned int> indx1,indx2;
1407     if(tns1_face.listes_equivalentes(ifac1,ifac2,indx1))
1408 souaissa 66 {
1409 souaissa 87 if(tns1_face.listes_equivalentes(isurf1,isurf2,indx2))
1410     {
1411     ssimilarite.ajouter(id1);
1412     ssimilarite.ajouter(id2);
1413     }
1414 souaissa 66 }
1415 souaissa 87 }
1416 souaissa 66
1417 souaissa 87 }
1418 souaissa 66
1419 souaissa 87 }
1420 souaissa 66
1421 souaissa 143 if (affiche_couleur)affecter_les_couleurs(22);
1422 souaissa 87 }
1423    
1424 souaissa 90 void VCT_COMPARAISON::compare_une_geometrie_inertiellement(int modele)
1425 souaissa 87 {
1426 souaissa 153
1427    
1428 souaissa 99 TPL_LISTE_ENTITE<int> ssim_tmp;
1429 souaissa 87
1430 francois 102 MG_GESTIONNAIRE *gst1;
1431 souaissa 90 MG_GEOMETRIE *mgeo1 ;
1432     int laquelle;
1433 souaissa 87
1434 souaissa 90 switch(modele)
1435     {
1436     case 1:
1437     {
1438     gst1=gest1;
1439     mgeo1=mggeo1;
1440 souaissa 92 laquelle=31;
1441 souaissa 90 break;
1442     }
1443     case 2:
1444     {
1445     gst1=gest2;
1446     mgeo1=mggeo2;
1447 souaissa 92 laquelle=32;
1448 souaissa 90 break;
1449     }
1450 souaissa 87
1451     }
1452 souaissa 66
1453 souaissa 90 int nb_face1=mgeo1->get_nb_mg_face();
1454 souaissa 99
1455 souaissa 90 for(int i=0;i<nb_face1; i++)
1456 souaissa 87 {
1457 souaissa 90 MG_FACE* face1=mgeo1->get_mg_face(i);
1458 souaissa 87 MG_SURFACE*surf1=face1->get_surface();
1459     int id1=face1->get_id();
1460     OT_TENSEUR tns1_face(4),tns1_surf(4);
1461     int nb_top1_pts= face1->get_vectorisation().get_nb_points();
1462     int nb_geo1_pts= surf1->get_vectorisation().get_nb_points();
1463 souaissa 66
1464 souaissa 153 tns1_face=face1->get_vectorisation().calcule_tenseur_inertie_base_locale(T1);
1465     tns1_surf=surf1->get_vectorisation().calcule_tenseur_inertie_base_locale(T1);
1466 souaissa 87 vector<double2> ifac1; vector<double2>isurf1;
1467     for(int r=0;r<4;r++)
1468     {
1469     ifac1.insert( ifac1.end(), tns1_face(r,r));
1470     isurf1.insert( isurf1.end(), tns1_surf(r,r));
1471     }
1472 souaissa 66
1473 souaissa 90 for(int j=0;j<nb_face1;j++)
1474 souaissa 87 {
1475 souaissa 66
1476 souaissa 90 MG_FACE* face2=mgeo1->get_mg_face(j);
1477 souaissa 87 MG_SURFACE*surf2=face2->get_surface();
1478     int id2=face2->get_id();
1479     OT_TENSEUR tns2_face(4),tns2_surf(4);
1480     int nb_top2_pts= face2->get_vectorisation().get_nb_points();
1481     int nb_geo2_pts= surf2->get_vectorisation().get_nb_points();
1482 souaissa 153 tns2_face=face2->get_vectorisation().calcule_tenseur_inertie_base_locale(T1);
1483     tns2_surf=surf2->get_vectorisation().calcule_tenseur_inertie_base_locale(T1);
1484 souaissa 87 vector<double2> ifac2; vector<double2> isurf2;
1485     for(int r=0;r<4;r++)
1486     {
1487     ifac2.insert( ifac2.end(), tns2_face(r,r));
1488     isurf2.insert( isurf2.end(), tns2_surf(r,r));
1489     }
1490 souaissa 66
1491 souaissa 87 if(nb_geo1_pts==nb_geo2_pts&&nb_top1_pts==nb_top2_pts)
1492     {
1493     vector<unsigned int> indx1,indx2;
1494     if(tns1_face.listes_equivalentes(ifac1,ifac2,indx1))
1495     {
1496     if(tns1_face.listes_equivalentes(isurf1,isurf2,indx2))
1497     {
1498 souaissa 99 ssim_tmp.ajouter(id1);
1499     ssim_tmp.ajouter(id2);
1500 souaissa 87 }
1501     }
1502     }
1503 souaissa 66
1504 souaissa 87 }
1505    
1506     }
1507 souaissa 99 if (modele==1) ssim1=ssim_tmp;
1508     if (modele==2) ssim2=ssim_tmp;
1509    
1510 souaissa 90 affecter_les_couleurs(laquelle);
1511 souaissa 66 }
1512    
1513    
1514    
1515 souaissa 82
1516 souaissa 87 TPL_LISTE_ENTITE<int> VCT_COMPARAISON::get_liste_des_identitees()
1517     {
1518     return identite;
1519     }
1520    
1521 souaissa 99 TPL_LISTE_ENTITE<int> VCT_COMPARAISON::get_liste_des_simalarite_vectorielle(int type_comparais)
1522 souaissa 87 {
1523 souaissa 99 TPL_LISTE_ENTITE<int> lst_tmp;
1524     switch ( type_comparais)
1525     {
1526     case 12: lst_tmp= similarite;
1527     case 1: lst_tmp= sim1;
1528     case 2: lst_tmp= sim2;
1529     }
1530     return lst_tmp;
1531 souaissa 87 }
1532    
1533 souaissa 99 TPL_LISTE_ENTITE<int> VCT_COMPARAISON::get_liste_des_simalarite_inertielle(int type_comparais)
1534 souaissa 87 {
1535 souaissa 99 TPL_LISTE_ENTITE<int> lst_tmp;
1536     switch ( type_comparais)
1537     {
1538     case 12: lst_tmp= ssimilarite;
1539     case 1: lst_tmp= ssim1;
1540     case 2: lst_tmp= ssim2;
1541     }
1542     return lst_tmp;
1543 souaissa 87 }
1544    
1545    
1546     void VCT_COMPARAISON::affecter_les_couleurs(int niveau)
1547 souaissa 66 {
1548 francois 144 //randomize();
1549 souaissa 87 int nb_face_ident=similarite.get_nb()/2;
1550     int nb_face_identt=ssimilarite.get_nb()/2;
1551     int nb_face_iden=identite.get_nb()/2;
1552     double val;
1553     TPL_LISTE_ENTITE<int> lst;
1554     TPL_LISTE_ENTITE<double> lst_val;
1555     int num1,num2,num1_avant ;
1556 francois 144 if (niveau==1) //pour afficher les identites entre le deux mod�les
1557 souaissa 87 {
1558     for(int i=0;i< nb_face_iden;i++)
1559     {
1560     num1=identite.get(2*i) ;
1561     num2=identite.get(2*i+1) ;
1562     if(i>0) num1_avant= identite.get(2*(i-1));
1563     MG_FACE* face1=mggeo1->get_mg_faceid(num1);
1564     MG_FACE* face2=mggeo2->get_mg_faceid(num2);
1565    
1566     if(i==0)
1567     {
1568     choisir_une_couleur(val);
1569     while(lst_val.est_dans_la_liste(val))
1570     {
1571     choisir_une_couleur(val);
1572     }
1573     face1->ajouter_ccf("Cc",val);
1574     face2->ajouter_ccf("Cc",val);
1575     lst_val.ajouter(val);
1576     }
1577    
1578     if(i>0)
1579     {
1580     if(num1!=num1_avant)
1581     {
1582     choisir_une_couleur(val);
1583     while(lst_val.est_dans_la_liste(val))
1584     {
1585     choisir_une_couleur(val);
1586     }
1587     face1->ajouter_ccf("Cc",val);
1588     face2->ajouter_ccf("Cc",val);
1589     lst_val.ajouter(val);
1590     }
1591     else{
1592     face2->ajouter_ccf("Cc",val);
1593     }
1594    
1595     }
1596     }
1597    
1598     }
1599    
1600 francois 144 if(niveau==21||niveau==22||niveau==23) //pour afficher la similarite entre le deux mod�le vectoriellement ou inertiellement
1601 souaissa 90 {
1602     TPL_LISTE_ENTITE<int> simu;
1603     if(niveau==21)simu=similarite;
1604     if(niveau==22) simu=ssimilarite;
1605 souaissa 99 if(niveau==23) simu=sim_double;
1606 souaissa 90 TPL_LISTE_ENTITE<int> llst1;
1607     TPL_LISTE_ENTITE<int> llst2;
1608     int nb_face_sim=simu.get_nb()/2.;
1609     for(int i=0;i< nb_face_sim;i++)
1610     {
1611     TPL_LISTE_ENTITE<int> lst1;
1612     TPL_LISTE_ENTITE<int> lst2;
1613     TPL_LISTE_ENTITE<int> llst3;
1614     num1=simu.get(2*i) ;
1615     if(!llst1.est_dans_la_liste(num1))
1616 souaissa 87 {
1617 souaissa 90 num2=simu.get(2*i+1) ;
1618     lst1.ajouter(num1);
1619     lst2.ajouter(num2);
1620     llst1.ajouter(num1);
1621     llst2.ajouter(num2);
1622     for(int j=1;j< nb_face_sim;j++)
1623     {
1624     int Num1=simu.get(2*j) ;
1625     int Num2=simu.get(2*j+1) ;
1626 souaissa 87
1627 souaissa 90 if(num1==Num1)
1628     {
1629     llst3.ajouter(Num2);
1630     }
1631     if(num2==Num2||llst3.est_dans_la_liste(Num2))
1632     {
1633     if(!lst1.est_dans_la_liste(Num1)) {
1634     lst1.ajouter(Num1);
1635     llst1.ajouter(Num1); }
1636     if(!lst2.est_dans_la_liste(Num2)) {
1637     lst2.ajouter(Num2);
1638     llst2.ajouter(Num2); }
1639     }
1640 souaissa 87
1641     }
1642    
1643 souaissa 90 choisir_une_couleur(val);
1644     while(lst_val.est_dans_la_liste(val))
1645     {
1646 souaissa 87 choisir_une_couleur(val);
1647 souaissa 90 }
1648     lst_val.ajouter(val);
1649     int nb1=lst1.get_nb();
1650     int nb2=lst2.get_nb();
1651     for(int i=0;i<nb1;i++)
1652     {
1653     int n1=lst1.get(i);
1654     MG_FACE* face1=mggeo1->get_mg_faceid(n1);
1655     face1->ajouter_ccf("Cc",val);
1656 souaissa 87 }
1657 souaissa 90 for(int i=0;i<nb2;i++)
1658     {
1659     int n2=lst2.get(i);
1660     MG_FACE* face2=mggeo2->get_mg_faceid(n2);
1661     face2->ajouter_ccf("Cc",val);
1662     }
1663    
1664     }
1665     }
1666 souaissa 87
1667    
1668     }
1669    
1670 francois 144 if(niveau== 31||niveau==32) //pour afficher la similarite dans le premier mod�le ou le second modele
1671 souaissa 87 {
1672    
1673 souaissa 90 MG_GEOMETRIE *mgeo1 ;
1674     int laquelle;
1675 souaissa 87
1676 souaissa 90 switch(niveau)
1677     {
1678     case 31:
1679     {
1680     mgeo1=mggeo1;
1681     laquelle=31;
1682     break;
1683 souaissa 87 }
1684 souaissa 90 case 32:
1685     {
1686     mgeo1=mggeo2;
1687     laquelle=32;
1688     break;
1689     }
1690    
1691 souaissa 87 }
1692    
1693 souaissa 142
1694 souaissa 90 for(int i=0;i< nb_face_identt;i++)
1695 souaissa 87 {
1696 souaissa 90 num1=ssimilarite.get(2*i) ;
1697     num2=ssimilarite.get(2*i+1) ;
1698 souaissa 87
1699 souaissa 90 if(i>0) num1_avant= ssimilarite.get(2*(i-1));
1700     MG_FACE* face1=mgeo1->get_mg_faceid(num1);
1701     MG_FACE* face2=mgeo1->get_mg_faceid(num2);
1702     if(!lst.est_dans_la_liste(num2))
1703     {
1704 souaissa 87 if(i==0)
1705     {
1706     choisir_une_couleur(val);
1707 souaissa 90 while(lst_val.est_dans_la_liste(val))
1708     {
1709     choisir_une_couleur(val);
1710     }
1711 souaissa 87 face1->ajouter_ccf("Cc",val);
1712 souaissa 90 if(num1!=num2) face2->ajouter_ccf("Cc",val); lst.ajouter(num2);
1713     lst_val.ajouter(val);
1714 souaissa 87 }
1715    
1716     if(i>0)
1717     {
1718     if(num1!=num1_avant)
1719     {
1720 souaissa 90 choisir_une_couleur(val);
1721     while(lst_val.est_dans_la_liste(val))
1722     {
1723 souaissa 87 choisir_une_couleur(val);
1724 souaissa 90 }
1725     face1->ajouter_ccf("Cc",val);
1726     if(num1!=num2) face2->ajouter_ccf("Cc",val); lst.ajouter(num2);
1727     lst_val.ajouter(val);
1728 souaissa 87 }
1729     else{
1730 souaissa 90 if(num1!=num2) face2->ajouter_ccf("Cc",val); lst.ajouter(num2);
1731 souaissa 87 }
1732    
1733     }
1734 souaissa 90 }
1735 souaissa 87 }
1736    
1737    
1738     }
1739    
1740    
1741     }
1742    
1743    
1744     void VCT_COMPARAISON::choisir_une_couleur(double& val)
1745     {
1746 francois 144 //randomize();
1747 souaissa 87
1748     unsigned char r=rand() % 255;
1749     unsigned char g=rand() % 255;
1750     unsigned char b=rand() % 255;
1751     val=0.;
1752     unsigned char* p =(unsigned char*)&val;
1753    
1754     *p=r;
1755     p++;*p=g;
1756     p++;*p=b;
1757    
1758     }
1759    
1760    
1761 souaissa 99 void VCT_COMPARAISON::trouve_face_de_reference(int &face_ref1,int &face_ref2)// ,TPL_LISTE_ENTITE<int>& list
1762     {
1763 souaissa 153
1764     /*
1765 souaissa 99 int nb_simdble=sim_double.get_nb()/2 ;
1766    
1767     int num1,num2 ;
1768    
1769    
1770 souaissa 87 OT_VECTEUR_4DD Dv,Dv1,Dv2,G1,G2,g1g2;
1771     OT_TENSEUR V(4),V1(4),V2(4);
1772    
1773    
1774 souaissa 99 int nbsim=nb_sim.get_nb();
1775     int *t=new int [nbsim];
1776     int *tt=new int [nbsim];
1777     for(int i=0;i<nbsim;i++)
1778     {
1779 souaissa 142 // t[i]= nb_sim.get(i);
1780     t[i]= i;
1781 souaissa 143 int nbre_faces_simil=nb_sim.get(i);
1782     tt[i]=nbre_faces_simil;
1783 souaissa 142
1784 souaissa 99 }
1785     int pos_min,pos_max;
1786     int min,max;
1787     int trouve=0;
1788 souaissa 142
1789     for (int i=0;i<nbsim;i++)
1790     {
1791    
1792     for(int j=0;j<nbsim;j++)
1793     {
1794     if(tt[j]<tt[i])
1795     {
1796     int tmp= tt[i];
1797    
1798     tt[i]= tt[j];
1799     tt[j]= tmp;
1800     t[i]=j;
1801     t[j]=i;
1802     }
1803     }
1804     }
1805    
1806 souaissa 153
1807 souaissa 142 //pos_max=t[1];
1808    
1809     if(tt[0]==1)
1810     {
1811 souaissa 153 pos_min=t[0];
1812 souaissa 142 MG_FACE* fref=mggeo1->get_mg_face(pos_min);
1813     face_ref1= fref->get_id();
1814     for(int i=0;i<nb_simdble;i++){
1815     if (sim_double.get(2*i)==face_ref1)
1816     face_ref2=sim_double.get(2*i+1);
1817     }
1818     return;
1819     }
1820    
1821 souaissa 87
1822 souaissa 142 int pos1=0;
1823     int pos2=0;
1824 souaissa 99
1825 souaissa 142 int tr=0;
1826     trouve=0;
1827 souaissa 143 while(trouve==0&&tr<nbsim-1)
1828 souaissa 142 {
1829     pos_min=t[tr];
1830     pos_max=t[tr+1];
1831    
1832 souaissa 143 OT_VECTEUR_4DD g1_ref,g2_ref,G1_ref,G2_ref;
1833 souaissa 99 MG_FACE* face1_ref=mggeo1->get_mg_face(pos_min);
1834 souaissa 153 MG_SURFACE* surf1_ref=face1_ref->get_surface();
1835 souaissa 99 int id1=face1_ref->get_id();
1836 souaissa 153 face1_ref->get_vectorisation().calcule_axes_dinertie(T1,Dv1,V1);
1837     G1_ref= face1_ref->get_vectorisation().calcule_barycentre(T1);
1838     /*
1839 souaissa 87 for(int r=0;r<4;r++) {
1840     for(int s=0;s<4;s++) {
1841 souaissa 143 g1_ref[r]= g1_ref[r]+V1(s,r)*G1_ref[s];
1842 souaissa 87 }
1843     }
1844 souaissa 153 /
1845     g1_ref=face1_ref->get_vectorisation().get_nouveau_pt(T1,G1_ref);
1846     /* OT_TENSEUR ttns1_face=face1_ref->get_vectorisation().calcule_tenseur_inertie_base_locale();
1847     vector<double2> ifac1;
1848     for(int r=0;r<4;r++)
1849     {
1850     ifac1.insert( ifac2.end(), ttns1_face(r,r));
1851     } /
1852 souaissa 87
1853 souaissa 99 MG_FACE* face12_ref=mggeo1->get_mg_face(pos_max);
1854 souaissa 153 face12_ref->get_vectorisation().calcule_axes_dinertie(T2,Dv2,V2);
1855 souaissa 99 int id2=face12_ref->get_id();
1856 souaissa 153 G2_ref= face12_ref->get_vectorisation().calcule_barycentre(T2);
1857     /*
1858 souaissa 87 for(int r=0;r<4;r++) {
1859     for(int s=0;s<4;s++) {
1860 souaissa 143 g2_ref[r]= g2_ref[r]+V1(s,r)*G2_ref[s];
1861 souaissa 87 }
1862     }
1863 souaissa 153 /
1864     g2_ref=face12_ref->get_vectorisation().get_nouveau_pt(T1,G2_ref);
1865 souaissa 87
1866 souaissa 99 OT_VECTEUR_4DD g12_ref= g2_ref -g1_ref;
1867    
1868    
1869 souaissa 87 OT_VECTEUR_4DD g1refg1,g2refg2;
1870 souaissa 99 TPL_LISTE_ENTITE<int> lst1,lst2;
1871     for(int k=0;k<nb_simdble;k++)
1872     {
1873     if(sim_double.get(2*k)==id1)
1874     lst1.ajouter( sim_double.get(2*k+1));
1875     if(sim_double.get(2*k)==id2)
1876     lst2.ajouter(sim_double.get(2*k+1));
1877     }
1878 souaissa 87
1879 souaissa 99
1880    
1881 souaissa 142
1882 souaissa 99 for(int i=0;i<lst1.get_nb();i++)
1883 souaissa 87 {
1884 souaissa 99
1885     int num1=lst1.get(i);
1886     OT_VECTEUR_4DD g1,G1;
1887     MG_FACE* face1=mggeo2->get_mg_faceid(num1);
1888 souaissa 153 face1->get_vectorisation().calcule_axes_dinertie(T2,Dv2,V2);
1889     G1= face1->get_vectorisation().calcule_barycentre(T2);
1890     /*
1891 souaissa 87 for(int r=0;r<4;r++) {
1892     for(int s=0;s<4;s++) {
1893 souaissa 99 g1[r]= g1[r]+V2(s,r)*G1[s];
1894 souaissa 87 }
1895     }
1896 souaissa 153 /
1897 souaissa 99 // g1refg1=g1-g1_ref;
1898     // num2=list.get(2*i+1);
1899     for(int j=0;j<lst2.get_nb();j++)
1900     {
1901     int num2=lst2.get(j);
1902 souaissa 87 OT_VECTEUR_4DD g2;
1903     MG_FACE* face2=mggeo2->get_mg_faceid(num2);
1904 souaissa 153 G2= face2->get_vectorisation().calcule_barycentre(T2);
1905     /*
1906 souaissa 87 for(int r=0;r<4;r++) {
1907     for(int s=0;s<4;s++) {
1908     g2[r]= g2[r]+V2(s,r)*G2[s];
1909     }
1910     }
1911 souaissa 153 /
1912     //OT_VECTEUR_4DD g2g1=g2-g1;
1913     OT_VECTEUR_4DD g2g1=G2-G1;
1914 souaissa 99 if(g2g1==g12_ref)
1915 souaissa 87 {
1916 souaissa 99 // lst_fin.ajouter(num1);
1917     // lst_fin.ajouter(num2);
1918     face_ref1=id1;
1919     face_ref2=num1;
1920     trouve=1;
1921     break;
1922 souaissa 87 }
1923 souaissa 99 }
1924     if(trouve) break;
1925 souaissa 87 }
1926 souaissa 142 tr++;
1927     }
1928 souaissa 100 delete [] t;
1929     delete [] tt;
1930 souaissa 153 */
1931 souaissa 87
1932 souaissa 154 int p=0;
1933     int h=0;
1934     int not_trouve=0;
1935     while(!not_trouve)
1936     {
1937     MG_FACE* face1Ref=mggeo1->get_mg_faceid(sim_double.get(p));
1938 souaissa 153 MG_SURFACE* surf1Ref=face1Ref->get_surface();
1939 souaissa 154 OT_VECTEUR_4DD G1=surf1Ref->get_vectorisation().calcule_barycentre(T1);
1940     G1= surf1Ref->get_vectorisation().get_nouveau_pt(T1,G1);
1941 souaissa 153
1942     int idRef1=face1Ref->get_id();
1943    
1944     int k=0;
1945 souaissa 154 while(idRef1==sim_double.get(2*k+h))
1946 souaissa 153 {
1947     MG_FACE* face2Ref=mggeo2->get_mg_faceid(sim_double.get(2*k+1));
1948     int idRef2=face2Ref->get_id();
1949     MG_SURFACE* surf2Ref=face2Ref->get_surface();
1950 souaissa 154 OT_VECTEUR_4DD G2=surf2Ref->get_vectorisation().calcule_barycentre(T2);
1951 souaissa 162 // if (G1==G2)
1952     if (surfaces_sont_elles_identiques(face1Ref,face2Ref))
1953 souaissa 153 {
1954     face_ref1=idRef1;
1955     face_ref2=idRef2;
1956 souaissa 154 not_trouve=1;
1957 souaissa 153 break;
1958     }
1959     k++;
1960 souaissa 154 p=p+2;
1961 souaissa 153 }
1962 souaissa 154 h=p;
1963 souaissa 142 }
1964 souaissa 154 }
1965 souaissa 142
1966    
1967 souaissa 153 void VCT_COMPARAISON::verifier_le_repere(OT_TENSEUR& rep1,OT_TENSEUR& rep2,vector<double2>& inert1,vector<double2>& inert2)
1968     {
1969     TPL_LISTE_ENTITE<int> lst;
1970     for(int i=0;i<4;i++)
1971     {
1972     double2 val1=inert1[i];
1973     for(int j=0;j<4;j++)
1974     {
1975     if(!lst.est_dans_la_liste(j+4))
1976     {
1977     double2 val2=inert2[j];
1978     if(val1==val2)
1979     {
1980     lst.ajouter(i);
1981     lst.ajouter(j+4);
1982     break;
1983     }
1984     }
1985     }
1986     }
1987 souaissa 142
1988    
1989 souaissa 153 }
1990 souaissa 142
1991 souaissa 153
1992 souaissa 142 int VCT_COMPARAISON::comparer_aretes_faces(MG_FACE* f_ref1,MG_FACE* f_ref2,MG_FACE* face1,MG_FACE* face2,TPL_LISTE_ENTITE<int>& aretes_ident,TPL_LISTE_ENTITE<int>& aretes_sim)
1993     {
1994    
1995 souaissa 153
1996 souaissa 142 int nb_boucle1=face1->get_nb_mg_boucle();
1997     int nb_boucle2=face2->get_nb_mg_boucle();
1998 souaissa 158 TPL_LISTE_ENTITE<int> lst1_artes_delamemecourbe;
1999     TPL_LISTE_ENTITE<int> lst2_artes_delamemecourbe;
2000 souaissa 153 TPL_LISTE_ENTITE<int> arte1_trouvee;
2001     TPL_LISTE_ENTITE<int> arte2_trouvee;
2002 souaissa 158 OT_VECTEUR_4DD VZER(0.,0.,0.,0.);
2003 souaissa 142 //-----------------------------------------------------------------------------
2004     OT_VECTEUR_4DD Dv1,Dv2,G1,gf1,gf2,G2;
2005     OT_TENSEUR V1(4),V2(4);
2006    
2007 souaissa 153 //f_ref1->get_vectorisation().calcule_axes_dinertie(T1,Dv1,V1);
2008     //G1=f_ref1->get_vectorisation().calcule_barycentre(T1);
2009 souaissa 142
2010 souaissa 153 MG_SURFACE* surf1_ref=f_ref1->get_surface();
2011     G1=surf1_ref->get_vectorisation().calcule_barycentre(T1);
2012     G1=surf1_ref->get_vectorisation().get_nouveau_pt(T1,G1);
2013     // for(int r=0;r<4;r++) {
2014     // for(int s=0;s<4;s++) {
2015     // gf1[r]= gf1[r]+V1(s,r)*G1[s];
2016     // }
2017     // }
2018 souaissa 142
2019 souaissa 153 //f_ref2->get_vectorisation().calcule_axes_dinertie(T2,Dv2,V2);
2020     //G2=f_ref2->get_vectorisation().calcule_barycentre(T2);
2021     MG_SURFACE* surf2_ref= f_ref2->get_surface();
2022     G2=surf1_ref->get_vectorisation().calcule_barycentre(T2);
2023 souaissa 142
2024 souaissa 153 // for(int r=0;r<4;r++) {
2025     // for(int s=0;s<4;s++) {
2026     // gf2[r]= gf2[r]+V2(s,r)*G2[s];
2027     // }
2028     // }
2029 souaissa 142
2030     //---------------------------------------------------------------------------
2031 souaissa 158 /* for(int j1=0;j1<nb_boucle1;j1++)
2032     {
2033     MG_BOUCLE* Boucle1 = face1->get_mg_boucle(j1);
2034     int nbarete1 = Boucle1->get_nb_mg_coarete();
2035     for (int w1 =0; w1<nbarete1;w1++)
2036     {
2037     double xyz1[3];
2038     double xyz2[3];
2039     vector<double2> viarte1,vicrbe1;
2040     OT_TENSEUR tns_arete1(4),tns_courbe1(4);
2041     OT_TENSEUR tm1_art(4),tm1_crb(4);
2042     MG_COARETE* coArete1 = Boucle1->get_mg_coarete(w1);
2043     MG_ARETE* arete1 = coArete1->get_arete();
2044     int id_art1=arete1->get_id();
2045     MG_COURBE* courbe1=arete1->get_courbe();
2046     int nb_top1_pts= arete1->get_vectorisation().get_nb_points();
2047     int nb_geo1_pts= courbe1->get_vectorisation().get_nb_points();
2048     tm1_art=arete1->get_vectorisation().calcule_tenseur_metrique();
2049     tm1_crb=courbe1->get_vectorisation().calcule_tenseur_metrique();
2050     tns_arete1=arete1->get_vectorisation().calcule_tenseur_inertie_base_locale(T1);
2051     tns_courbe1=courbe1->get_vectorisation().calcule_tenseur_inertie_base_locale(T1);
2052    
2053     for(int r=0;r<4;r++)
2054     {
2055     viarte1.insert( viarte1.end(), tns_arete1(r,r));
2056     vicrbe1.insert( vicrbe1.end(), tns_courbe1(r,r));
2057     }
2058     for(int j2=0;j2<nb_boucle2;j2++)
2059     {
2060     MG_BOUCLE* Boucle2 = face2->get_mg_boucle(j2);
2061     int nbarete2 = Boucle2->get_nb_mg_coarete();
2062     for (int w2 =0; w2<nbarete2;w2++)
2063     {
2064     double xyz1[3];
2065     double xyz2[3];
2066     vector<double2> viarte2,vicrbe2;
2067     OT_TENSEUR tns_arete2(4),tns_courbe2(4);
2068     OT_TENSEUR tm2_art(4),tm2_crb(4);
2069     MG_COARETE* coArete2 = Boucle2->get_mg_coarete(w2);
2070     MG_ARETE* arete2 = coArete2->get_arete();
2071     int id_art2=arete2->get_id();
2072     MG_COURBE* courbe2=arete2->get_courbe();
2073     int nb_top2_pts= arete2->get_vectorisation().get_nb_points();
2074     int nb_geo2_pts= courbe2->get_vectorisation().get_nb_points();
2075     tm2_art=arete2->get_vectorisation().calcule_tenseur_metrique();
2076     tm2_crb=courbe2->get_vectorisation().calcule_tenseur_metrique();
2077     tns_arete2=arete2->get_vectorisation().calcule_tenseur_inertie_base_locale(T2);
2078     tns_courbe2=courbe2->get_vectorisation().calcule_tenseur_inertie_base_locale(T2);
2079    
2080     for(int r=0;r<4;r++)
2081     {
2082     viarte2.insert( viarte2.end(), tns_arete1(r,r));
2083     vicrbe2.insert( vicrbe2.end(), tns_courbe1(r,r));
2084     }
2085     if((nb_geo1_pts==nb_geo2_pts)&&(nb_top1_pts==nb_top2_pts))
2086     {
2087     if(tm1_art.est_til_equivalent(tm2_art))
2088     {
2089     if(tm1_crb.est_til_equivalent(tm2_crb))
2090     {
2091     if(tns_courbe1==tns_courbe2)
2092     {
2093     lst1_artes_delamemecourbe.ajouter(id_art1);
2094     lst2_artes_delamemecourbe.ajouter(id_art2);
2095     }
2096     }
2097     }
2098    
2099    
2100     }
2101    
2102    
2103     }
2104     }
2105     }
2106     }
2107    
2108     vector<OT_VECTEUR_4DD> lst1_barycentre;
2109     vector<OT_VECTEUR_4DD> lst2_barycentre;
2110     TPL_LISTE_ENTITE<int> lst1,lst2;
2111     for(int i1=0;i1<lst2_artes_delamemecourbe.get_nb();i1++)
2112     {
2113     int id21=lst2_artes_delamemecourbe.get(i1);
2114     MG_ARETE* art2=mggeo2->get_mg_areteid(id21);
2115     OT_VECTEUR_4DD G2=art2->get_vectorisation().calcule_barycentre(T2);
2116     if(!lst2.est_dans_la_liste(id21))
2117     {
2118     lst2_barycentre.insert(lst2_barycentre.end(),G2);
2119     for(int i2=0;i2<lst2_artes_delamemecourbe.get_nb();i2++)
2120     {
2121     int id22=lst2_artes_delamemecourbe.get(i2);
2122 francois 258 int id1=lst1_artes_delamemecourbe.get(i2);REMAILLEUR
2123 souaissa 158 if(!lst1.est_dans_la_liste(id1))
2124     {
2125     if(id21==id22)
2126     {
2127     MG_ARETE* art1=mggeo1->get_mg_areteid(id1);
2128     OT_VECTEUR_4DD G1=art1->get_vectorisation().calcule_barycentre(T1);
2129     G1=art1->get_vectorisation().get_nouveau_pt(T1,G1);
2130     lst1_barycentre.insert(lst1_barycentre.end(),G1);
2131     lst1.ajouter(id1);
2132     }
2133     }
2134     }
2135     lst2.ajouter(id21);
2136     }
2137     }
2138    
2139    
2140     vector<double2> NOR1,NOR2;
2141     vector<OT_VECTEUR_4DD> vi,vj;
2142     OT_VECTEUR_4DD g1=lst1_barycentre[0];
2143     for(int k=0;k<lst1_barycentre.size();k++)
2144     {
2145     OT_VECTEUR_4DD gigj_1=lst1_barycentre[k]-g1;
2146    
2147     double2 nor1=gigj_1.norme();
2148     OT_VECTEUR_4DD gigj_2=lst1_barycentre[k]-g1;
2149     double2 nor2=gigj_2.norme();
2150     }
2151     for(int k=0;k<lst1_barycentre.size();k++)
2152     {
2153     OT_VECTEUR_4DD gigj_1=lst1_barycentre[k]-g1;
2154     vi.insert(vi.end(),gigj_1);
2155     double2 nor1=gigj_1.norme();
2156     NOR1.insert(NOR1.end(),nor1);
2157     OT_VECTEUR_4DD gigj_2=lst1_barycentre[k]-g1;
2158     vj.insert(vj.end(),gigj_2);
2159     double2 nor2=gigj_2.norme();
2160     NOR2.insert(NOR2.end(),nor2);
2161     }
2162    
2163     double2 min1=NOR1[0];
2164     double2 min2=NOR2[0];
2165     int *t1=new int[lst1.get_nb()];
2166     int *t2=new int[lst2.get_nb()];
2167    
2168     for(int r=0;r<lst1.get_nb();r++)
2169     {
2170     t1[r]=lst1.get(r);
2171     t2[r]=lst2.get(r);
2172     for(int s=0;s<lst1.get_nb();s++)
2173     {
2174     if (NOR1[s]<NOR1[r])
2175     {
2176     double2 tmp1=NOR1[r];
2177     NOR1[r]=NOR1[s];
2178     NOR1[s]=tmp1;
2179     t1[r]=t1[s];
2180     }
2181    
2182     if (NOR2[s]<NOR2[r])
2183     {
2184     double2 tmp2=NOR2[r];
2185     NOR2[r]=NOR2[s];
2186     NOR2[s]=tmp2;
2187     t2[r]=t2[s];
2188     }
2189     }
2190     } */
2191     //---------------------------------------------------------------------------
2192 souaissa 142 int nb_aretes=0;
2193     for(int j1=0;j1<nb_boucle1;j1++)
2194     {
2195     MG_BOUCLE* Boucle1 = face1->get_mg_boucle(j1);
2196     int nbarete1 = Boucle1->get_nb_mg_coarete();
2197     nb_aretes+=nbarete1;
2198     for (int w1 =0; w1<nbarete1;w1++)
2199     {
2200 souaissa 158 double xyz1[3];
2201     double xyz2[3];
2202 souaissa 142 OT_TENSEUR tns_arete1(4),tns_courbe1(4);
2203     OT_TENSEUR tm1_art(4),tm1_crb(4);
2204     MG_COARETE* coArete1 = Boucle1->get_mg_coarete(w1);
2205     MG_ARETE* arete1 = coArete1->get_arete();
2206     int id_art1=arete1->get_id();
2207    
2208     MG_COURBE* courbe1=arete1->get_courbe();
2209    
2210     int nb_top1_pts= arete1->get_vectorisation().get_nb_points();
2211     int nb_geo1_pts= courbe1->get_vectorisation().get_nb_points();
2212    
2213     tm1_art=arete1->get_vectorisation().calcule_tenseur_metrique();
2214     tm1_crb=courbe1->get_vectorisation().calcule_tenseur_metrique();
2215    
2216 souaissa 158 MG_COSOMMET* csomt1_art1= arete1->get_cosommet1();
2217     MG_COSOMMET* csomt2_art1= arete1->get_cosommet2();
2218     MG_SOMMET* som1_art1= csomt1_art1->get_sommet();
2219     MG_SOMMET* som2_art1= csomt2_art1->get_sommet();
2220     MG_POINT* pt1=som1_art1->get_point();
2221     MG_POINT* pt2=som2_art1->get_point();
2222     pt1->evaluer(xyz1);
2223     OT_VECTEUR_4DD PT11(xyz1[0],xyz1[1],xyz1[2],0);
2224     pt2->evaluer(xyz2);
2225     OT_VECTEUR_4DD PT12(xyz2[0],xyz2[1],xyz2[2],0);
2226 souaissa 142 //----------------------------------------------------------------------
2227     OT_VECTEUR_4DD B1,g1;
2228 souaissa 154 B1=courbe1->get_vectorisation().calcule_barycentre(T1);
2229 souaissa 158 OT_VECTEUR_4DD G1S1=B1-PT11;
2230    
2231 souaissa 154 B1=courbe1->get_vectorisation().get_nouveau_pt(T1,B1);
2232 souaissa 158 G1S1=courbe1->get_vectorisation().get_nouveau_pt(T1,G1S1);
2233 souaissa 153 // for(int r=0;r<4;r++) {
2234     // for(int s=0;s<4;s++)
2235     // g1[r]= g1[r]+V1(s,r)*B1[s];
2236     // }
2237 souaissa 142 //----------------------------------------------------------------------
2238    
2239 souaissa 153 tns_arete1=arete1->get_vectorisation().calcule_tenseur_inertie_base_locale(T1);
2240     tns_courbe1=courbe1->get_vectorisation().calcule_tenseur_inertie_base_locale(T1);
2241 souaissa 142 vector<double2> viarte1,vicrbe1;
2242     for(int r=0;r<4;r++)
2243     {
2244     viarte1.insert( viarte1.end(), tns_arete1(r,r));
2245     vicrbe1.insert( vicrbe1.end(), tns_courbe1(r,r));
2246     }
2247 souaissa 153 int compt_aretes_modif=0;
2248 souaissa 142 for(int j2=0;j2<nb_boucle2;j2++)
2249     {
2250 souaissa 153 if(arte1_trouvee.est_dans_la_liste(id_art1)) break;
2251 souaissa 142 MG_BOUCLE* Boucle2 = face2->get_mg_boucle(j2);
2252     int nbarete2 = Boucle2->get_nb_mg_coarete();
2253     for (int w2 =0; w2<nbarete2;w2++)
2254     {
2255 souaissa 153 if(arte1_trouvee.est_dans_la_liste(id_art1)) break;
2256 souaissa 142 OT_TENSEUR tns_arete2(4),tns_courbe2(4);
2257     OT_TENSEUR tm2_art(4),tm2_crb(4);
2258     MG_COARETE* coArete2 = Boucle2->get_mg_coarete(w2);
2259     MG_ARETE* arete2 = coArete2->get_arete();
2260     MG_COURBE* courbe2=arete2->get_courbe();
2261     int id_art2=arete2->get_id();
2262 souaissa 158 MG_COSOMMET* csomt1_art2= arete2->get_cosommet1();
2263     MG_COSOMMET* csomt2_art2= arete2->get_cosommet2();
2264     MG_SOMMET* som1_art2= csomt1_art2->get_sommet();
2265     MG_SOMMET* som2_art2= csomt2_art2->get_sommet();
2266     MG_POINT* pt2=som1_art2->get_point();
2267     pt2->evaluer(xyz1);
2268     OT_VECTEUR_4DD PT21(xyz1[0],xyz1[1],xyz1[2],0);
2269     MG_POINT* pt3=som2_art2->get_point();
2270     pt3->evaluer(xyz2);
2271     OT_VECTEUR_4DD PT22(xyz2[0],xyz2[1],xyz2[2],0);
2272 souaissa 142 //----------------------------------------------------------------------
2273     OT_VECTEUR_4DD B2,g2;
2274 souaissa 154 B2=courbe2->get_vectorisation().calcule_barycentre(T2);
2275 souaissa 158 OT_VECTEUR_4DD G2S2=B2-PT21;
2276     OT_VECTEUR_4DD G2S3=B2-PT22;
2277     OT_VECTEUR_4DD B1B2=B2-B1;
2278     OT_VECTEUR_4DD D1= G1S1^G2S2;
2279     OT_VECTEUR_4DD D2= G1S1^G2S3;
2280     // OT_VECTEUR_4DD D3= B1B2^G2S3;
2281 souaissa 153 // for(int r=0;r<4;r++) {
2282     // for(int s=0;s<4;s++)
2283     // g2[r]= g2[r]+V2(s,r)*B2[s];
2284     // }
2285 souaissa 142 //---------------------------------------------------------------------- MG_COURBE* courbe2=arete2->get_courbe();
2286    
2287     int nb_top2_pts= arete2->get_vectorisation().get_nb_points();
2288     int nb_geo2_pts= courbe2->get_vectorisation().get_nb_points();
2289    
2290     tm2_art=arete2->get_vectorisation().calcule_tenseur_metrique();
2291     tm2_crb=courbe2->get_vectorisation().calcule_tenseur_metrique();
2292    
2293 souaissa 153 tns_arete2=arete2->get_vectorisation().calcule_tenseur_inertie_base_locale(T2);
2294     tns_courbe2=courbe2->get_vectorisation().calcule_tenseur_inertie_base_locale(T2);
2295 souaissa 142
2296     vector<double2> viarte2,vicrbe2;
2297     for(int r=0;r<4;r++)
2298     {
2299     viarte2.insert( viarte2.end(), tns_arete2(r,r));
2300     vicrbe2.insert( vicrbe2.end(), tns_courbe2(r,r));
2301     }
2302    
2303     if(nb_geo1_pts==nb_geo2_pts&&nb_top1_pts==nb_top2_pts)
2304     {
2305     if(tm1_art.est_til_equivalent(tm2_art))
2306     {
2307     if(tm1_crb.est_til_equivalent(tm2_crb))
2308     {
2309     vector<unsigned int> indx1,indx2;
2310     int identique=-1;
2311 souaissa 153 //if(tns_arete1==tns_arete2)//.listes_equivalentes(viarte1,viarte2,indx1))
2312     //{
2313 souaissa 142 if(tns_courbe1==tns_courbe2)//tns_arete1.listes_equivalentes(vicrbe1,vicrbe2,indx2))
2314     {
2315 souaissa 153 OT_VECTEUR_4DD v1=B1-G1;
2316     OT_VECTEUR_4DD v2=B2-G2;
2317     //OT_VECTEUR_4DD v1=gf1-g1;
2318     //OT_VECTEUR_4DD v2=gf2-g2;
2319 souaissa 159 //if(v1==v2||((D1==VZER||D2==VZER)))
2320     if(courbes_sont_elles_identiques(arete1,arete2))
2321 souaissa 142 {
2322 souaissa 158 if(!arte2_trouvee.est_dans_la_liste(id_art2))
2323     {
2324     aretes_ident.ajouter(j1) ;
2325     aretes_ident.ajouter(id_art1) ;
2326     aretes_ident.ajouter(j2) ;
2327     aretes_ident.ajouter(id_art2) ;
2328     arte1_trouvee.ajouter(id_art1);
2329     arte2_trouvee.ajouter(id_art2);
2330     identique=1;
2331     }
2332 souaissa 142
2333 souaissa 153
2334 souaissa 142 }
2335    
2336     }
2337 souaissa 153 // }
2338 souaissa 142 if(identique>0) break;
2339     if(identique<0)
2340     {
2341     aretes_sim.ajouter(j1) ;
2342     aretes_sim.ajouter(id_art1) ;
2343     aretes_sim.ajouter(j2) ;
2344     aretes_sim.ajouter(id_art2) ;
2345     identique=-1;
2346     }
2347     }
2348     }
2349     } // aretes2
2350    
2351     } //boucle2
2352    
2353 souaissa 153 // }//condition 1 //aretes_identiques
2354 souaissa 142 }
2355    
2356     }
2357     }
2358    
2359     if(nb_aretes==aretes_ident.get_nb()/2) return 1;
2360     else return 0;
2361    
2362     }
2363    
2364 souaissa 153 void VCT_COMPARAISON::identifier_aretes_face_modifiee(MG_FACE* face1,MG_FACE* face2,TPL_LISTE_ENTITE<int>& aretes_identiques,
2365     TPL_LISTE_ENTITE<int>&aretes_simil,TPL_LISTE_ENTITE<int>&lst_corrsp_sommets,TPL_LISTE_ENTITE<int>& aret1_conservees,
2366     TPL_LISTE_ENTITE<int>& aret1_disparues,TPL_LISTE_ENTITE<int>& aret2_conservees ,TPL_LISTE_ENTITE<int>& aret2_nouvelles ,
2367     TPL_LISTE_ENTITE<int>& aret_partielles)
2368 souaissa 142 {
2369    
2370     int nb_boucle1=face1->get_nb_mg_boucle();
2371     int nb_boucle2=face2->get_nb_mg_boucle();
2372    
2373    
2374     int cmpt_arete=0;
2375    
2376     TPL_LISTE_ENTITE<int> boucle_face1;
2377     TPL_LISTE_ENTITE<int> boucle_face2;
2378    
2379     TPL_LISTE_ENTITE<int> aretes_ident_face1;
2380     TPL_LISTE_ENTITE<int> aretes_ident_face2;
2381     TPL_LISTE_ENTITE<int> aretes_face1;
2382     TPL_LISTE_ENTITE<int> aretes_face2;
2383     TPL_LISTE_ENTITE<int> aretes_dif_face2;
2384     TPL_LISTE_ENTITE<int> aretes_sim_face1;
2385     TPL_LISTE_ENTITE<int> aretes_sim_face2;
2386 souaissa 153 TPL_LISTE_ENTITE<int> lst_sommet1;
2387     TPL_LISTE_ENTITE<int> lst_sommet2;
2388 souaissa 142
2389 souaissa 153 for(int b=0;b<lst_corrsp_sommets.get_nb()/2;b++)
2390     {
2391     lst_sommet1.ajouter( lst_corrsp_sommets.get(2*b));
2392     lst_sommet2.ajouter( lst_corrsp_sommets.get(2*b+1));
2393     }
2394    
2395 souaissa 142 for(int b=0;b<aretes_identiques.get_nb()/4;b++)
2396 souaissa 87 {
2397 souaissa 153 int b1= aretes_identiques.get(4*b) ;
2398     int b2= aretes_identiques.get(4*b+2) ;
2399     int art1= aretes_identiques.get(4*b+1);
2400     int art2= aretes_identiques.get(4*b+3);
2401 souaissa 142 boucle_face1.ajouter( aretes_identiques.get(4*b));
2402     boucle_face2.ajouter( aretes_identiques.get(4*b+2));
2403     aretes_ident_face1.ajouter(aretes_identiques.get(4*b+1));
2404     aretes_ident_face2.ajouter(aretes_identiques.get(4*b+3));
2405 souaissa 158 aret1_conservees.ajouter(art1);
2406     aret2_conservees.ajouter(art2);
2407    
2408 souaissa 142 }
2409 souaissa 158
2410    
2411     for(int j1=0;j1<nb_boucle1;j1++)
2412     {
2413     MG_BOUCLE* Boucle1 = face1->get_mg_boucle(j1);
2414     int nbarete1 = Boucle1->get_nb_mg_coarete();
2415    
2416     for (int w1=0; w1<nbarete1;w1++)
2417     {
2418     MG_COARETE* coArete1 = Boucle1->get_mg_coarete(w1);
2419     MG_ARETE* arete1 = coArete1->get_arete();
2420     int id_art1=arete1->get_id();
2421     if(!aretes_ident_face1.est_dans_la_liste(id_art1))
2422     {
2423     aret1_disparues.ajouter(id_art1);
2424     }
2425     }
2426     }
2427    
2428     for(int j2=0;j2<nb_boucle2;j2++)
2429     {
2430     MG_BOUCLE* Boucle2 = face2->get_mg_boucle(j2);
2431     int nbarete2 = Boucle2->get_nb_mg_coarete();
2432     for (int w2=0; w2<nbarete2;w2++)
2433     {
2434     MG_COARETE* coArete2 = Boucle2->get_mg_coarete(w2);
2435     MG_ARETE* arete2 = coArete2->get_arete();
2436     int id_art2=arete2->get_id();
2437     if(!aretes_ident_face2.est_dans_la_liste(id_art2))
2438     {
2439     aret2_nouvelles.ajouter(id_art2);
2440     }
2441    
2442     }
2443     }
2444     /*
2445 souaissa 142 for(int b=0;b<aretes_simil.get_nb()/4;b++)
2446     {
2447     aretes_sim_face1.ajouter(aretes_simil.get(4*b+1));
2448     aretes_sim_face2.ajouter(aretes_simil.get(4*b+3));
2449     }
2450    
2451 souaissa 153 MG_FACE* Face_ref1=mggeo1->get_mg_faceid(face_ref1) ;
2452     MG_FACE* Face_ref2=mggeo2->get_mg_faceid(face_ref2) ;
2453    
2454 souaissa 142 for(int j1=0;j1<nb_boucle1;j1++)
2455     {
2456     MG_BOUCLE* Boucle1 = face1->get_mg_boucle(j1);
2457     int nbarete1 = Boucle1->get_nb_mg_coarete();
2458 souaissa 153 TPL_LISTE_ENTITE<int> lst_aret1_modif;
2459     TPL_LISTE_ENTITE<int> lst_aret2_modif;
2460     TPL_LISTE_ENTITE<int> lst_art1_partiel;
2461     TPL_LISTE_ENTITE<int> lst_art2_partiel;
2462 souaissa 142 int compt1=0;
2463     int boucle;
2464     int start_boucle,end_boucle;
2465     int cmpt=0;
2466     TPL_LISTE_ENTITE<int> arete_boucle1;
2467     TPL_LISTE_ENTITE<int> arete_boucle2;
2468    
2469     if(boucle_face1.est_dans_la_liste(j1))
2470     {
2471     for(int k=0;k<boucle_face1.get_nb();k++)
2472     {
2473     if (j1==boucle_face1.get(k))
2474     {
2475 souaissa 153 int art1=aretes_ident_face1.get(k);
2476     int art2= aretes_ident_face2.get(k);
2477 souaissa 142 arete_boucle1.ajouter(aretes_ident_face1.get(k));
2478     arete_boucle2.ajouter(aretes_ident_face2.get(k));
2479     boucle=boucle_face2.get(k);
2480     }
2481     }
2482     }
2483    
2484 souaissa 153 for (int w1=0; w1<nbarete1;w1++)
2485 souaissa 87 {
2486 souaissa 142
2487 souaissa 153 MG_COARETE* coArete1 = Boucle1->get_mg_coarete(w1);
2488     MG_ARETE* arete1 = coArete1->get_arete();
2489     int id_art=arete1->get_id();
2490     int trouv=-1;
2491     for (int w1=0; w1<arete_boucle1.get_nb();w1++)
2492     {
2493     int id_art1=arete_boucle1.get(w1);
2494     int id_art2=arete_boucle2.get(w1);
2495    
2496     if(id_art1==id_art)
2497 souaissa 142 {
2498 souaissa 153 aret1_conservees.ajouter(id_art1);
2499     aret2_conservees.ajouter(id_art2);
2500     trouv=1;
2501     break;
2502 souaissa 142 }
2503 souaissa 153 }
2504     if(trouv<0)
2505 souaissa 142 {
2506 souaissa 153 //if(!aretes_sim_face1.est_dans_la_liste(id_art1))
2507     aret1_disparues.ajouter(id_art);
2508     //lst_aret1_modif.ajouter(id_art1);
2509 souaissa 142 }
2510 souaissa 153
2511     }
2512 souaissa 142
2513 souaissa 153 // for(int j2=0;j2<nb_boucle2;j2++)
2514     // {
2515     // MG_BOUCLE* Boucle2 = face2->get_mg_boucle(j2);
2516     MG_BOUCLE* Boucle2 = face2->get_mg_boucle(boucle);
2517 souaissa 142 int nbarete2 = Boucle2->get_nb_mg_coarete();
2518    
2519     for (int w2=0; w2<nbarete2;w2++)
2520 souaissa 153 {
2521 souaissa 142 MG_COARETE* coArete2 = Boucle2->get_mg_coarete(w2);
2522     MG_ARETE* arete2 = coArete2->get_arete();
2523     int id_art2=arete2->get_id();
2524     if(!arete_boucle2.est_dans_la_liste(id_art2))
2525     {
2526     aret2_nouvelles.ajouter(id_art2);
2527 souaissa 153 //lst_aret2_modif.ajouter(id_art2);
2528     //for(int is=0;is<aretes_sim_face2.get_nb();is++)
2529     //{
2530     //if(aretes_sim_face2.get(is)==id_art2)
2531     // {
2532     // aret2_partielles.ajouter(id_art2);
2533     // }
2534     // }
2535 souaissa 142
2536     }
2537 souaissa 153 // else
2538    
2539     // aret2_conservees.ajouter(id_art2);
2540     }
2541    
2542     //verifier parmi les deux listes des aretes modifiees
2543     //celles qui sont nouvelles ou partiellements modifees
2544     /*
2545     for(int m1=0;m1<lst_aret1_modif.get_nb();m1++)
2546 souaissa 142 {
2547 souaissa 153 int id_art1=lst_aret1_modif.get(m1);
2548     MG_ARETE* art1=mggeo1->get_mg_areteid(id_art1);
2549 souaissa 142
2550 souaissa 153 OT_TENSEUR tm1_art(4),tm1_crb(4);
2551     MG_COURBE* courbe1=art1->get_courbe();
2552     tm1_art=art1->get_vectorisation().calcule_tenseur_metrique();
2553     tm1_crb=courbe1->get_vectorisation().calcule_tenseur_metrique();
2554 souaissa 142
2555 souaissa 153
2556     MG_COSOMMET* csomt1_art1= art1->get_cosommet1();
2557     MG_COSOMMET* csomt2_art1= art1->get_cosommet2();
2558     MG_SOMMET* som1_art1= csomt1_art1->get_sommet();
2559     MG_SOMMET* som2_art1= csomt2_art1->get_sommet();
2560     int id_som11= som1_art1->get_id();
2561     int id_som21= som2_art1->get_id();
2562     int s11_ou_s21;
2563     if(lst_sommet1.est_dans_la_liste(id_som11)) s11_ou_s21=1;
2564     if(lst_sommet1.est_dans_la_liste(id_som21)) s11_ou_s21=2;
2565 souaissa 142
2566 souaissa 153 if(lst_sommet1.est_dans_la_liste(id_som11)||lst_sommet1.est_dans_la_liste(id_som21))
2567     {
2568     for(int m2=0;m2<lst_aret2_modif.get_nb();m2++)
2569     {
2570     int id_art2=lst_aret2_modif.get(m2);
2571     MG_ARETE* art2=mggeo2->get_mg_areteid(id_art2);
2572     OT_TENSEUR tm2_art(4),tm2_crb(4);
2573     MG_COURBE* courbe2=art2->get_courbe();
2574     tm2_art=art1->get_vectorisation().calcule_tenseur_metrique();
2575     tm2_crb=courbe2->get_vectorisation().calcule_tenseur_metrique();
2576    
2577     MG_COSOMMET* csomt1_art2= art2->get_cosommet1();
2578     MG_COSOMMET* csomt2_art2= art2->get_cosommet2();
2579     MG_SOMMET* som1_art2= csomt1_art2->get_sommet();
2580     MG_SOMMET* som2_art2= csomt2_art2->get_sommet();
2581     int id_som12= som1_art2->get_id();
2582     int id_som22= som2_art2->get_id();
2583     int s12_ou_s22;
2584     if(lst_sommet2.est_dans_la_liste(id_som12)) s12_ou_s22=1;
2585     if(lst_sommet2.est_dans_la_liste(id_som22)) s12_ou_s22=2;
2586    
2587     //if(lst_sommet2.est_dans_la_liste(id_som12)||lst_sommet2.est_dans_la_liste(id_som22))
2588     // {
2589     if(tm1_art.est_til_equivalent(tm2_art)&&tm1_crb.est_til_equivalent(tm2_crb))
2590     {
2591     aret_partielles.ajouter(id_art1);
2592     aret_partielles.ajouter(id_art2);
2593     lst_art1_partiel.ajouter(id_art1);
2594     lst_art2_partiel.ajouter(id_art2);
2595     if (s11_ou_s21==1&&s12_ou_s22==1)
2596     {
2597     aret_partielles.ajouter(id_som11);
2598     }
2599     if (s11_ou_s21==2&&s12_ou_s22==1)
2600     {
2601     aret_partielles.ajouter(id_som21);
2602     }
2603     if (s12_ou_s22==1&&s12_ou_s22==2)
2604     {
2605     aret_partielles.ajouter(id_som12);
2606     }
2607     if (s12_ou_s22==2&&s12_ou_s22==2)
2608     {
2609     aret_partielles.ajouter(id_som22);
2610     }
2611    
2612     }
2613     // }
2614    
2615     }
2616     }
2617     } // for m1=
2618    
2619    
2620    
2621     for(int m1=0;m1<lst_aret1_modif.get_nb();m1++)
2622     {
2623     int id_art1=lst_aret1_modif.get(m1);
2624     if( !lst_art1_partiel.est_dans_la_liste(id_art1))
2625     aret1_disparues.ajouter(id_art1);
2626     }
2627     for(int m2=0;m2<lst_aret1_modif.get_nb();m2++)
2628     {
2629     int id_art2=lst_aret2_modif.get(m2);
2630     if( !lst_art2_partiel.est_dans_la_liste(id_art2))
2631     aret2_nouvelles.ajouter(id_art2);
2632 souaissa 158 } /
2633 souaissa 153
2634 souaissa 142 } //boucle_face1
2635    
2636    
2637 souaissa 153 for(int j2=0;j2<nb_boucle2;j2++)
2638     {
2639     MG_BOUCLE* Boucle2 = face2->get_mg_boucle(j2);
2640 souaissa 142
2641 souaissa 153 if (!boucle_face2.est_dans_la_liste(j2))
2642     {
2643     int nbarete2 = Boucle2->get_nb_mg_coarete();
2644     for (int w2=0; w2<nbarete2;w2++)
2645     {
2646     MG_COARETE* coArete2 = Boucle2->get_mg_coarete(w2);
2647     MG_ARETE* arete2 = coArete2->get_arete();
2648     int id_art2=arete2->get_id();
2649     aret2_nouvelles.ajouter(id_art2);
2650 souaissa 142
2651 souaissa 153 }
2652     }
2653     }//boucle j2
2654 souaissa 158 */
2655 souaissa 142
2656    
2657 souaissa 153 }
2658    
2659    
2660    
2661 souaissa 142 void VCT_COMPARAISON::identifier_les_modifications_appliquees(VCT_COMPARAISON_RESULTAT& Results)
2662     {
2663    
2664 souaissa 143 TPL_LISTE_ENTITE<int> face1_conservees;
2665     TPL_LISTE_ENTITE<int> face2_conservees;
2666     TPL_LISTE_ENTITE<int> faces_nouvelles;
2667 souaissa 142
2668 souaissa 143 TPL_LISTE_ENTITE<int> aret_ident;
2669     TPL_LISTE_ENTITE<int> aret_modif;
2670     int nb_face1=mggeo1->get_nb_mg_face();
2671     int nb_face2=mggeo2->get_nb_mg_face();
2672     TPL_LISTE_ENTITE<int> lst_face1,lst_face2,lst_facloc1,lst_facloc2,dif1,dif2;
2673    
2674 souaissa 153
2675 souaissa 158 TPL_LISTE_ENTITE<int> faces1_partiellement_modf;
2676     TPL_LISTE_ENTITE<int> faces2_partiellement_modf;
2677 souaissa 153 TPL_LISTE_ENTITE<int> Aret1_conservees;
2678     TPL_LISTE_ENTITE<int> Aret1_disparues;
2679     TPL_LISTE_ENTITE<int> Aret2_conservees ;
2680     TPL_LISTE_ENTITE<int> Aret2_nouvelles ;
2681     TPL_LISTE_ENTITE<int> Aret2_partielles ;
2682     TPL_LISTE_ENTITE<int> face1_disparues;
2683 souaissa 142 for(int i=0;i<nb_face1;i++)
2684     {
2685     OT_VECTEUR_4DD g1,G1;
2686     MG_FACE* face1=mggeo1->get_mg_face(i);
2687     int id1=face1->get_id();
2688     lst_face1.ajouter(id1);
2689 souaissa 87 }
2690 souaissa 142
2691     for(int i=0;i<nb_face2;i++)
2692     {
2693     OT_VECTEUR_4DD g1,G1;
2694     MG_FACE* face2=mggeo2->get_mg_face(i);
2695     int id2=face2->get_id();
2696     lst_face2.ajouter(id2);
2697     }
2698    
2699 souaissa 153
2700    
2701 souaissa 143 MG_FACE* Face_ref1=mggeo1->get_mg_faceid(face_ref1) ;
2702     MG_FACE* Face_ref2=mggeo2->get_mg_faceid(face_ref2) ;
2703 souaissa 145 int nb_faces_identique=identite.get_nb()/2;
2704     for(int i=0;i<nb_faces_identique;i++)
2705 souaissa 142 {
2706     CORRESPONDANCE CORRESP;
2707     int face1_id=identite.get(2*i);
2708     int face2_id=identite.get(2*i+1);
2709     MG_FACE* Face1=mggeo1->get_mg_faceid(face1_id);
2710     MG_FACE* Face2=mggeo2->get_mg_faceid(face2_id);
2711     face1_conservees.ajouter(face1_id);
2712     face2_conservees.ajouter(face2_id);
2713 souaissa 145 Results.ajouter_liste_topologie(ORIGINE_CONSERVEE,Face1);
2714     Results.ajouter_liste_topologie(MODIFIE_CONSERVEE,Face2);
2715 souaissa 142 CORRESP.eleorigine=Face1;
2716     CORRESP.elemodifie=Face2;
2717     Results.ajouter_liste_topologie(CORRESP);
2718 souaissa 143
2719     //----------------------------------------
2720     TPL_LISTE_ENTITE<int> aretes_identiques;
2721     TPL_LISTE_ENTITE<int> aretes_similaires;
2722    
2723     //------------------------------------------
2724     this->comparer_aretes_faces(Face_ref1,Face_ref2,Face1,Face2,aretes_identiques,aretes_similaires);
2725    
2726     int nb_aretes_trouvees=aretes_identiques.get_nb()/4;
2727    
2728     if(nb_aretes_trouvees)
2729 souaissa 153 {
2730     CORRESPONDANCE corsp;
2731     for(int i1=0;i1<nb_aretes_trouvees;i1++)
2732     {
2733     int art1_id=aretes_identiques.get(4*i1+1);
2734     MG_ARETE*art1_cons=mggeo1->get_mg_areteid(art1_id);
2735     Results.ajouter_liste_topologie(ORIGINE_CONSERVEE,art1_cons);
2736     int art2_id=aretes_identiques.get(4*i1+3);
2737     MG_ARETE*art2_cons=mggeo2->get_mg_areteid(art2_id);
2738     Results.ajouter_liste_topologie(MODIFIE_CONSERVEE,art2_cons);
2739 souaissa 143
2740 souaissa 153 corsp.eleorigine=art1_cons;
2741     corsp.elemodifie=art2_cons;
2742     Results.ajouter_liste_topologie(corsp);
2743     }
2744     }
2745 souaissa 143
2746    
2747 souaissa 142 }
2748    
2749 souaissa 153 TPL_LISTE_ENTITE<int> lst_corrsp_sommets;
2750     this->identifier_les_sommets(Face_ref1,Face_ref2,lst_corrsp_sommets,Results);
2751 souaissa 143
2752    
2753     for(int t=0;t<lst_face1.get_nb();t++)
2754     {
2755     if(!face1_conservees.est_dans_la_liste(lst_face1.get(t)) )
2756 souaissa 142 dif1.ajouter(lst_face1.get(t));
2757 souaissa 143 }
2758     for(int it=0;it<lst_face2.get_nb();it++)
2759     {
2760     if(!face2_conservees.est_dans_la_liste(lst_face2.get(it)))
2761 souaissa 142 dif2.ajouter(lst_face2.get(it));
2762 souaissa 143 }
2763 souaissa 87
2764    
2765 souaissa 142 for(int i=0;i<dif1.get_nb();i++)
2766     {
2767     int Num1=dif1.get(i);
2768     MG_FACE* face1=mggeo1->get_mg_faceid(Num1);
2769 souaissa 153 MG_SURFACE* surf1=face1->get_surface();
2770 souaissa 158 OT_VECTEUR_4DD G1=face1->get_vectorisation().calcule_barycentre(T1);
2771 souaissa 153 G1=surf1->get_vectorisation().get_nouveau_pt(T1,G1);
2772 souaissa 142 for(int j=0;j<dif2.get_nb();j++)
2773     {
2774     int Num2=dif2.get(j);
2775     TPL_LISTE_ENTITE<int> aretes_identiques;
2776     TPL_LISTE_ENTITE<int> aretes_similaires;
2777     TPL_LISTE_ENTITE<int> aretes_conservees;
2778     TPL_LISTE_ENTITE<int> nouvelles_aretes ;
2779     TPL_LISTE_ENTITE<int> aret1_conservees;
2780     TPL_LISTE_ENTITE<int> aret1_disparues;
2781     TPL_LISTE_ENTITE<int> aret2_conservees ;
2782     TPL_LISTE_ENTITE<int> aret2_nouvelles ;
2783     TPL_LISTE_ENTITE<int> aret2_partielles ;
2784 souaissa 87
2785 souaissa 142 MG_FACE* face2=mggeo2->get_mg_faceid(Num2);
2786 souaissa 153 MG_SURFACE* surf2=face2->get_surface();
2787 souaissa 158 OT_VECTEUR_4DD G2=face2->get_vectorisation().calcule_barycentre(T2);
2788 souaissa 159 // if(!faces1_partiellement_modf.est_dans_la_liste(Num1))
2789     // {
2790 souaissa 145
2791 souaissa 158 if(surfaces_sont_elles_identiques(face1,face2)) //G1==G2
2792     {
2793 souaissa 153 comparer_aretes_faces(Face_ref1,Face_ref2,face1,face2,aretes_identiques,aretes_similaires);
2794     int nb_aretes_trouvees=aretes_identiques.get_nb()/2;
2795     if(nb_aretes_trouvees)
2796     identifier_aretes_face_modifiee(face1,face2,aretes_identiques,aretes_similaires,lst_corrsp_sommets,aret1_conservees,aret1_disparues,aret2_conservees ,aret2_nouvelles ,aret2_partielles);
2797     int id_face2=face2->get_id();
2798 souaissa 158
2799     if(nb_aretes_trouvees)
2800     {
2801 souaissa 159 // if (!face2_conservees.est_dans_la_liste(Num2))
2802     // {
2803 souaissa 153 CORRESPONDANCE CORRESP_FACE;
2804     Results.ajouter_liste_topologie(ORIGINE_CONSERVEE,face1);
2805     Results.ajouter_liste_topologie(MODIFIE_CONSERVEE,face2);
2806     CORRESP_FACE.eleorigine=face1;
2807     CORRESP_FACE.elemodifie=face2;
2808     Results.ajouter_liste_topologie(CORRESP_FACE);
2809     face1_conservees.ajouter(Num1);
2810     face2_conservees.ajouter(Num2);
2811 souaissa 143
2812 souaissa 153 for(int i1=0;i1<aret1_conservees.get_nb();i1++)
2813     {
2814     int art1_id=aret1_conservees.get(i1);
2815     Aret1_conservees.ajouter(art1_id);
2816     MG_ARETE*art1_cons=mggeo1->get_mg_areteid(art1_id);
2817     Results.ajouter_liste_topologie(ORIGINE_CONSERVEE,art1_cons);
2818     int art2_id= aret2_conservees.get(i1) ;
2819     Aret2_conservees.ajouter(art2_id);
2820     MG_ARETE*art2_cons=mggeo2->get_mg_areteid(art2_id);
2821     Results.ajouter_liste_topologie(MODIFIE_CONSERVEE,art2_cons);
2822     CORRESPONDANCE CORRESP;
2823     CORRESP.eleorigine=art1_cons;
2824     CORRESP.elemodifie=art2_cons;
2825     Results.ajouter_liste_topologie(CORRESP);
2826     }
2827 souaissa 142
2828 souaissa 153 for(int i1=0;i1<aret1_disparues.get_nb();i1++)
2829     {
2830     int art_dsp=aret1_disparues.get(i1) ;
2831     Aret1_disparues.ajouter(art_dsp);
2832     //MG_ARETE*art_disp=mggeo1->get_mg_areteid(art_dsp);
2833     //Results.ajouter_liste_topologie(ORIGINE_DISPARUE,art_disp);
2834     }
2835 souaissa 142
2836 souaissa 153 for(int i1=0;i1<aret2_nouvelles.get_nb();i1++)
2837     {
2838     int art_nv= aret2_nouvelles.get(i1) ;
2839     Aret2_nouvelles.ajouter(art_nv);
2840     //MG_ARETE*art_app=mggeo2->get_mg_areteid(art_nv);
2841     //Results.ajouter_liste_topologie(MODIFIE_APPARUE,art_app);
2842     }
2843     //for(int i1=0;i1<aret2_partielles.get_nb()/2;i1++){
2844     // int art1_prt=aret2_partielles.get(2*i1);
2845     // int art2_prt=aret2_partielles.get(2*i1+1);
2846    
2847     //il faut metttre les points des sous artes avec leurs correspondances;
2848    
2849     //Results.ajouter_liste_topologie(MODIFIE_APPARUE,art_app);
2850    
2851     // Aret2_partielles.ajouter(art1_prt);
2852     // }
2853 souaissa 158 faces1_partiellement_modf.ajouter(Num1);
2854     faces2_partiellement_modf.ajouter(Num2);
2855 souaissa 159 // }//verid
2856 souaissa 158 }// if()nb_aretes_trouvees
2857 souaissa 153
2858 souaissa 158 } //if (G1==G2)
2859 souaissa 159 // }
2860 souaissa 153 }
2861     }
2862    
2863    
2864    
2865    
2866    
2867     for(int i=0;i<Aret2_nouvelles.get_nb();i++)
2868     {
2869     int art_nouv=Aret2_nouvelles.get(i);
2870     if(! Aret2_conservees.est_dans_la_liste(Aret2_nouvelles.get(i)))
2871     {
2872     MG_ARETE*art_app=mggeo2->get_mg_areteid(art_nouv);
2873     Results.ajouter_liste_topologie(MODIFIE_APPARUE,art_app);
2874     }
2875     }
2876    
2877     for(int i=0;i<Aret1_disparues.get_nb();i++)
2878     {
2879     int art_nouv=Aret1_disparues.get(i);
2880     if(! Aret1_conservees.est_dans_la_liste(Aret1_disparues.get(i)))
2881     {
2882     MG_ARETE*art_disp=mggeo1->get_mg_areteid(art_nouv);
2883     Results.ajouter_liste_topologie(ORIGINE_DISPARUE,art_disp);
2884     }
2885 souaissa 142 }
2886    
2887 souaissa 153
2888 souaissa 142 for(int j=0;j<dif2.get_nb();j++)
2889     {
2890 souaissa 158 if(!face2_conservees.est_dans_la_liste(dif2.get(j)))
2891 souaissa 142 {
2892     int nouv_face=dif2.get(j);
2893     faces_nouvelles.ajouter(nouv_face);
2894     MG_FACE* Face_Nouvelle=mggeo2->get_mg_faceid(nouv_face);
2895 souaissa 145 Results.ajouter_liste_topologie(MODIFIE_APPARUE,Face_Nouvelle);
2896 souaissa 143 int nb_boucle2=Face_Nouvelle->get_nb_mg_boucle();
2897    
2898     for(int j=0;j<nb_boucle2;j++)
2899     {
2900     MG_BOUCLE* Boucle2 = Face_Nouvelle->get_mg_boucle(j);
2901     int nbarete2 = Boucle2->get_nb_mg_coarete();
2902     for(int w2=0;w2<nbarete2;w2++)
2903     {
2904     MG_COARETE* coArete2 = Boucle2->get_mg_coarete(w2);
2905     MG_ARETE* arete_nouvelle = coArete2->get_arete();
2906 souaissa 145 Results.ajouter_liste_topologie(MODIFIE_APPARUE,arete_nouvelle);
2907 souaissa 143 MG_COSOMMET* cosommt1= arete_nouvelle->get_cosommet1();
2908     MG_COSOMMET* cosommt2= arete_nouvelle->get_cosommet2();
2909     MG_SOMMET* nouveau_sommet1= cosommt1->get_sommet();
2910     MG_SOMMET* nouveau_sommet2= cosommt2->get_sommet();
2911 souaissa 145 Results.ajouter_liste_topologie(MODIFIE_APPARUE,nouveau_sommet1);
2912     Results.ajouter_liste_topologie(MODIFIE_APPARUE,nouveau_sommet2);
2913 souaissa 143 }
2914     }
2915     }
2916     }
2917    
2918 souaissa 153 for(int i1=0;i1<nb_face1;i1++)
2919     {
2920     MG_FACE*face1=mggeo1->get_mg_face(i1);
2921     int face1_id=face1->get_id();
2922     if(!face1_conservees.est_dans_la_liste(face1_id))
2923     {
2924     Results.ajouter_liste_topologie(ORIGINE_DISPARUE,face1);
2925     int nb_boucle1=face1->get_nb_mg_boucle();
2926     for(int j1=0;j1<nb_boucle1;j1++)
2927     {
2928     MG_BOUCLE* Boucle1 = face1->get_mg_boucle(j1);
2929     int nbarete1 = Boucle1->get_nb_mg_coarete();
2930     for (int w1 =0; w1<nbarete1;w1++)
2931     {
2932     MG_COARETE* coArete1 = Boucle1->get_mg_coarete(w1);
2933     MG_ARETE* arete1 = coArete1->get_arete();
2934     int id_art1=arete1->get_id();
2935     Results.ajouter_liste_topologie(ORIGINE_DISPARUE,arete1);
2936 souaissa 143
2937 souaissa 153 }
2938     }
2939     }
2940     }
2941 souaissa 143
2942 souaissa 153 for(int i=0;i<nb_face1;i++)
2943     {
2944     MG_FACE* face1=mggeo1->get_mg_face(i);
2945     MG_SURFACE* surf1=face1->get_surface();
2946     int id1=face1->get_id();
2947     if(!face1_conservees.est_dans_la_liste(id1))
2948     {
2949     OT_TENSEUR tns1_surf(4),tns2_surf(4);
2950     tns1_surf=surf1->get_vectorisation().calcule_tenseur_inertie_base_locale(T1);
2951     vector<double2> isurf1;
2952     for(int r=0;r<4;r++)
2953     {
2954     isurf1.insert( isurf1.end(), tns1_surf(r,r));
2955     }
2956     for(int j=0;j<nb_face2;j++)
2957     {
2958     MG_FACE* face2=mggeo2->get_mg_face(j);
2959     MG_SURFACE* surf2=face2->get_surface();
2960     int id2=face2->get_id();
2961     CORRESPONDANCE CORRESP_FACE;
2962     OT_VECTEUR_4DD G1=surf1->get_vectorisation().calcule_barycentre(T1);
2963     OT_VECTEUR_4DD G2=surf2->get_vectorisation().calcule_barycentre(T2);
2964     G1=surf1->get_vectorisation().get_nouveau_pt(T1,G1);
2965     tns2_surf=surf2->get_vectorisation().calcule_tenseur_inertie_base_locale(T1);
2966     vector<double2> isurf2;
2967     for(int r=0;r<4;r++)
2968     {
2969     isurf2.insert( isurf2.end(), tns1_surf(r,r));
2970     }
2971     vector<unsigned int> indx1;
2972     if(tns1_surf.listes_equivalentes(isurf1,isurf2,indx1))
2973     {
2974     if(G1==G2)
2975     {
2976     Results.ajouter_liste_topologie(ORIGINE_CONSERVEE,face1);
2977     Results.ajouter_liste_topologie(MODIFIE_CONSERVEE,face2);
2978     CORRESP_FACE.eleorigine=face1;
2979     CORRESP_FACE.elemodifie=face2;
2980     Results.ajouter_liste_topologie(CORRESP_FACE);
2981    
2982     }
2983     }
2984     }
2985     }
2986     }
2987    
2988 souaissa 158 identite.vide();
2989     for(int i=0;i<face1_conservees.get_nb();i++)
2990     {
2991     identite.ajouter( face1_conservees.get(i));
2992     identite.ajouter( face2_conservees.get(i));
2993     }
2994     this->affecter_les_couleurs(1);
2995    
2996 souaissa 143 }
2997    
2998 souaissa 158 int VCT_COMPARAISON::surfaces_sont_elles_identiques(MG_FACE* face1,MG_FACE* face2)
2999     {
3000     MG_SURFACE* surf1=face1->get_surface();
3001     MG_SURFACE* surf2=face2->get_surface();
3002     vector<double2> isurf1,isurf2;
3003     vector<unsigned int> indx1;
3004     TPL_LISTE_ENTITE<double> parm1,parm2;
3005     OT_VECTEUR_4DD Dv1,Dv2,axe3;
3006     OT_VECTEUR_4DD VNUL(0.,0.,0.,0.);
3007     double2 ZER=0.;
3008     OT_TENSEUR tm1_surf(4),tm2_surf(4),tns1_surf(4),tns2_surf(4),V1(4),V2(4);
3009     OT_VECTEUR_4DD G1=surf1->get_vectorisation().calcule_barycentre(T1);
3010     G1=surf1->get_vectorisation().get_nouveau_pt(T1,G1);
3011     tns1_surf=surf1->get_vectorisation().calcule_tenseur_inertie_base_locale(T1);
3012     OT_VECTEUR_4DD G2=surf2->get_vectorisation().calcule_barycentre(T2);
3013     tns2_surf=surf2->get_vectorisation().calcule_tenseur_inertie_base_locale(T2);
3014     tm1_surf=surf1->get_vectorisation().calcule_tenseur_metrique();
3015     tm2_surf=surf2->get_vectorisation().calcule_tenseur_metrique();
3016    
3017     surf1->get_vectorisation().calcule_axes_dinertie(T1,Dv1,V1);
3018     surf2->get_vectorisation().calcule_axes_dinertie(T2,Dv2,V2);
3019    
3020     for(int r=0;r<4;r++)
3021     {
3022     isurf1.insert( isurf1.end(), tns1_surf(r,r));
3023     isurf2.insert( isurf2.end(), tns2_surf(r,r));
3024     }
3025    
3026     if(surf2->get_type_geometrique(parm2)==MGCo_PLAN)
3027     {
3028     axe3[0]= parm2.get(3);
3029     axe3[1]= parm2.get(4);
3030     axe3[2]= parm2.get(5);
3031     axe3[3]= 0;
3032     G1=face1->get_vectorisation().calcule_barycentre(T1);
3033     G2=face2->get_vectorisation().calcule_barycentre(T2);
3034    
3035     }
3036 souaissa 159 if(surf2->get_type_geometrique(parm1)==MGCo_CYLINDRE||surf2->get_type_geometrique(parm2)==MGCo_CONE)
3037 souaissa 158 {
3038     axe3[0]= parm2.get(3);
3039     axe3[1]= parm2.get(4);
3040     axe3[2]= parm2.get(5);
3041     axe3[3]= 0;
3042     }
3043     //axe3=surf1->get_vectorisation().get_nouveau_pt(T1,axe3);
3044     double2 d1=axe3[0]*G1[0]+axe3[1]*G1[1]+axe3[2]*G1[3];
3045     double2 d2=axe3[0]*G2[0]+axe3[1]*G2[1]+axe3[2]*G2[3];
3046    
3047     if(tm1_surf.est_til_equivalent(tm2_surf))
3048     {
3049     if (tns1_surf.listes_equivalentes(isurf1,isurf2,indx1))
3050     {
3051     OT_VECTEUR_4DD G1G2= G1-G2;
3052     double2 mm=G1G2*axe3;
3053     if(ZER==mm)
3054     {
3055     return 1;
3056     }
3057     }
3058     }
3059     return 0;
3060     }
3061    
3062 souaissa 159
3063     int VCT_COMPARAISON::courbes_sont_elles_identiques(MG_ARETE* arete1,MG_ARETE* arete2)
3064     {
3065     MG_COURBE* courb1=arete1->get_courbe();
3066     MG_COURBE* courb2=arete2->get_courbe();
3067     vector<double2> icourb1,icourb2;
3068     vector<unsigned int> indx1;
3069     TPL_LISTE_ENTITE<double> parm1,parm2;
3070     OT_VECTEUR_4DD Dv1,Dv2,axe3;
3071     OT_VECTEUR_4DD VNUL(0.,0.,0.,0.);
3072     double2 ZER=0.;
3073     OT_TENSEUR tm1_surf(4),tm2_surf(4),tns1_surf(4),tns2_surf(4),V1(4),V2(4);
3074     OT_VECTEUR_4DD G1=courb1->get_vectorisation().calcule_barycentre(T1);
3075     G1=courb1->get_vectorisation().get_nouveau_pt(T1,G1);
3076     tns1_surf=courb1->get_vectorisation().calcule_tenseur_inertie_base_locale(T1);
3077     OT_VECTEUR_4DD G2=courb2->get_vectorisation().calcule_barycentre(T2);
3078     tns2_surf=courb2->get_vectorisation().calcule_tenseur_inertie_base_locale(T2);
3079     tm1_surf=courb1->get_vectorisation().calcule_tenseur_metrique();
3080     tm2_surf=courb2->get_vectorisation().calcule_tenseur_metrique();
3081    
3082     courb1->get_vectorisation().calcule_axes_dinertie(T1,Dv1,V1);
3083     courb2->get_vectorisation().calcule_axes_dinertie(T2,Dv2,V2);
3084    
3085     for(int r=0;r<4;r++)
3086     {
3087     icourb1.insert( icourb1.end(), tns1_surf(r,r));
3088     icourb2.insert( icourb2.end(), tns2_surf(r,r));
3089     }
3090    
3091     if(courb2->get_type_geometrique(parm2)==MGCo_LINE)
3092     {
3093     axe3[0]= parm2.get(3);
3094     axe3[1]= parm2.get(4);
3095     axe3[2]= parm2.get(5);
3096     axe3[3]= 0;
3097     G1=arete1->get_vectorisation().calcule_barycentre(T1);
3098     G2=arete2->get_vectorisation().calcule_barycentre(T2);
3099    
3100     }
3101     if(courb2->get_type_geometrique(parm1)==MGCo_CIRCLE||courb2->get_type_geometrique(parm2)==MGCo_ELLIPSE)
3102     {
3103     axe3[0]= parm2.get(3);
3104     axe3[1]= parm2.get(4);
3105     axe3[2]= parm2.get(5);
3106     axe3[3]= 0;
3107     }
3108    
3109     if(tm1_surf.est_til_equivalent(tm2_surf))
3110     {
3111     if (tns1_surf.listes_equivalentes(icourb1,icourb2,indx1))
3112     {
3113     OT_VECTEUR_4DD G1G2= G1-G2;
3114     OT_VECTEUR_4DD mm=G1G2^axe3;
3115     if(VNUL==mm)
3116     {
3117     return 1;
3118     }
3119     }
3120     }
3121     return 0;
3122    
3123    
3124    
3125    
3126     }
3127    
3128    
3129    
3130    
3131    
3132    
3133 souaissa 153 void VCT_COMPARAISON::identifier_les_sommets(MG_FACE* face1_ref,MG_FACE* face2_ref,TPL_LISTE_ENTITE<int>& lst_corrsp_sommets,VCT_COMPARAISON_RESULTAT& Results)
3134 souaissa 143 {
3135 souaissa 153
3136 souaissa 143 OT_VECTEUR_4DD Dv1,Dv2,G1,gf1,gf2,G2;
3137     OT_TENSEUR V1(4),V2(4);
3138 souaissa 153 TPL_LISTE_ENTITE<int> lst1_som_trouve;
3139     TPL_LISTE_ENTITE<int> lst2_som_trouve;
3140     face1_ref->get_vectorisation().calcule_axes_dinertie(T1,Dv1,V1);
3141     G1=face1_ref->get_vectorisation().calcule_barycentre(T1);
3142 souaissa 143
3143 souaissa 153 /*
3144 souaissa 143 for(int r=0;r<4;r++) {
3145     for(int s=0;s<4;s++) {
3146     gf1[r]= gf1[r]+V1(s,r)*G1[s];
3147     }
3148 souaissa 153 } */
3149 souaissa 143
3150 souaissa 153 face2_ref->get_vectorisation().calcule_axes_dinertie(T2,Dv2,V2);
3151     G2=face2_ref->get_vectorisation().calcule_barycentre(T2);
3152     /*
3153 souaissa 143 for(int r=0;r<4;r++) {
3154     for(int s=0;s<4;s++) {
3155     gf2[r]= gf2[r]+V2(s,r)*G2[s];
3156     }
3157 souaissa 153 } */
3158 souaissa 143
3159     int nb_sommet1= mggeo1->get_nb_mg_sommet();
3160     int nb_sommet2= mggeo2->get_nb_mg_sommet();
3161    
3162    
3163 souaissa 153
3164 souaissa 143 for(int i=0;i<nb_sommet1;i++)
3165     {
3166     double xyz1[3];
3167 souaissa 153 OT_VECTEUR_4DD S1,s1, G1G1REF;
3168 souaissa 143 MG_SOMMET *som1=mggeo1->get_mg_sommet(i);
3169     MG_POINT* pt1=som1->get_point();
3170     int som1_id=som1->get_id();
3171     pt1->evaluer(xyz1);
3172     for(int t=0;t<3;t++) s1[t]=xyz1[t];
3173 souaissa 153 G1G1REF=s1-G1;
3174     G1G1REF=face1_ref->get_vectorisation().get_nouveau_pt(T1,G1G1REF);
3175     /*
3176 souaissa 143 for(int r=0;r<4;r++) {
3177     for(int s=0;s<4;s++) {
3178     S1[r]= S1[r]+V1(s,r)*s1[s];
3179     }
3180 souaissa 153 } */
3181 souaissa 143
3182 souaissa 153
3183 souaissa 143 for(int j=0;j<nb_sommet2;j++)
3184     {
3185     double xyz2[3];
3186 souaissa 153 OT_VECTEUR_4DD S2,s2,G2G2REF;
3187 souaissa 143 MG_SOMMET *som2=mggeo2->get_mg_sommet(j);
3188     MG_POINT* pt2=som2->get_point();
3189     int som2_id=som2->get_id();
3190 souaissa 153 if( lst1_som_trouve.est_dans_la_liste(som1_id)) break;
3191    
3192 souaissa 143 pt2->evaluer(xyz2);
3193     for(int t=0;t<3;t++) s2[t]=xyz2[t];
3194 souaissa 153 G2G2REF=s2-G2;
3195     /*
3196 souaissa 143 for(int r=0;r<4;r++) {
3197     for(int s=0;s<4;s++) {
3198     S2[r]= S2[r]+V2(s,r)*s2[s];
3199     }
3200 souaissa 153 } */
3201 souaissa 143
3202 souaissa 153 if (G1G1REF==G2G2REF)
3203 souaissa 143 {
3204 francois 144 Results.ajouter_liste_topologie(ORIGINE_CONSERVEE,som1);
3205     Results.ajouter_liste_topologie(MODIFIE_CONSERVEE,som2);
3206 souaissa 143 CORRESPONDANCE CORRESP;
3207     CORRESP.eleorigine=som1;
3208     CORRESP.elemodifie=som2;
3209     Results.ajouter_liste_topologie(CORRESP);
3210 souaissa 153 lst_corrsp_sommets.ajouter(som1_id);
3211     lst_corrsp_sommets.ajouter(som2_id);
3212     lst1_som_trouve.ajouter(som1_id);
3213     lst2_som_trouve.ajouter(som2_id);
3214     }
3215 souaissa 143
3216     }
3217 souaissa 153
3218    
3219    
3220 souaissa 143 }
3221 souaissa 142
3222 souaissa 143
3223 souaissa 153 for(int i=0;i<nb_sommet1;i++)
3224     {
3225     MG_SOMMET *som=mggeo1->get_mg_sommet(i);
3226     int som_id=som->get_id();
3227     if(! lst1_som_trouve.est_dans_la_liste(som_id))
3228     {
3229 souaissa 143
3230 souaissa 153 Results.ajouter_liste_topologie(ORIGINE_DISPARUE,som);
3231 souaissa 143
3232 souaissa 153 }
3233 souaissa 143
3234 souaissa 153 }
3235 souaissa 143
3236 souaissa 153 for(int i=0;i<nb_sommet2;i++)
3237     {
3238     MG_SOMMET *som=mggeo2->get_mg_sommet(i);
3239     int som_id=som->get_id();
3240     if(! lst2_som_trouve.est_dans_la_liste(som_id))
3241     {
3242    
3243     Results.ajouter_liste_topologie(MODIFIE_APPARUE,som);
3244    
3245     }
3246    
3247     }
3248    
3249 souaissa 87 }
3250    
3251    
3252 souaissa 153
3253    
3254    
3255     void VCT_COMPARAISON::get_syteme_daxes_globale()
3256     {
3257    
3258     OT_VECTEUR_4DD Dv1,Dv2,Dw,G1,G2,G1G2;
3259     OT_TENSEUR p(4),q(4),pT,qT;
3260     int nb_face1=mggeo1->get_nb_mg_face();
3261     int nb_face2=mggeo1->get_nb_mg_face();
3262     OT_VECTEUR_4DD VNul(0.,0.,0.,0.);
3263     double2 cof=-1;
3264     int plan=-1;
3265     for(int i=3;i<nb_face1;i++)
3266     {
3267     OT_TENSEUR inertie_face1(4);
3268     vector<double2> iface1;
3269     MG_FACE* face1=mggeo1->get_mg_face(i);
3270     int id_face1=face1->get_id();
3271     face1->get_vectorisation().calcule_axes_dinertie(T1,Dv1,p);
3272     pT=p.transpose();
3273     G1= face1->get_vectorisation().calcule_barycentre(T1);
3274     inertie_face1=face1->get_vectorisation().calcule_tenseur_inertie_base_locale(T1);
3275     vector<OT_VECTEUR_4DD>& list_points1=face1->get_vectorisation().get_points_controle();
3276     vector<OT_VECTEUR_4DD>& list_vecteurs1=face1->get_vectorisation().get_vecteurs();
3277     OT_VECTEUR_4DD Normal1(0.,0.,0.,0.),N1;
3278     OT_VECTEUR_4DD axe11,axe12,axe13;
3279     int cmpt=0;
3280    
3281     OT_VECTEUR_4DD v11= list_vecteurs1[0];
3282     int nb_vecteur1=list_vecteurs1.size();
3283     for(unsigned int pi=0;pi<nb_vecteur1-1;pi++)
3284     {
3285    
3286     OT_VECTEUR_4DD v2= list_vecteurs1[pi+1];
3287     if(pi==0)
3288     Normal1=v11^v2;
3289     if (pi>0)
3290     N1=v11^v2;
3291     OT_VECTEUR_4DD colineaire= Normal1^N1;
3292     if(colineaire==VNul)
3293     {
3294     cmpt++;
3295     }
3296     }
3297     vector<OT_VECTEUR_4DD> axes1;
3298     if ( cmpt== list_vecteurs1.size()-1)
3299     {
3300     plan=1;
3301     axe11=list_vecteurs1[0];
3302     axe12=Normal1^axe11;
3303     axe13=Normal1;
3304     axes1.insert(axes1.end(),axe11);
3305     axes1.insert(axes1.end(),axe12);
3306     axes1.insert(axes1.end(),axe13);
3307     }
3308    
3309     VCT_OUTILS VOUTIL(4);
3310     OT_MATRICE_3D sys_axes1=VOUTIL.get_system_axes(G1,axes1,list_points1) ;
3311    
3312     for(int r=0;r<4;r++)
3313     {
3314     iface1.insert( iface1.end(), inertie_face1(r,r));
3315     }
3316    
3317     for(int j=4;j<nb_face2;j++)
3318     {
3319     OT_TENSEUR inertie_face2(4);
3320     vector<double2> iface2;
3321     MG_FACE* face2=mggeo2->get_mg_face(j);
3322     int id_face2=face2->get_id();
3323     face2->get_vectorisation().calcule_axes_dinertie(T2,Dv2,q);
3324     G2= face2->get_vectorisation().calcule_barycentre(T2);
3325     qT=q.transpose();
3326     inertie_face2=face2->get_vectorisation().calcule_tenseur_inertie_base_locale(T2);
3327     vector<OT_VECTEUR_4DD>& list_points2=face2->get_vectorisation().get_points_controle();
3328     vector<OT_VECTEUR_4DD>& list_vecteurs2=face2->get_vectorisation().get_vecteurs();
3329     OT_VECTEUR_4DD Normal2(0.,0.,0.,0.),N1;
3330     OT_VECTEUR_4DD axe21,axe22,axe23;
3331     int cmpt=0;
3332     OT_VECTEUR_4DD v21= list_vecteurs2[0];
3333     int nb_vecteur2=list_vecteurs2.size();
3334     for(unsigned int pj=0;pj<nb_vecteur2-1;pj++)
3335     {
3336     OT_VECTEUR_4DD v2= list_vecteurs2[pj+1];
3337     if(pj==0)
3338     Normal2=v21^v2;
3339     if (pj>0)
3340     N1=v21^v2;
3341     OT_VECTEUR_4DD colineaire= Normal2^N1;
3342     if(colineaire==VNul)
3343     {
3344     cmpt++;
3345     }
3346     }
3347     vector<OT_VECTEUR_4DD> axes2;
3348     if ( cmpt== list_vecteurs2.size()-1)
3349     {
3350     plan=1;
3351     axe21=list_vecteurs2[0];
3352     axe22=Normal2^axe21;
3353     axe23=Normal2;
3354     axes2.insert(axes2.end(),axe21);
3355     axes2.insert(axes2.end(),axe22);
3356     axes2.insert(axes2.end(),axe23);
3357     }
3358    
3359     VCT_OUTILS VOUTIL(4);
3360     OT_MATRICE_3D sys_axes2=VOUTIL.get_system_axes(G2,axes2,list_points2) ;
3361    
3362     OT_MATRICE_3D T= sys_axes2*sys_axes1.transpose();
3363    
3364    
3365    
3366    
3367    
3368     /*
3369     for(int r=0;r<4;r++)
3370     {
3371     iface2.insert( iface2.end(), inertie_face2(r,r));
3372     }
3373     vector<unsigned int> indx1,indx2;
3374     OT_TENSEUR T=q*pT;
3375    
3376     if(inertie_face2.listes_equivalentes(iface1,iface2,indx1))
3377     {
3378    
3379     for(int ii=0;ii<list_points1.size();ii++)
3380     {
3381     OT_VECTEUR_4DD pt1= list_points1[ii];
3382     OT_VECTEUR_4DD pt11;
3383    
3384     for(int r=0;r<4;r++)
3385     {
3386     for(int s=0;s<4;s++)
3387     pt11[r]=pt11[r]+T(r,s)*G1[s];
3388     }
3389    
3390     for(int jj=0;jj<list_points2.size();jj++)
3391     {
3392     OT_VECTEUR_4DD pt2= list_points2[jj];
3393     OT_VECTEUR_4DD pt22;
3394     for(int r=0;r<4;r++)
3395     {
3396     for(int s=0;s<4;s++)
3397     pt22[r]=pt22[r]+T(r,s)*G2[s];
3398     }
3399     if(pt11==G2)
3400     {
3401     int g=0;
3402     }
3403    
3404    
3405     }
3406    
3407    
3408    
3409     }
3410    
3411    
3412     } */
3413    
3414    
3415     }
3416     }
3417    
3418    
3419     }
3420    
3421    
3422    
3423    
3424    
3425 francois 144 std::ostream& operator <<(std::ostream& os,VCT_COMPARAISON& vct_cmp)
3426 souaissa 142 {
3427     vct_cmp.enregistrer(os) ;
3428     return os;
3429     }
3430 souaissa 87
3431    
3432    
3433 souaissa 142
3434    
3435 souaissa 87 void VCT_COMPARAISON::enregistrer(ostream& os)
3436 souaissa 142 {
3437     os<<"COMPARAISON VECTORIELLE DE DEUX GEOMETRIES"<<endl;
3438     int nb_cl=2;
3439     int nb_lg=similarite.get_nb()/2;
3440 souaissa 66 os<<"FACES_PREMIERE_GEOMETRIE : ";
3441     for(int j=0;j<nb_lg;j++)
3442 souaissa 87 os<<setw(5)<<similarite.get(j*nb_cl+0);
3443 souaissa 66 os<<endl;
3444     os<<"FACES_SECONDE_GEOMETRIE : ";
3445     for(int j=0;j<nb_lg;j++)
3446 souaissa 87 os<<setw(5)<<similarite.get(j*nb_cl+1);
3447 souaissa 66 os<<endl;
3448    
3449 souaissa 87 //affecter_une_couleur();
3450 souaissa 82
3451    
3452 souaissa 142 }
3453 souaissa 143
3454    
3455    
3456 souaissa 153 int VCT_COMPARAISON::modele_a_change_de_repere()
3457     {
3458     int nb_sommet1= mggeo1->get_nb_mg_sommet();
3459     int nb_sommet2= mggeo2->get_nb_mg_sommet();
3460 souaissa 143
3461 souaissa 153 int trouve=0;
3462     int cmt=0;
3463     for(int i=0;i<nb_sommet1;i++)
3464     {
3465     double xyz1[3];
3466     OT_VECTEUR_4DD S1,s1;
3467     MG_SOMMET *som1=
3468     mggeo1->get_mg_sommet(i);
3469     MG_POINT* pt1=som1->get_point();
3470     int som1_id=som1->get_id();
3471     pt1->evaluer(xyz1);
3472     for(int t=0;t<3;t++) s1[t]=xyz1[t];
3473    
3474    
3475     for(int j=0;j<nb_sommet2;j++)
3476     {
3477     double xyz2[3];
3478     OT_VECTEUR_4DD S2,s2;
3479     MG_SOMMET *som2=mggeo2->get_mg_sommet(j);
3480     MG_POINT* pt2=som2->get_point();
3481     int som2_id=som2->get_id();
3482     pt2->evaluer(xyz2);
3483     for(int t=0;t<3;t++) s2[t]=xyz2[t];
3484    
3485    
3486     if (s1==s2)
3487     {
3488     trouve=1;
3489     break;
3490     }
3491    
3492     }
3493     if (trouve==-1) return trouve;
3494     }
3495    
3496    
3497     return trouve;
3498    
3499     }
3500    
3501 francois 253 #endif