ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/comparaison/src/vct_comparaison.cpp
Revision: 272
Committed: Mon Dec 13 21:04:45 2010 UTC (14 years, 5 months ago) by francois
Original Path: magic/lib/vectorisation/src/vct_comparaison.cpp
File size: 128054 byte(s)
Log Message:
suppression des warnings

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