ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/comparaison/src/vct_comparaison.cpp
Revision: 143
Committed: Tue Aug 19 17:35:03 2008 UTC (16 years, 8 months ago) by souaissa
Original Path: magic/lib/vectorisation/vectorisation/src/vct_comparaison.cpp
File size: 47031 byte(s)
Log Message:
mise a jour de la classe vct_comparaison.h

File Contents

# User Rev Content
1 souaissa 66 //---------------------------------------------------------------------------
2     #include"gestionversion.h"
3    
4     #pragma hdrstop
5    
6     #include "vct_comparaison.h"
7 souaissa 74 #include"ot_mathematique.h"
8 souaissa 87 #include "vct_face.h"
9     #include "vct_surface.h"
10 souaissa 142 #include <iomanip.h>
11 souaissa 87
12 souaissa 66 //---------------------------------------------------------------------------
13    
14     #pragma package(smart_init)
15    
16    
17 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)
18 souaissa 66 {
19 francois 89 }
20 souaissa 66
21 souaissa 99 VCT_COMPARAISON::~VCT_COMPARAISON()
22     {
23     }
24 souaissa 66
25 francois 89
26 souaissa 143 void VCT_COMPARAISON::compare_les_deux_geometries(int affiche_couleur)
27 francois 89 {
28 souaissa 87 int nb_face1=mggeo1->get_nb_mg_face();
29     int nb_face2=mggeo2->get_nb_mg_face();
30 souaissa 66
31 souaissa 87 for(int i=0;i<nb_face1; i++)
32     {
33     MG_FACE* face1=mggeo1->get_mg_face(i);
34     MG_SURFACE*surf1=face1->get_surface();
35     int id1=face1->get_id();
36     OT_TENSEUR tns1_face(4),tns1_surf(4);
37     OT_TENSEUR ttns1_face(4),ttns1_surf(4);
38     int nb_top1_pts= face1->get_vectorisation().get_nb_points();
39     int nb_geo1_pts= surf1->get_vectorisation().get_nb_points();
40    
41     tns1_face=face1->get_vectorisation().calcule_tenseur_metrique();
42     tns1_surf=surf1->get_vectorisation().calcule_tenseur_metrique();
43    
44     ttns1_face=face1->get_vectorisation().calcule_tenseur_inertie_base_locale();
45     ttns1_surf=surf1->get_vectorisation().calcule_tenseur_inertie_base_locale();
46     vector<double2> ifac1; vector<double2>isurf1;
47     for(int r=0;r<4;r++)
48     {
49     ifac1.insert( ifac1.end(), ttns1_face(r,r));
50     isurf1.insert( isurf1.end(), ttns1_surf(r,r));
51     }
52 souaissa 99 int cmpt=0;
53 souaissa 87 for(int j=0;j<nb_face2;j++)
54     {
55     MG_FACE* face2=mggeo2->get_mg_face(j);
56     MG_SURFACE*surf2=face2->get_surface();
57     int id2=face2->get_id();
58     OT_TENSEUR tns2_face(4),tns2_surf(4);
59     OT_TENSEUR ttns2_face(4),ttns2_surf(4);
60     int nb_top2_pts= face2->get_vectorisation().get_nb_points();
61     int nb_geo2_pts= surf2->get_vectorisation().get_nb_points();
62     tns2_face=face2->get_vectorisation().calcule_tenseur_metrique();
63     tns2_surf=surf2->get_vectorisation().calcule_tenseur_metrique();
64     ttns2_face=face2->get_vectorisation().calcule_tenseur_inertie_base_locale();
65     ttns2_surf=surf2->get_vectorisation().calcule_tenseur_inertie_base_locale();
66     vector<double2> ifac2; vector<double2> isurf2;
67     for(int r=0;r<4;r++)
68     {
69     ifac2.insert( ifac2.end(), ttns2_face(r,r));
70     isurf2.insert( isurf2.end(), ttns2_surf(r,r));
71     }
72     if(nb_geo1_pts==nb_geo2_pts&&nb_top1_pts==nb_top2_pts)
73     {
74     if(tns1_face.est_til_equivalent(tns2_face))
75     {
76     if(tns1_surf.est_til_equivalent(tns2_surf))
77     {
78     similarite.ajouter(id1);
79     similarite.ajouter(id2);
80     vector<unsigned int> indx1,indx2;
81     if(ttns1_face.listes_equivalentes(ifac1,ifac2,indx1))
82     {
83     if(ttns1_face.listes_equivalentes(isurf1,isurf2,indx2))
84     {
85 souaissa 99 sim_double.ajouter(id1) ;
86     sim_double.ajouter(id2) ;
87     cmpt++;
88 souaissa 87 }
89 souaissa 99 }
90 souaissa 87
91 souaissa 99 }
92 souaissa 87 }
93 souaissa 99 }
94     }
95 souaissa 87
96 souaissa 99 nb_sim.ajouter(cmpt);
97 souaissa 87 }
98 souaissa 143 if (affiche_couleur) this->affecter_les_couleurs(23);
99 souaissa 66 }
100    
101    
102    
103 souaissa 143 void VCT_COMPARAISON::trouver_les_identites(int affiche_couleur)
104 souaissa 87 {
105 souaissa 142
106     TPL_LISTE_ENTITE<int> lst_fin;
107 souaissa 87 TPL_LISTE_ENTITE<int> lst;
108 souaissa 143 this->compare_les_deux_geometries(0);
109 souaissa 99 int nb_face1=mggeo1->get_nb_mg_face();
110     int nb_face2=mggeo2->get_nb_mg_face();
111 souaissa 90
112 souaissa 99 int nb_fsim1=sim_double.get_nb()/2;
113     int nb_fsim2=sim_double.get_nb()/2;
114 souaissa 87
115    
116    
117 souaissa 99 this->trouve_face_de_reference(face_ref1,face_ref2);//,ls,lst_fin
118 souaissa 87
119 souaissa 99 OT_VECTEUR_4DD Dv,Dv1,Dv2,G1,G2,g1g2;
120     OT_TENSEUR V(4),V1(4),V2(4);
121     OT_VECTEUR_4DD g1_ref,g2_ref;
122     MG_FACE* face1_ref=mggeo1->get_mg_faceid(face_ref1);
123     face1_ref->get_vectorisation().calcule_axes_dinertie(Dv1,V1);
124     G1= face1_ref->get_vectorisation().calcule_barycentre();
125    
126     for(int r=0;r<4;r++) {
127     for(int s=0;s<4;s++) {
128     g1_ref[r]= g1_ref[r]+V1(s,r)*G1[s];
129     }
130     }
131    
132    
133     MG_FACE* face2_ref=mggeo2->get_mg_faceid(face_ref2);
134     face2_ref->get_vectorisation().calcule_axes_dinertie(Dv2,V2);
135     G2= face2_ref->get_vectorisation().calcule_barycentre();
136     for(int r=0;r<4;r++) {
137     for(int s=0;s<4;s++) {
138     g2_ref[r]= g2_ref[r]+V2(s,r)*G2[s];
139     }
140     }
141    
142    
143     OT_VECTEUR_4DD g1refg1,g2refg2;
144     TPL_LISTE_ENTITE<int> lst1,lst2;
145    
146    
147     for(int i=0;i<nb_face1;i++)
148     {
149     OT_VECTEUR_4DD g1,G1;
150     MG_FACE* face1=mggeo1->get_mg_face(i);
151     int id1=face1->get_id();
152     G1= face1->get_vectorisation().calcule_barycentre();
153     for(int r=0;r<4;r++) {
154     for(int s=0;s<4;s++) {
155     g1[r]= g1[r]+V1(s,r)*G1[s];
156     }
157     }
158    
159     g1refg1=g1-g1_ref;
160     // num2=list.get(2*i+1);
161     for(int j=0;j<nb_face2;j++)
162     {
163    
164     OT_VECTEUR_4DD g2;
165     MG_FACE* face2=mggeo2->get_mg_face(j);
166     int id2=face2->get_id();
167     G2= face2->get_vectorisation().calcule_barycentre();
168     for(int r=0;r<4;r++) {
169     for(int s=0;s<4;s++) {
170     g2[r]= g2[r]+V2(s,r)*G2[s];
171     }
172     }
173    
174     OT_VECTEUR_4DD g2refg2=g2-g2_ref;
175     if(g1refg1==g2refg2)
176     {
177     identite.ajouter(id1);
178     identite.ajouter(id2);
179    
180     break;
181     }
182     }
183     }
184    
185    
186    
187    
188 souaissa 143 if(affiche_couleur) this->affecter_les_couleurs(1);
189 souaissa 87
190     }
191    
192    
193    
194 souaissa 143 void VCT_COMPARAISON::compare_les_deux_geometries_vectoriellement(int affiche_couleur)
195 souaissa 87 {
196 souaissa 66 int nb_face1=mggeo1->get_nb_mg_face();
197     int nb_face2=mggeo2->get_nb_mg_face();
198 souaissa 87 similarite.vide();
199     for(int i=0;i<nb_face1; i++)
200     {
201     MG_FACE* face1=mggeo1->get_mg_face(i);
202     MG_SURFACE*surf1=face1->get_surface();
203     int id1=face1->get_id();
204     OT_TENSEUR tns1_face(4),tns1_surf(4);
205     OT_TENSEUR ttns1_face(4),ttns1_surf(4);
206     int nb_top1_pts= face1->get_vectorisation().get_nb_points();
207     int nb_geo1_pts= surf1->get_vectorisation().get_nb_points();
208 souaissa 66
209 souaissa 87 tns1_face=face1->get_vectorisation().calcule_tenseur_metrique();
210     tns1_surf=surf1->get_vectorisation().calcule_tenseur_metrique();
211 souaissa 66
212 souaissa 87 for(int j=0;j<nb_face2;j++)
213     {
214     MG_FACE* face2=mggeo2->get_mg_face(j);
215     MG_SURFACE*surf2=face2->get_surface();
216     int id2=face2->get_id();
217     OT_TENSEUR tns2_face(4),tns2_surf(4);
218     OT_TENSEUR ttns2_face(4),ttns2_surf(4);
219     int nb_top2_pts= face2->get_vectorisation().get_nb_points();
220     int nb_geo2_pts= surf2->get_vectorisation().get_nb_points();
221     tns2_face=face2->get_vectorisation().calcule_tenseur_metrique();
222     tns2_surf=surf2->get_vectorisation().calcule_tenseur_metrique();
223 souaissa 66
224 souaissa 87 if(nb_geo1_pts==nb_geo2_pts&&nb_top1_pts==nb_top2_pts)
225     {
226     if(tns1_face.est_til_equivalent(tns2_face))
227     {
228     if(tns1_surf.est_til_equivalent(tns2_surf))
229     {
230     similarite.ajouter(id1);
231     similarite.ajouter(id2);
232     }
233     }
234     }
235     }
236     }
237 souaissa 143 if (affiche_couleur)this->affecter_les_couleurs(21);
238 souaissa 87
239     }
240    
241 souaissa 143 void VCT_COMPARAISON::compare_les_deux_geometries_inertiellement (int affiche_couleur)
242 souaissa 87 {
243     int nb_face1=mggeo1->get_nb_mg_face();
244     int nb_face2=mggeo2->get_nb_mg_face();
245     ssimilarite.vide();
246     for(int i=0;i<nb_face1; i++)
247     {
248     MG_FACE* face1=mggeo1->get_mg_face(i);
249     MG_SURFACE*surf1=face1->get_surface();
250     int id1=face1->get_id();
251     OT_TENSEUR tns1_face(4),tns1_surf(4);
252     int nb_top1_pts= face1->get_vectorisation().get_nb_points();
253     int nb_geo1_pts= surf1->get_vectorisation().get_nb_points();
254    
255     tns1_face=face1->get_vectorisation().calcule_tenseur_inertie_base_locale();
256     tns1_surf=surf1->get_vectorisation().calcule_tenseur_inertie_base_locale();
257     vector<double2> ifac1; vector<double2>isurf1;
258     for(int r=0;r<4;r++)
259     {
260     ifac1.insert( ifac1.end(), tns1_face(r,r));
261     isurf1.insert( isurf1.end(), tns1_surf(r,r));
262     }
263    
264 souaissa 66 for(int j=0;j<nb_face2;j++)
265     {
266    
267     MG_FACE* face2=mggeo2->get_mg_face(j);
268 souaissa 74 MG_SURFACE*surf2=face2->get_surface();
269 souaissa 66 int id2=face2->get_id();
270 souaissa 74 OT_TENSEUR tns2_face(4),tns2_surf(4);
271     int nb_top2_pts= face2->get_vectorisation().get_nb_points();
272     int nb_geo2_pts= surf2->get_vectorisation().get_nb_points();
273 souaissa 87 tns2_face=face2->get_vectorisation().calcule_tenseur_inertie_base_locale();
274     tns2_surf=surf2->get_vectorisation().calcule_tenseur_inertie_base_locale();
275     vector<double2> ifac2; vector<double2> isurf2;
276     for(int r=0;r<4;r++)
277     {
278     ifac2.insert( ifac2.end(), tns2_face(r,r));
279     isurf2.insert( isurf2.end(), tns2_surf(r,r));
280     }
281 souaissa 66
282 souaissa 74 if(nb_geo1_pts==nb_geo2_pts&&nb_top1_pts==nb_top2_pts)
283 souaissa 66 {
284 souaissa 87 vector<unsigned int> indx1,indx2;
285     if(tns1_face.listes_equivalentes(ifac1,ifac2,indx1))
286 souaissa 66 {
287 souaissa 87 if(tns1_face.listes_equivalentes(isurf1,isurf2,indx2))
288     {
289     ssimilarite.ajouter(id1);
290     ssimilarite.ajouter(id2);
291     }
292 souaissa 66 }
293 souaissa 87 }
294 souaissa 66
295 souaissa 87 }
296 souaissa 66
297 souaissa 87 }
298 souaissa 66
299 souaissa 143 if (affiche_couleur)affecter_les_couleurs(22);
300 souaissa 87 }
301    
302 souaissa 90 void VCT_COMPARAISON::compare_une_geometrie_inertiellement(int modele)
303 souaissa 87 {
304 souaissa 99 TPL_LISTE_ENTITE<int> ssim_tmp;
305 souaissa 87
306 francois 102 MG_GESTIONNAIRE *gst1;
307 souaissa 90 MG_GEOMETRIE *mgeo1 ;
308     int laquelle;
309 souaissa 87
310 souaissa 90 switch(modele)
311     {
312     case 1:
313     {
314     gst1=gest1;
315     mgeo1=mggeo1;
316 souaissa 92 laquelle=31;
317 souaissa 90 break;
318     }
319     case 2:
320     {
321     gst1=gest2;
322     mgeo1=mggeo2;
323 souaissa 92 laquelle=32;
324 souaissa 90 break;
325     }
326 souaissa 87
327     }
328 souaissa 66
329 souaissa 90 int nb_face1=mgeo1->get_nb_mg_face();
330 souaissa 99
331 souaissa 90 for(int i=0;i<nb_face1; i++)
332 souaissa 87 {
333 souaissa 90 MG_FACE* face1=mgeo1->get_mg_face(i);
334 souaissa 87 MG_SURFACE*surf1=face1->get_surface();
335     int id1=face1->get_id();
336     OT_TENSEUR tns1_face(4),tns1_surf(4);
337     int nb_top1_pts= face1->get_vectorisation().get_nb_points();
338     int nb_geo1_pts= surf1->get_vectorisation().get_nb_points();
339 souaissa 66
340 souaissa 87 tns1_face=face1->get_vectorisation().calcule_tenseur_inertie_base_locale();
341     tns1_surf=surf1->get_vectorisation().calcule_tenseur_inertie_base_locale();
342     vector<double2> ifac1; vector<double2>isurf1;
343     for(int r=0;r<4;r++)
344     {
345     ifac1.insert( ifac1.end(), tns1_face(r,r));
346     isurf1.insert( isurf1.end(), tns1_surf(r,r));
347     }
348 souaissa 66
349 souaissa 90 for(int j=0;j<nb_face1;j++)
350 souaissa 87 {
351 souaissa 66
352 souaissa 90 MG_FACE* face2=mgeo1->get_mg_face(j);
353 souaissa 87 MG_SURFACE*surf2=face2->get_surface();
354     int id2=face2->get_id();
355     OT_TENSEUR tns2_face(4),tns2_surf(4);
356     int nb_top2_pts= face2->get_vectorisation().get_nb_points();
357     int nb_geo2_pts= surf2->get_vectorisation().get_nb_points();
358     tns2_face=face2->get_vectorisation().calcule_tenseur_inertie_base_locale();
359     tns2_surf=surf2->get_vectorisation().calcule_tenseur_inertie_base_locale();
360     vector<double2> ifac2; vector<double2> isurf2;
361     for(int r=0;r<4;r++)
362     {
363     ifac2.insert( ifac2.end(), tns2_face(r,r));
364     isurf2.insert( isurf2.end(), tns2_surf(r,r));
365     }
366 souaissa 66
367 souaissa 87 if(nb_geo1_pts==nb_geo2_pts&&nb_top1_pts==nb_top2_pts)
368     {
369     vector<unsigned int> indx1,indx2;
370     if(tns1_face.listes_equivalentes(ifac1,ifac2,indx1))
371     {
372     if(tns1_face.listes_equivalentes(isurf1,isurf2,indx2))
373     {
374 souaissa 99 ssim_tmp.ajouter(id1);
375     ssim_tmp.ajouter(id2);
376 souaissa 87 }
377     }
378     }
379 souaissa 66
380 souaissa 87 }
381    
382     }
383 souaissa 99 if (modele==1) ssim1=ssim_tmp;
384     if (modele==2) ssim2=ssim_tmp;
385    
386 souaissa 90 affecter_les_couleurs(laquelle);
387 souaissa 66 }
388    
389    
390    
391 souaissa 82
392 souaissa 87 TPL_LISTE_ENTITE<int> VCT_COMPARAISON::get_liste_des_identitees()
393     {
394     return identite;
395     }
396    
397 souaissa 99 TPL_LISTE_ENTITE<int> VCT_COMPARAISON::get_liste_des_simalarite_vectorielle(int type_comparais)
398 souaissa 87 {
399 souaissa 99 TPL_LISTE_ENTITE<int> lst_tmp;
400     switch ( type_comparais)
401     {
402     case 12: lst_tmp= similarite;
403     case 1: lst_tmp= sim1;
404     case 2: lst_tmp= sim2;
405     }
406     return lst_tmp;
407 souaissa 87 }
408    
409 souaissa 99 TPL_LISTE_ENTITE<int> VCT_COMPARAISON::get_liste_des_simalarite_inertielle(int type_comparais)
410 souaissa 87 {
411 souaissa 99 TPL_LISTE_ENTITE<int> lst_tmp;
412     switch ( type_comparais)
413     {
414     case 12: lst_tmp= ssimilarite;
415     case 1: lst_tmp= ssim1;
416     case 2: lst_tmp= ssim2;
417     }
418     return lst_tmp;
419 souaissa 87 }
420    
421    
422     void VCT_COMPARAISON::affecter_les_couleurs(int niveau)
423 souaissa 66 {
424 souaissa 142 randomize();
425 souaissa 87 int nb_face_ident=similarite.get_nb()/2;
426     int nb_face_identt=ssimilarite.get_nb()/2;
427     int nb_face_iden=identite.get_nb()/2;
428     double val;
429     TPL_LISTE_ENTITE<int> lst;
430     TPL_LISTE_ENTITE<double> lst_val;
431     int num1,num2,num1_avant ;
432 souaissa 90 if (niveau==1) //pour afficher les identites entre le deux modèles
433 souaissa 87 {
434     for(int i=0;i< nb_face_iden;i++)
435     {
436     num1=identite.get(2*i) ;
437     num2=identite.get(2*i+1) ;
438     if(i>0) num1_avant= identite.get(2*(i-1));
439     MG_FACE* face1=mggeo1->get_mg_faceid(num1);
440     MG_FACE* face2=mggeo2->get_mg_faceid(num2);
441    
442     if(i==0)
443     {
444     choisir_une_couleur(val);
445     while(lst_val.est_dans_la_liste(val))
446     {
447     choisir_une_couleur(val);
448     }
449     face1->ajouter_ccf("Cc",val);
450     face2->ajouter_ccf("Cc",val);
451     lst_val.ajouter(val);
452     }
453    
454     if(i>0)
455     {
456     if(num1!=num1_avant)
457     {
458     choisir_une_couleur(val);
459     while(lst_val.est_dans_la_liste(val))
460     {
461     choisir_une_couleur(val);
462     }
463     face1->ajouter_ccf("Cc",val);
464     face2->ajouter_ccf("Cc",val);
465     lst_val.ajouter(val);
466     }
467     else{
468     face2->ajouter_ccf("Cc",val);
469     }
470    
471     }
472     }
473    
474     }
475    
476 souaissa 99 if(niveau==21||niveau==22||niveau==23) //pour afficher la similarite entre le deux modèle vectoriellement ou inertiellement
477 souaissa 90 {
478     TPL_LISTE_ENTITE<int> simu;
479     if(niveau==21)simu=similarite;
480     if(niveau==22) simu=ssimilarite;
481 souaissa 99 if(niveau==23) simu=sim_double;
482 souaissa 90 TPL_LISTE_ENTITE<int> llst1;
483     TPL_LISTE_ENTITE<int> llst2;
484     int nb_face_sim=simu.get_nb()/2.;
485     for(int i=0;i< nb_face_sim;i++)
486     {
487     TPL_LISTE_ENTITE<int> lst1;
488     TPL_LISTE_ENTITE<int> lst2;
489     TPL_LISTE_ENTITE<int> llst3;
490     num1=simu.get(2*i) ;
491     if(!llst1.est_dans_la_liste(num1))
492 souaissa 87 {
493 souaissa 90 num2=simu.get(2*i+1) ;
494     lst1.ajouter(num1);
495     lst2.ajouter(num2);
496     llst1.ajouter(num1);
497     llst2.ajouter(num2);
498     for(int j=1;j< nb_face_sim;j++)
499     {
500     int Num1=simu.get(2*j) ;
501     int Num2=simu.get(2*j+1) ;
502 souaissa 87
503 souaissa 90 if(num1==Num1)
504     {
505     llst3.ajouter(Num2);
506     }
507     if(num2==Num2||llst3.est_dans_la_liste(Num2))
508     {
509     if(!lst1.est_dans_la_liste(Num1)) {
510     lst1.ajouter(Num1);
511     llst1.ajouter(Num1); }
512     if(!lst2.est_dans_la_liste(Num2)) {
513     lst2.ajouter(Num2);
514     llst2.ajouter(Num2); }
515     }
516 souaissa 87
517     }
518    
519 souaissa 90 choisir_une_couleur(val);
520     while(lst_val.est_dans_la_liste(val))
521     {
522 souaissa 87 choisir_une_couleur(val);
523 souaissa 90 }
524     lst_val.ajouter(val);
525     int nb1=lst1.get_nb();
526     int nb2=lst2.get_nb();
527     for(int i=0;i<nb1;i++)
528     {
529     int n1=lst1.get(i);
530     MG_FACE* face1=mggeo1->get_mg_faceid(n1);
531     face1->ajouter_ccf("Cc",val);
532 souaissa 87 }
533 souaissa 90 for(int i=0;i<nb2;i++)
534     {
535     int n2=lst2.get(i);
536     MG_FACE* face2=mggeo2->get_mg_faceid(n2);
537     face2->ajouter_ccf("Cc",val);
538     }
539    
540     }
541     }
542 souaissa 87
543    
544     }
545    
546 souaissa 142 if(niveau== 31||niveau==32) //pour afficher la similarite dans le premier modèle ou le second modele
547 souaissa 87 {
548    
549 souaissa 90 MG_GEOMETRIE *mgeo1 ;
550     int laquelle;
551 souaissa 87
552 souaissa 90 switch(niveau)
553     {
554     case 31:
555     {
556     mgeo1=mggeo1;
557     laquelle=31;
558     break;
559 souaissa 87 }
560 souaissa 90 case 32:
561     {
562     mgeo1=mggeo2;
563     laquelle=32;
564     break;
565     }
566    
567 souaissa 87 }
568    
569 souaissa 142
570 souaissa 90 for(int i=0;i< nb_face_identt;i++)
571 souaissa 87 {
572 souaissa 90 num1=ssimilarite.get(2*i) ;
573     num2=ssimilarite.get(2*i+1) ;
574 souaissa 87
575 souaissa 90 if(i>0) num1_avant= ssimilarite.get(2*(i-1));
576     MG_FACE* face1=mgeo1->get_mg_faceid(num1);
577     MG_FACE* face2=mgeo1->get_mg_faceid(num2);
578     if(!lst.est_dans_la_liste(num2))
579     {
580 souaissa 87 if(i==0)
581     {
582     choisir_une_couleur(val);
583 souaissa 90 while(lst_val.est_dans_la_liste(val))
584     {
585     choisir_une_couleur(val);
586     }
587 souaissa 87 face1->ajouter_ccf("Cc",val);
588 souaissa 90 if(num1!=num2) face2->ajouter_ccf("Cc",val); lst.ajouter(num2);
589     lst_val.ajouter(val);
590 souaissa 87 }
591    
592     if(i>0)
593     {
594     if(num1!=num1_avant)
595     {
596 souaissa 90 choisir_une_couleur(val);
597     while(lst_val.est_dans_la_liste(val))
598     {
599 souaissa 87 choisir_une_couleur(val);
600 souaissa 90 }
601     face1->ajouter_ccf("Cc",val);
602     if(num1!=num2) face2->ajouter_ccf("Cc",val); lst.ajouter(num2);
603     lst_val.ajouter(val);
604 souaissa 87 }
605     else{
606 souaissa 90 if(num1!=num2) face2->ajouter_ccf("Cc",val); lst.ajouter(num2);
607 souaissa 87 }
608    
609     }
610 souaissa 90 }
611 souaissa 87 }
612    
613    
614     }
615    
616    
617     }
618    
619    
620     void VCT_COMPARAISON::choisir_une_couleur(double& val)
621     {
622 souaissa 142 randomize();
623 souaissa 87
624     unsigned char r=rand() % 255;
625     unsigned char g=rand() % 255;
626     unsigned char b=rand() % 255;
627     val=0.;
628     unsigned char* p =(unsigned char*)&val;
629    
630     *p=r;
631     p++;*p=g;
632     p++;*p=b;
633    
634     }
635    
636    
637 souaissa 99 void VCT_COMPARAISON::trouve_face_de_reference(int &face_ref1,int &face_ref2)// ,TPL_LISTE_ENTITE<int>& list
638     {
639     //compare_les_deux_geometries();
640     int nb_simdble=sim_double.get_nb()/2 ;
641    
642     int num1,num2 ;
643    
644    
645 souaissa 87 OT_VECTEUR_4DD Dv,Dv1,Dv2,G1,G2,g1g2;
646     OT_TENSEUR V(4),V1(4),V2(4);
647    
648    
649 souaissa 99 int nbsim=nb_sim.get_nb();
650     int *t=new int [nbsim];
651     int *tt=new int [nbsim];
652     for(int i=0;i<nbsim;i++)
653     {
654 souaissa 142 // t[i]= nb_sim.get(i);
655     t[i]= i;
656 souaissa 143 int nbre_faces_simil=nb_sim.get(i);
657     tt[i]=nbre_faces_simil;
658 souaissa 142
659 souaissa 99 }
660     int pos_min,pos_max;
661     int min,max;
662     int trouve=0;
663 souaissa 142
664     for (int i=0;i<nbsim;i++)
665     {
666    
667     for(int j=0;j<nbsim;j++)
668     {
669     if(tt[j]<tt[i])
670     {
671     int tmp= tt[i];
672    
673     tt[i]= tt[j];
674     tt[j]= tmp;
675     t[i]=j;
676     t[j]=i;
677     }
678     }
679     }
680    
681     //pos_min=t[0];
682     //pos_max=t[1];
683    
684     if(tt[0]==1)
685     {
686     MG_FACE* fref=mggeo1->get_mg_face(pos_min);
687     face_ref1= fref->get_id();
688     for(int i=0;i<nb_simdble;i++){
689     if (sim_double.get(2*i)==face_ref1)
690     face_ref2=sim_double.get(2*i+1);
691     }
692     return;
693     }
694    
695     /*
696 souaissa 99 sort (tt,tt+nbsim);
697     for (int i=0;i<nbsim;i++)
698     {
699     if(tt[i]>0)
700     {
701     min=tt[i];
702     break;
703     }
704     }
705 souaissa 87
706 souaissa 99 for (int i=0;i<nbsim;i++)
707     {
708     if(tt[i]>min)
709     {
710     max=tt[i];
711     trouve=1;
712     break;
713     }
714 souaissa 87 }
715 souaissa 99 for (int i=0;i<nbsim;i++)
716     {
717     if(t[i]==min)
718     {
719     pos_min=i;
720     break;
721     }
722     }
723     for (int i=0;i<nbsim;i++)
724     {
725     if(t[i]==max&&i!=pos_min)
726     {
727     pos_max=i;
728     break;
729     }
730     }
731     if(!trouve)
732     {
733     pos_max=pos_min+1;
734     max= t[pos_max];
735 souaissa 87 }
736 souaissa 142 */
737 souaissa 99
738    
739    
740    
741    
742 souaissa 142 int pos1=0;
743     int pos2=0;
744     /*
745     if(min==1)
746     {
747     MG_FACE* fref=mggeo1->get_mg_face(pos_min);
748     face_ref1= fref->get_id();
749     for(int i=0;i<nb_simdble;i++){
750     if (sim_double.get(2*i)==face_ref1)
751     face_ref2=sim_double.get(2*i+1);
752     }
753     return;
754     }
755 souaissa 99
756 souaissa 142 */
757     int tr=0;
758     trouve=0;
759 souaissa 143 while(trouve==0&&tr<nbsim-1)
760 souaissa 142 {
761     pos_min=t[tr];
762     pos_max=t[tr+1];
763    
764 souaissa 143 OT_VECTEUR_4DD g1_ref,g2_ref,G1_ref,G2_ref;
765 souaissa 99 MG_FACE* face1_ref=mggeo1->get_mg_face(pos_min);
766     int id1=face1_ref->get_id();
767 souaissa 87 face1_ref->get_vectorisation().calcule_axes_dinertie(Dv1,V1);
768 souaissa 143 G1_ref= face1_ref->get_vectorisation().calcule_barycentre();
769 souaissa 87
770     for(int r=0;r<4;r++) {
771     for(int s=0;s<4;s++) {
772 souaissa 143 g1_ref[r]= g1_ref[r]+V1(s,r)*G1_ref[s];
773 souaissa 87 }
774     }
775    
776    
777 souaissa 99 MG_FACE* face12_ref=mggeo1->get_mg_face(pos_max);
778     face12_ref->get_vectorisation().calcule_axes_dinertie(Dv2,V2);
779     int id2=face12_ref->get_id();
780 souaissa 143 G2_ref= face12_ref->get_vectorisation().calcule_barycentre();
781 souaissa 87 for(int r=0;r<4;r++) {
782     for(int s=0;s<4;s++) {
783 souaissa 143 g2_ref[r]= g2_ref[r]+V1(s,r)*G2_ref[s];
784 souaissa 87 }
785     }
786    
787 souaissa 99 OT_VECTEUR_4DD g12_ref= g2_ref -g1_ref;
788    
789    
790 souaissa 87 OT_VECTEUR_4DD g1refg1,g2refg2;
791 souaissa 99 TPL_LISTE_ENTITE<int> lst1,lst2;
792     for(int k=0;k<nb_simdble;k++)
793     {
794     if(sim_double.get(2*k)==id1)
795     lst1.ajouter( sim_double.get(2*k+1));
796     if(sim_double.get(2*k)==id2)
797     lst2.ajouter(sim_double.get(2*k+1));
798     }
799 souaissa 87
800 souaissa 99
801    
802 souaissa 142
803 souaissa 99 for(int i=0;i<lst1.get_nb();i++)
804 souaissa 87 {
805 souaissa 99
806     int num1=lst1.get(i);
807     OT_VECTEUR_4DD g1,G1;
808     MG_FACE* face1=mggeo2->get_mg_faceid(num1);
809     face1->get_vectorisation().calcule_axes_dinertie(Dv2,V2);
810 souaissa 87 G1= face1->get_vectorisation().calcule_barycentre();
811     for(int r=0;r<4;r++) {
812     for(int s=0;s<4;s++) {
813 souaissa 99 g1[r]= g1[r]+V2(s,r)*G1[s];
814 souaissa 87 }
815     }
816    
817 souaissa 99 // g1refg1=g1-g1_ref;
818     // num2=list.get(2*i+1);
819     for(int j=0;j<lst2.get_nb();j++)
820     {
821     int num2=lst2.get(j);
822 souaissa 87 OT_VECTEUR_4DD g2;
823     MG_FACE* face2=mggeo2->get_mg_faceid(num2);
824     G2= face2->get_vectorisation().calcule_barycentre();
825     for(int r=0;r<4;r++) {
826     for(int s=0;s<4;s++) {
827     g2[r]= g2[r]+V2(s,r)*G2[s];
828     }
829     }
830    
831 souaissa 99 OT_VECTEUR_4DD g2g1=g2-g1;
832 souaissa 143
833 souaissa 99 if(g2g1==g12_ref)
834 souaissa 87 {
835 souaissa 99 // lst_fin.ajouter(num1);
836     // lst_fin.ajouter(num2);
837     face_ref1=id1;
838     face_ref2=num1;
839     trouve=1;
840     break;
841 souaissa 87 }
842 souaissa 99 }
843     if(trouve) break;
844 souaissa 87 }
845 souaissa 142 tr++;
846     }
847 souaissa 100 delete [] t;
848     delete [] tt;
849 souaissa 87
850    
851 souaissa 142 }
852    
853    
854    
855    
856    
857     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)
858     {
859    
860     int nb_boucle1=face1->get_nb_mg_boucle();
861     int nb_boucle2=face2->get_nb_mg_boucle();
862    
863    
864     //-----------------------------------------------------------------------------
865     OT_VECTEUR_4DD Dv1,Dv2,G1,gf1,gf2,G2;
866     OT_TENSEUR V1(4),V2(4);
867    
868     f_ref1->get_vectorisation().calcule_axes_dinertie(Dv1,V1);
869     G1=f_ref1->get_vectorisation().calcule_barycentre();
870    
871     for(int r=0;r<4;r++) {
872     for(int s=0;s<4;s++) {
873     gf1[r]= gf1[r]+V1(s,r)*G1[s];
874     }
875     }
876    
877     f_ref2->get_vectorisation().calcule_axes_dinertie(Dv2,V2);
878     G2=f_ref2->get_vectorisation().calcule_barycentre();
879    
880     for(int r=0;r<4;r++) {
881     for(int s=0;s<4;s++) {
882     gf2[r]= gf2[r]+V2(s,r)*G2[s];
883     }
884     }
885    
886     //---------------------------------------------------------------------------
887     int nb_aretes=0;
888     for(int j1=0;j1<nb_boucle1;j1++)
889     {
890     MG_BOUCLE* Boucle1 = face1->get_mg_boucle(j1);
891     int nbarete1 = Boucle1->get_nb_mg_coarete();
892     nb_aretes+=nbarete1;
893     for (int w1 =0; w1<nbarete1;w1++)
894     {
895    
896     OT_TENSEUR tns_arete1(4),tns_courbe1(4);
897     OT_TENSEUR tm1_art(4),tm1_crb(4);
898     MG_COARETE* coArete1 = Boucle1->get_mg_coarete(w1);
899     MG_ARETE* arete1 = coArete1->get_arete();
900     int id_art1=arete1->get_id();
901    
902     MG_COURBE* courbe1=arete1->get_courbe();
903    
904     int nb_top1_pts= arete1->get_vectorisation().get_nb_points();
905     int nb_geo1_pts= courbe1->get_vectorisation().get_nb_points();
906    
907     tm1_art=arete1->get_vectorisation().calcule_tenseur_metrique();
908     tm1_crb=courbe1->get_vectorisation().calcule_tenseur_metrique();
909    
910    
911    
912     //----------------------------------------------------------------------
913     OT_VECTEUR_4DD B1,g1;
914     B1=arete1->get_vectorisation().calcule_barycentre();
915     for(int r=0;r<4;r++) {
916     for(int s=0;s<4;s++)
917     g1[r]= g1[r]+V1(s,r)*B1[s];
918     }
919     //----------------------------------------------------------------------
920    
921     tns_arete1=arete1->get_vectorisation().calcule_tenseur_inertie_base_locale();
922     tns_courbe1=courbe1->get_vectorisation().calcule_tenseur_inertie_base_locale();
923     vector<double2> viarte1,vicrbe1;
924     for(int r=0;r<4;r++)
925     {
926     viarte1.insert( viarte1.end(), tns_arete1(r,r));
927     vicrbe1.insert( vicrbe1.end(), tns_courbe1(r,r));
928     }
929     int compt_aretes_modif=0;
930     for(int j2=0;j2<nb_boucle2;j2++)
931     {
932     MG_BOUCLE* Boucle2 = face2->get_mg_boucle(j2);
933     int nbarete2 = Boucle2->get_nb_mg_coarete();
934     for (int w2 =0; w2<nbarete2;w2++)
935     {
936     OT_TENSEUR tns_arete2(4),tns_courbe2(4);
937     OT_TENSEUR tm2_art(4),tm2_crb(4);
938     MG_COARETE* coArete2 = Boucle2->get_mg_coarete(w2);
939     MG_ARETE* arete2 = coArete2->get_arete();
940     MG_COURBE* courbe2=arete2->get_courbe();
941     int id_art2=arete2->get_id();
942     if(!aretes_ident.est_dans_la_liste(id_art2))
943     {
944     //----------------------------------------------------------------------
945     OT_VECTEUR_4DD B2,g2;
946     B2=arete2->get_vectorisation().calcule_barycentre();
947     for(int r=0;r<4;r++) {
948     for(int s=0;s<4;s++)
949     g2[r]= g2[r]+V2(s,r)*B2[s];
950     }
951     //---------------------------------------------------------------------- MG_COURBE* courbe2=arete2->get_courbe();
952    
953     int nb_top2_pts= arete2->get_vectorisation().get_nb_points();
954     int nb_geo2_pts= courbe2->get_vectorisation().get_nb_points();
955    
956     tm2_art=arete2->get_vectorisation().calcule_tenseur_metrique();
957     tm2_crb=courbe2->get_vectorisation().calcule_tenseur_metrique();
958    
959     tns_arete2=arete2->get_vectorisation().calcule_tenseur_inertie_base_locale();
960     tns_courbe2=courbe2->get_vectorisation().calcule_tenseur_inertie_base_locale();
961    
962     vector<double2> viarte2,vicrbe2;
963     for(int r=0;r<4;r++)
964     {
965     viarte2.insert( viarte2.end(), tns_arete2(r,r));
966     vicrbe2.insert( vicrbe2.end(), tns_courbe2(r,r));
967     }
968    
969     if(nb_geo1_pts==nb_geo2_pts&&nb_top1_pts==nb_top2_pts)
970     {
971     if(tm1_art.est_til_equivalent(tm2_art))
972     {
973     if(tm1_crb.est_til_equivalent(tm2_crb))
974     {
975     vector<unsigned int> indx1,indx2;
976     int identique=-1;
977     if(tns_arete1==tns_arete2)//.listes_equivalentes(viarte1,viarte2,indx1))
978     {
979     if(tns_courbe1==tns_courbe2)//tns_arete1.listes_equivalentes(vicrbe1,vicrbe2,indx2))
980     {
981     OT_VECTEUR_4DD v1=gf1-g1;
982     OT_VECTEUR_4DD v2=gf2-g2;
983    
984     if(v1==v2)
985     {
986     aretes_ident.ajouter(j1) ;
987     aretes_ident.ajouter(id_art1) ;
988     aretes_ident.ajouter(j2) ;
989     aretes_ident.ajouter(id_art2) ;
990     identique=1;
991    
992     }
993    
994     }
995     }
996     if(identique>0) break;
997     if(identique<0)
998     {
999     aretes_sim.ajouter(j1) ;
1000     aretes_sim.ajouter(id_art1) ;
1001     aretes_sim.ajouter(j2) ;
1002     aretes_sim.ajouter(id_art2) ;
1003     identique=-1;
1004     }
1005     }
1006     }
1007     } // aretes2
1008    
1009     } //boucle2
1010    
1011     }//condition 1 //aretes_identiques
1012     }
1013    
1014     }
1015     }
1016    
1017     if(nb_aretes==aretes_ident.get_nb()/2) return 1;
1018     else return 0;
1019    
1020     }
1021    
1022     void VCT_COMPARAISON::identifier_aretes_face_modifiee(MG_FACE* face1,MG_FACE* face2,TPL_LISTE_ENTITE<int>& aretes_identiques,TPL_LISTE_ENTITE<int>&aretes_simil,TPL_LISTE_ENTITE<int>& aret1_conservees,
1023     TPL_LISTE_ENTITE<int>& aret1_disparues,
1024     TPL_LISTE_ENTITE<int>& aret2_conservees ,
1025     TPL_LISTE_ENTITE<int>& aret2_nouvelles ,
1026     TPL_LISTE_ENTITE<int>& aret2_partielles)
1027     {
1028    
1029     int nb_boucle1=face1->get_nb_mg_boucle();
1030     int nb_boucle2=face2->get_nb_mg_boucle();
1031    
1032    
1033     int cmpt_arete=0;
1034    
1035     TPL_LISTE_ENTITE<int> boucle_face1;
1036     TPL_LISTE_ENTITE<int> boucle_face2;
1037    
1038     TPL_LISTE_ENTITE<int> aretes_ident_face1;
1039     TPL_LISTE_ENTITE<int> aretes_ident_face2;
1040     TPL_LISTE_ENTITE<int> aretes_face1;
1041     TPL_LISTE_ENTITE<int> aretes_face2;
1042     TPL_LISTE_ENTITE<int> aretes_dif_face2;
1043     TPL_LISTE_ENTITE<int> aretes_sim_face1;
1044     TPL_LISTE_ENTITE<int> aretes_sim_face2;
1045    
1046     for(int b=0;b<aretes_identiques.get_nb()/4;b++)
1047 souaissa 87 {
1048 souaissa 142 boucle_face1.ajouter( aretes_identiques.get(4*b));
1049     boucle_face2.ajouter( aretes_identiques.get(4*b+2));
1050     aretes_ident_face1.ajouter(aretes_identiques.get(4*b+1));
1051     aretes_ident_face2.ajouter(aretes_identiques.get(4*b+3));
1052     }
1053     for(int b=0;b<aretes_simil.get_nb()/4;b++)
1054     {
1055     aretes_sim_face1.ajouter(aretes_simil.get(4*b+1));
1056     aretes_sim_face2.ajouter(aretes_simil.get(4*b+3));
1057     }
1058    
1059     for(int j1=0;j1<nb_boucle1;j1++)
1060     {
1061     MG_BOUCLE* Boucle1 = face1->get_mg_boucle(j1);
1062     int nbarete1 = Boucle1->get_nb_mg_coarete();
1063     TPL_LISTE_ENTITE<int> lst_aret_dif;
1064     int compt1=0;
1065     int boucle;
1066     int start_boucle,end_boucle;
1067     int cmpt=0;
1068     TPL_LISTE_ENTITE<int> arete_boucle1;
1069     TPL_LISTE_ENTITE<int> arete_boucle2;
1070    
1071     if(boucle_face1.est_dans_la_liste(j1))
1072     {
1073     for(int k=0;k<boucle_face1.get_nb();k++)
1074     {
1075     if (j1==boucle_face1.get(k))
1076     {
1077     arete_boucle1.ajouter(aretes_ident_face1.get(k));
1078     arete_boucle2.ajouter(aretes_ident_face2.get(k));
1079     boucle=boucle_face2.get(k);
1080     }
1081     }
1082     }
1083    
1084     for (int w1=0; w1<nbarete1;w1++)
1085 souaissa 87 {
1086 souaissa 142 MG_COARETE* coArete1 = Boucle1->get_mg_coarete(w1);
1087     MG_ARETE* arete1 = coArete1->get_arete();
1088     int id_art1=arete1->get_id();
1089    
1090     if(!arete_boucle1.est_dans_la_liste(id_art1))
1091     {
1092     aret1_disparues.ajouter(id_art1);
1093     }
1094     else
1095     {
1096     aret1_conservees.ajouter(id_art1);
1097     }
1098 souaissa 87 }
1099 souaissa 142
1100    
1101     for(int j2=0;j2<nb_boucle2;j2++)
1102     {
1103     MG_BOUCLE* Boucle2 = face2->get_mg_boucle(j2);
1104     int nbarete2 = Boucle2->get_nb_mg_coarete();
1105    
1106     for (int w2=0; w2<nbarete2;w2++)
1107     {
1108     MG_COARETE* coArete2 = Boucle2->get_mg_coarete(w2);
1109     MG_ARETE* arete2 = coArete2->get_arete();
1110     int id_art2=arete2->get_id();
1111     if(!arete_boucle2.est_dans_la_liste(id_art2))
1112     {
1113     aret2_nouvelles.ajouter(id_art2);
1114     if (aretes_simil.est_dans_la_liste(id_art2))
1115     aret2_partielles.ajouter(id_art2);
1116    
1117     }
1118     else
1119     {
1120     aret2_conservees.ajouter(id_art2);
1121     }
1122    
1123     }
1124     }
1125    
1126    
1127     } //boucle_face1
1128    
1129    
1130    
1131     }
1132    
1133    
1134    
1135     void VCT_COMPARAISON::identifier_les_modifications_appliquees(VCT_COMPARAISON_RESULTAT& Results)
1136     {
1137    
1138 souaissa 143 TPL_LISTE_ENTITE<int> face1_conservees;
1139     TPL_LISTE_ENTITE<int> face2_conservees;
1140     TPL_LISTE_ENTITE<int> faces_nouvelles;
1141 souaissa 142
1142 souaissa 143 TPL_LISTE_ENTITE<int> aret_ident;
1143     TPL_LISTE_ENTITE<int> aret_modif;
1144     int nb_face1=mggeo1->get_nb_mg_face();
1145     int nb_face2=mggeo2->get_nb_mg_face();
1146     TPL_LISTE_ENTITE<int> lst_face1,lst_face2,lst_facloc1,lst_facloc2,dif1,dif2;
1147    
1148 souaissa 142 for(int i=0;i<nb_face1;i++)
1149     {
1150     OT_VECTEUR_4DD g1,G1;
1151     MG_FACE* face1=mggeo1->get_mg_face(i);
1152     int id1=face1->get_id();
1153     lst_face1.ajouter(id1);
1154 souaissa 87 }
1155 souaissa 142
1156     for(int i=0;i<nb_face2;i++)
1157     {
1158     OT_VECTEUR_4DD g1,G1;
1159     MG_FACE* face2=mggeo2->get_mg_face(i);
1160     int id2=face2->get_id();
1161     lst_face2.ajouter(id2);
1162     }
1163    
1164 souaissa 143 MG_FACE* Face_ref1=mggeo1->get_mg_faceid(face_ref1) ;
1165     MG_FACE* Face_ref2=mggeo2->get_mg_faceid(face_ref2) ;
1166    
1167 souaissa 142 for(int i=0;i<identite.get_nb()/2;i++)
1168     {
1169     CORRESPONDANCE CORRESP;
1170     int face1_id=identite.get(2*i);
1171     int face2_id=identite.get(2*i+1);
1172     MG_FACE* Face1=mggeo1->get_mg_faceid(face1_id);
1173     MG_FACE* Face2=mggeo2->get_mg_faceid(face2_id);
1174     face1_conservees.ajouter(face1_id);
1175     face2_conservees.ajouter(face2_id);
1176     Results.ajouter_liste_topologie(100,Face1);
1177     Results.ajouter_liste_topologie(300,Face2);
1178     CORRESP.eleorigine=Face1;
1179     CORRESP.elemodifie=Face2;
1180     Results.ajouter_liste_topologie(CORRESP);
1181 souaissa 143
1182     //----------------------------------------
1183     TPL_LISTE_ENTITE<int> aretes_identiques;
1184     TPL_LISTE_ENTITE<int> aretes_similaires;
1185    
1186     //------------------------------------------
1187     this->comparer_aretes_faces(Face_ref1,Face_ref2,Face1,Face2,aretes_identiques,aretes_similaires);
1188    
1189     int nb_aretes_trouvees=aretes_identiques.get_nb()/4;
1190    
1191     if(nb_aretes_trouvees)
1192     {
1193     CORRESPONDANCE corsp;
1194     for(int i1=0;i1<nb_aretes_trouvees;i1++)
1195     {
1196     int art1_id=aretes_identiques.get(4*i1+1);
1197     MG_ARETE*art1_cons=mggeo1->get_mg_areteid(art1_id);
1198     Results.ajouter_liste_topologie(100,art1_cons);
1199     int art2_id=aretes_identiques.get(4*i1+3);
1200     MG_ARETE*art2_cons=mggeo2->get_mg_areteid(art2_id);
1201     Results.ajouter_liste_topologie(300,art2_cons);
1202    
1203     corsp.eleorigine=art1_cons;
1204     corsp.elemodifie=art2_cons;
1205     Results.ajouter_liste_topologie(corsp);
1206     }
1207     }
1208    
1209    
1210 souaissa 142 }
1211    
1212 souaissa 143
1213     this->identifier_les_sommets(Face_ref1,Face_ref2,Results);
1214    
1215    
1216     for(int t=0;t<lst_face1.get_nb();t++)
1217     {
1218     if(!face1_conservees.est_dans_la_liste(lst_face1.get(t)) )
1219 souaissa 142 dif1.ajouter(lst_face1.get(t));
1220 souaissa 143 }
1221     for(int it=0;it<lst_face2.get_nb();it++)
1222     {
1223     if(!face2_conservees.est_dans_la_liste(lst_face2.get(it)))
1224 souaissa 142 dif2.ajouter(lst_face2.get(it));
1225 souaissa 143 }
1226 souaissa 87
1227    
1228 souaissa 143
1229 souaissa 142 TPL_LISTE_ENTITE<int> faces_partiellement_modf;
1230     TPL_LISTE_ENTITE<int> Aret1_conservees;
1231     TPL_LISTE_ENTITE<int> Aret1_disparues;
1232     TPL_LISTE_ENTITE<int> Aret2_conservees ;
1233     TPL_LISTE_ENTITE<int> Aret2_nouvelles ;
1234     TPL_LISTE_ENTITE<int> Aret2_partielles ;
1235 souaissa 87
1236 souaissa 142 for(int i=0;i<dif1.get_nb();i++)
1237     {
1238     int Num1=dif1.get(i);
1239     MG_FACE* face1=mggeo1->get_mg_faceid(Num1);
1240     for(int j=0;j<dif2.get_nb();j++)
1241     {
1242     int Num2=dif2.get(j);
1243     TPL_LISTE_ENTITE<int> aretes_identiques;
1244     TPL_LISTE_ENTITE<int> aretes_similaires;
1245     TPL_LISTE_ENTITE<int> aretes_conservees;
1246     TPL_LISTE_ENTITE<int> nouvelles_aretes ;
1247     TPL_LISTE_ENTITE<int> aret1_conservees;
1248     TPL_LISTE_ENTITE<int> aret1_disparues;
1249     TPL_LISTE_ENTITE<int> aret2_conservees ;
1250     TPL_LISTE_ENTITE<int> aret2_nouvelles ;
1251     TPL_LISTE_ENTITE<int> aret2_partielles ;
1252 souaissa 87
1253 souaissa 142 MG_FACE* face2=mggeo2->get_mg_faceid(Num2);
1254     comparer_aretes_faces(Face_ref1,Face_ref2,face1,face2,aretes_identiques,aretes_similaires);
1255     identifier_aretes_face_modifiee(face1,face2,aretes_identiques,aretes_similaires,aret1_conservees,aret1_disparues,aret2_conservees ,aret2_nouvelles ,aret2_partielles);
1256     int id_face2=face2->get_id();
1257     int nb_aretes_trouvees=aretes_identiques.get_nb()/2;
1258     if(nb_aretes_trouvees)
1259     {
1260     for(int i1=0;i1<aret1_conservees.get_nb();i1++){
1261     int art1_id=aret1_conservees.get(i1);
1262     Aret1_conservees.ajouter(art1_id);
1263     MG_ARETE*art1_cons=mggeo1->get_mg_areteid(art1_id);
1264     Results.ajouter_liste_topologie(100,art1_cons);
1265 souaissa 143
1266 souaissa 142 int art2_id= aret2_conservees.get(i1) ;
1267     Aret2_conservees.ajouter(art2_id);
1268     MG_ARETE*art2_cons=mggeo2->get_mg_areteid(art2_id);
1269     Results.ajouter_liste_topologie(300,art2_cons);
1270     CORRESPONDANCE CORRESP;
1271     CORRESP.eleorigine=art1_cons;
1272     CORRESP.elemodifie=art2_cons;
1273     Results.ajouter_liste_topologie(CORRESP);
1274     }
1275 souaissa 87
1276 souaissa 142 for(int i1=0;i1<aret1_disparues.get_nb();i1++){
1277     int art_dsp=aret1_disparues.get(i1) ;
1278     Aret1_disparues.ajouter(art_dsp);
1279     MG_ARETE*art_disp=mggeo1->get_mg_areteid(art_dsp);
1280     Results.ajouter_liste_topologie(200,art_disp);
1281     }
1282    
1283     for(int i1=0;i1<aret2_nouvelles.get_nb();i1++){
1284     int art_nv= aret2_nouvelles.get(i1) ;
1285     Aret2_nouvelles.ajouter(art_nv);
1286     MG_ARETE*art_app=mggeo2->get_mg_areteid(art_nv);
1287     Results.ajouter_liste_topologie(400,art_app);
1288     }
1289     for(int i1=0;i1<aret2_partielles.get_nb();i1++){
1290     int art_prt=aret2_partielles.get(i1);
1291     Aret2_partielles.ajouter(art_prt);
1292     }
1293 souaissa 143
1294 souaissa 142 }
1295    
1296     }
1297 souaissa 143 }
1298 souaissa 142
1299 souaissa 143
1300 souaissa 142 for(int j=0;j<dif2.get_nb();j++)
1301     {
1302     if(!faces_partiellement_modf.est_dans_la_liste(dif2.get(j)))
1303     {
1304     int nouv_face=dif2.get(j);
1305     faces_nouvelles.ajouter(nouv_face);
1306     MG_FACE* Face_Nouvelle=mggeo2->get_mg_faceid(nouv_face);
1307     Results.ajouter_liste_topologie(400,Face_Nouvelle);
1308 souaissa 143 int nb_boucle2=Face_Nouvelle->get_nb_mg_boucle();
1309    
1310     for(int j=0;j<nb_boucle2;j++)
1311     {
1312     MG_BOUCLE* Boucle2 = Face_Nouvelle->get_mg_boucle(j);
1313     int nbarete2 = Boucle2->get_nb_mg_coarete();
1314     for(int w2=0;w2<nbarete2;w2++)
1315     {
1316     MG_COARETE* coArete2 = Boucle2->get_mg_coarete(w2);
1317     MG_ARETE* arete_nouvelle = coArete2->get_arete();
1318     Results.ajouter_liste_topologie(400,arete_nouvelle);
1319     MG_COSOMMET* cosommt1= arete_nouvelle->get_cosommet1();
1320     MG_COSOMMET* cosommt2= arete_nouvelle->get_cosommet2();
1321     MG_SOMMET* nouveau_sommet1= cosommt1->get_sommet();
1322     MG_SOMMET* nouveau_sommet2= cosommt2->get_sommet();
1323     Results.ajouter_liste_topologie(400,nouveau_sommet1);
1324     Results.ajouter_liste_topologie(400,nouveau_sommet2);
1325     }
1326     }
1327     }
1328     }
1329    
1330    
1331    
1332     }
1333    
1334     void VCT_COMPARAISON::identifier_les_sommets(MG_FACE* face1_ref,MG_FACE* face2_ref,VCT_COMPARAISON_RESULTAT& Results)
1335     {
1336     OT_VECTEUR_4DD Dv1,Dv2,G1,gf1,gf2,G2;
1337     OT_TENSEUR V1(4),V2(4);
1338    
1339     face1_ref->get_vectorisation().calcule_axes_dinertie(Dv1,V1);
1340     G1=face1_ref->get_vectorisation().calcule_barycentre();
1341    
1342     for(int r=0;r<4;r++) {
1343     for(int s=0;s<4;s++) {
1344     gf1[r]= gf1[r]+V1(s,r)*G1[s];
1345     }
1346     }
1347    
1348     face2_ref->get_vectorisation().calcule_axes_dinertie(Dv2,V2);
1349     G2=face2_ref->get_vectorisation().calcule_barycentre();
1350    
1351     for(int r=0;r<4;r++) {
1352     for(int s=0;s<4;s++) {
1353     gf2[r]= gf2[r]+V2(s,r)*G2[s];
1354     }
1355     }
1356    
1357     int nb_sommet1= mggeo1->get_nb_mg_sommet();
1358     int nb_sommet2= mggeo2->get_nb_mg_sommet();
1359    
1360     TPL_LISTE_ENTITE<int> lst1,lst2;
1361    
1362     for(int i=0;i<nb_sommet1;i++)
1363     {
1364     double xyz1[3];
1365     OT_VECTEUR_4DD S1,s1;
1366     MG_SOMMET *som1=mggeo1->get_mg_sommet(i);
1367     MG_POINT* pt1=som1->get_point();
1368     int som1_id=som1->get_id();
1369     pt1->evaluer(xyz1);
1370     for(int t=0;t<3;t++) s1[t]=xyz1[t];
1371    
1372     for(int r=0;r<4;r++) {
1373     for(int s=0;s<4;s++) {
1374     S1[r]= S1[r]+V1(s,r)*s1[s];
1375     }
1376     }
1377    
1378     if( !lst1.est_dans_la_liste(som1_id))
1379     {
1380     for(int j=0;j<nb_sommet2;j++)
1381     {
1382     double xyz2[3];
1383     OT_VECTEUR_4DD S2,s2;
1384     MG_SOMMET *som2=mggeo2->get_mg_sommet(j);
1385     MG_POINT* pt2=som2->get_point();
1386     int som2_id=som2->get_id();
1387     pt2->evaluer(xyz2);
1388     for(int t=0;t<3;t++) s2[t]=xyz2[t];
1389     if(!lst2.est_dans_la_liste(som2_id))
1390     {
1391    
1392     for(int r=0;r<4;r++) {
1393     for(int s=0;s<4;s++) {
1394     S2[r]= S2[r]+V2(s,r)*s2[s];
1395     }
1396     }
1397    
1398     if (S1==S2)
1399     {
1400    
1401     Results.ajouter_liste_topologie(100,som1);
1402     Results.ajouter_liste_topologie(100,som2);
1403     CORRESPONDANCE CORRESP;
1404     CORRESP.eleorigine=som1;
1405     CORRESP.elemodifie=som2;
1406     Results.ajouter_liste_topologie(CORRESP);
1407     lst1.ajouter(som1_id);
1408     lst2.ajouter(som2_id);
1409     break;
1410 souaissa 142 }
1411 souaissa 143
1412     }
1413 souaissa 142 }
1414 souaissa 143 }
1415     }
1416 souaissa 142
1417 souaissa 143
1418    
1419    
1420    
1421    
1422 souaissa 87 }
1423    
1424    
1425 souaissa 143
1426    
1427 souaissa 142 std::ostream& operator <<(std::ostream& os,const VCT_COMPARAISON& vct_cmp)
1428     {
1429     vct_cmp.enregistrer(os) ;
1430     return os;
1431     }
1432 souaissa 87
1433    
1434    
1435 souaissa 142
1436    
1437 souaissa 87 void VCT_COMPARAISON::enregistrer(ostream& os)
1438 souaissa 142 {
1439     os<<"COMPARAISON VECTORIELLE DE DEUX GEOMETRIES"<<endl;
1440     int nb_cl=2;
1441     int nb_lg=similarite.get_nb()/2;
1442 souaissa 66 os<<"FACES_PREMIERE_GEOMETRIE : ";
1443     for(int j=0;j<nb_lg;j++)
1444 souaissa 87 os<<setw(5)<<similarite.get(j*nb_cl+0);
1445 souaissa 66 os<<endl;
1446     os<<"FACES_SECONDE_GEOMETRIE : ";
1447     for(int j=0;j<nb_lg;j++)
1448 souaissa 87 os<<setw(5)<<similarite.get(j*nb_cl+1);
1449 souaissa 66 os<<endl;
1450    
1451 souaissa 87 //affecter_une_couleur();
1452 souaissa 82
1453    
1454 souaissa 142 }
1455 souaissa 143
1456    
1457    
1458