ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/comparaison/src/vct_comparaison.cpp
Revision: 253
Committed: Tue Jul 13 19:40:46 2010 UTC (14 years, 10 months ago) by francois
Original Path: magic/lib/vectorisation/src/vct_comparaison.cpp
File size: 110065 byte(s)
Log Message:
changement de hiearchie et utilisation de ccmake + mise a jour

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