ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/comparaison/src/vct_comparaison.cpp
Revision: 275
Committed: Fri Mar 25 21:45:37 2011 UTC (14 years, 1 month ago) by francois
Original Path: magic/lib/vectorisation/src/vct_comparaison.cpp
File size: 131223 byte(s)
Log Message:
Ajout de l'importation de la triangulation STL dans les fichiers opencascade et creation d'un executable de comparaison

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