ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/comparaison/src/vct_comparaison.cpp
Revision: 100
Committed: Fri May 16 19:45:29 2008 UTC (17 years ago) by souaissa
Original Path: magic/lib/vectorisation/vectorisation/src/vct_comparaison.cpp
File size: 28590 byte(s)
Log Message:
Mise a jour de vct_comparison

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 74 #include <iomanip.h>
11 souaissa 87
12 souaissa 66 //---------------------------------------------------------------------------
13    
14     #pragma package(smart_init)
15    
16    
17 francois 89 VCT_COMPARAISON::VCT_COMPARAISON(MG_FILE *gst1,MG_GEOMETRIE *mgeo1,MG_FILE *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     void VCT_COMPARAISON::compare_les_deux_geometries(void)
27     {
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    
99 souaissa 99 this->affecter_les_couleurs(23);
100 souaissa 66 }
101    
102    
103    
104 francois 89 void VCT_COMPARAISON::trouver_les_identites(void)
105 souaissa 87 {
106     int face_ref1;
107     int face_ref2;
108     TPL_LISTE_ENTITE<int> lst;
109 souaissa 90 compare_les_deux_geometries();
110 souaissa 99 int nb_face1=mggeo1->get_nb_mg_face();
111     int nb_face2=mggeo2->get_nb_mg_face();
112 souaissa 90
113 souaissa 99 int nb_fsim1=sim_double.get_nb()/2;
114     int nb_fsim2=sim_double.get_nb()/2;
115     /*
116 souaissa 87 TPL_LISTE_ENTITE<int> list11;
117     TPL_LISTE_ENTITE<int> list12;
118     TPL_LISTE_ENTITE<int> list21;
119     TPL_LISTE_ENTITE<int> list22;
120     TPL_LISTE_ENTITE<int> list1_final;
121     TPL_LISTE_ENTITE<int> list2_final;
122    
123     for(int i=0;i<nb_fsim1;i++)
124     list11.ajouter(similarite.get(2*i));
125     for(int i=0;i<nb_fsim1;i++)
126     list12.ajouter(similarite.get(2*i+1));
127     for(int i=0;i<nb_fsim2;i++)
128 souaissa 99 list21.ajouter(sim_double.get(2*i));
129 souaissa 87 for(int i=0;i<nb_fsim2;i++)
130 souaissa 99 list22.ajouter(sim_double.get(2*i+1));
131 souaissa 87
132     int c1,c2,c3,c,cc,c22;
133     int compt=0;
134     bool trouve_ref=false;
135     int pour_la_premiere_fois=1;
136     for(int i=0;i<nb_fsim1;i++)
137     {
138     int num11=list11.get(i);
139     int num12=list12.get(i);
140    
141     for(int j=0;j<nb_fsim2;j++)
142     {
143     int num21=list21.get(j);
144     int num22=list22.get(j);
145     if(num11==num21)
146     if(num12==num22)
147     {
148     list1_final.ajouter(num11);
149     list2_final.ajouter(num22);
150     if (i>0)
151     {
152    
153     if(num11==list11.get(i-1))
154     {
155     if(pour_la_premiere_fois)
156     {
157     lst.ajouter(list11.get(i-1));
158     lst.ajouter(list12.get(i-1));
159     pour_la_premiere_fois=0;
160     }
161     lst.ajouter(num11);
162     lst.ajouter(num12);
163     }
164     else
165     pour_la_premiere_fois=1;
166     }
167     compt++;
168     if(!trouve_ref)
169     {
170     if(compt==1)
171     c1=num11;
172     if(compt==2)
173     {
174     c2=num11;
175     c22= num12;
176     }
177     if(compt==3)
178     c3=num11;
179     if (compt==4)
180     {
181     if (c1!=c2&&c1!=c3&&c2!=c3)
182     {
183     c=c2;
184     cc=c22;
185     trouve_ref=true;
186     }
187     compt=0;
188     }
189    
190     break;
191     }
192    
193     }
194     }
195     }
196    
197 souaissa 99 */
198 souaissa 87 TPL_LISTE_ENTITE<int> lst_fin;
199    
200 souaissa 99 this->trouve_face_de_reference(face_ref1,face_ref2);//,ls,lst_fin
201 souaissa 87
202 souaissa 99 OT_VECTEUR_4DD Dv,Dv1,Dv2,G1,G2,g1g2;
203     OT_TENSEUR V(4),V1(4),V2(4);
204     OT_VECTEUR_4DD g1_ref,g2_ref;
205     MG_FACE* face1_ref=mggeo1->get_mg_faceid(face_ref1);
206     face1_ref->get_vectorisation().calcule_axes_dinertie(Dv1,V1);
207     G1= face1_ref->get_vectorisation().calcule_barycentre();
208    
209     for(int r=0;r<4;r++) {
210     for(int s=0;s<4;s++) {
211     g1_ref[r]= g1_ref[r]+V1(s,r)*G1[s];
212     }
213     }
214    
215    
216     MG_FACE* face2_ref=mggeo2->get_mg_faceid(face_ref2);
217     face2_ref->get_vectorisation().calcule_axes_dinertie(Dv2,V2);
218     G2= face2_ref->get_vectorisation().calcule_barycentre();
219     for(int r=0;r<4;r++) {
220     for(int s=0;s<4;s++) {
221     g2_ref[r]= g2_ref[r]+V2(s,r)*G2[s];
222     }
223     }
224    
225    
226     OT_VECTEUR_4DD g1refg1,g2refg2;
227     TPL_LISTE_ENTITE<int> lst1,lst2;
228    
229    
230     for(int i=0;i<nb_face1;i++)
231     {
232     OT_VECTEUR_4DD g1,G1;
233     MG_FACE* face1=mggeo1->get_mg_face(i);
234     int id1=face1->get_id();
235     G1= face1->get_vectorisation().calcule_barycentre();
236     for(int r=0;r<4;r++) {
237     for(int s=0;s<4;s++) {
238     g1[r]= g1[r]+V1(s,r)*G1[s];
239     }
240     }
241    
242     g1refg1=g1-g1_ref;
243     // num2=list.get(2*i+1);
244     for(int j=0;j<nb_face2;j++)
245     {
246    
247     OT_VECTEUR_4DD g2;
248     MG_FACE* face2=mggeo2->get_mg_face(j);
249     int id2=face2->get_id();
250     G2= face2->get_vectorisation().calcule_barycentre();
251     for(int r=0;r<4;r++) {
252     for(int s=0;s<4;s++) {
253     g2[r]= g2[r]+V2(s,r)*G2[s];
254     }
255     }
256    
257     OT_VECTEUR_4DD g2refg2=g2-g2_ref;
258     if(g1refg1==g2refg2)
259     {
260     identite.ajouter(id1);
261     identite.ajouter(id2);
262    
263     break;
264     }
265     }
266     }
267    
268    
269    
270    
271    
272    
273    
274    
275    
276    
277    
278    
279     /*
280    
281    
282    
283 souaissa 87 TPL_LISTE_ENTITE<int> lst1,lst2;
284     int nb_face_doublant=lst_fin.get_nb()/2;
285    
286     for(int r=0;r<nb_face_doublant;r++)
287     {
288     lst1.ajouter( lst_fin.get(2*r));
289     lst2.ajouter( lst_fin.get(2*r+1));
290     }
291    
292     for(int i=0;i<list1_final.get_nb();i++)
293     {
294     int num1= list1_final.get(i);
295     int num2= list2_final.get(i);
296     if(!lst1.est_dans_la_liste(num1))
297     {
298     identite.ajouter(num1);
299     identite.ajouter(num2);
300     }
301     }
302    
303     for(int r=0;r<nb_face_doublant;r++)
304     {
305     int num1= lst_fin.get(2*r);
306     int num2= lst_fin.get(2*r+1);
307     identite.ajouter(num1);
308     identite.ajouter(num2);
309     }
310 souaissa 99 */
311 souaissa 87 this->affecter_les_couleurs(1);
312    
313     }
314    
315    
316    
317     void VCT_COMPARAISON::compare_les_deux_geometries_vectoriellement()
318     {
319 souaissa 66 int nb_face1=mggeo1->get_nb_mg_face();
320     int nb_face2=mggeo2->get_nb_mg_face();
321 souaissa 87 similarite.vide();
322     for(int i=0;i<nb_face1; i++)
323     {
324     MG_FACE* face1=mggeo1->get_mg_face(i);
325     MG_SURFACE*surf1=face1->get_surface();
326     int id1=face1->get_id();
327     OT_TENSEUR tns1_face(4),tns1_surf(4);
328     OT_TENSEUR ttns1_face(4),ttns1_surf(4);
329     int nb_top1_pts= face1->get_vectorisation().get_nb_points();
330     int nb_geo1_pts= surf1->get_vectorisation().get_nb_points();
331 souaissa 66
332 souaissa 87 tns1_face=face1->get_vectorisation().calcule_tenseur_metrique();
333     tns1_surf=surf1->get_vectorisation().calcule_tenseur_metrique();
334 souaissa 66
335 souaissa 87 for(int j=0;j<nb_face2;j++)
336     {
337     MG_FACE* face2=mggeo2->get_mg_face(j);
338     MG_SURFACE*surf2=face2->get_surface();
339     int id2=face2->get_id();
340     OT_TENSEUR tns2_face(4),tns2_surf(4);
341     OT_TENSEUR ttns2_face(4),ttns2_surf(4);
342     int nb_top2_pts= face2->get_vectorisation().get_nb_points();
343     int nb_geo2_pts= surf2->get_vectorisation().get_nb_points();
344     tns2_face=face2->get_vectorisation().calcule_tenseur_metrique();
345     tns2_surf=surf2->get_vectorisation().calcule_tenseur_metrique();
346 souaissa 66
347 souaissa 87 if(nb_geo1_pts==nb_geo2_pts&&nb_top1_pts==nb_top2_pts)
348     {
349     if(tns1_face.est_til_equivalent(tns2_face))
350     {
351     if(tns1_surf.est_til_equivalent(tns2_surf))
352     {
353     similarite.ajouter(id1);
354     similarite.ajouter(id2);
355     }
356     }
357     }
358     }
359     }
360     this->affecter_les_couleurs(21);
361    
362     }
363    
364     void VCT_COMPARAISON::compare_les_deux_geometries_inertiellement()
365     {
366     int nb_face1=mggeo1->get_nb_mg_face();
367     int nb_face2=mggeo2->get_nb_mg_face();
368     ssimilarite.vide();
369     for(int i=0;i<nb_face1; i++)
370     {
371     MG_FACE* face1=mggeo1->get_mg_face(i);
372     MG_SURFACE*surf1=face1->get_surface();
373     int id1=face1->get_id();
374     OT_TENSEUR tns1_face(4),tns1_surf(4);
375     int nb_top1_pts= face1->get_vectorisation().get_nb_points();
376     int nb_geo1_pts= surf1->get_vectorisation().get_nb_points();
377    
378     tns1_face=face1->get_vectorisation().calcule_tenseur_inertie_base_locale();
379     tns1_surf=surf1->get_vectorisation().calcule_tenseur_inertie_base_locale();
380     vector<double2> ifac1; vector<double2>isurf1;
381     for(int r=0;r<4;r++)
382     {
383     ifac1.insert( ifac1.end(), tns1_face(r,r));
384     isurf1.insert( isurf1.end(), tns1_surf(r,r));
385     }
386    
387 souaissa 66 for(int j=0;j<nb_face2;j++)
388     {
389    
390     MG_FACE* face2=mggeo2->get_mg_face(j);
391 souaissa 74 MG_SURFACE*surf2=face2->get_surface();
392 souaissa 66 int id2=face2->get_id();
393 souaissa 74 OT_TENSEUR tns2_face(4),tns2_surf(4);
394     int nb_top2_pts= face2->get_vectorisation().get_nb_points();
395     int nb_geo2_pts= surf2->get_vectorisation().get_nb_points();
396 souaissa 87 tns2_face=face2->get_vectorisation().calcule_tenseur_inertie_base_locale();
397     tns2_surf=surf2->get_vectorisation().calcule_tenseur_inertie_base_locale();
398     vector<double2> ifac2; vector<double2> isurf2;
399     for(int r=0;r<4;r++)
400     {
401     ifac2.insert( ifac2.end(), tns2_face(r,r));
402     isurf2.insert( isurf2.end(), tns2_surf(r,r));
403     }
404 souaissa 66
405 souaissa 74 if(nb_geo1_pts==nb_geo2_pts&&nb_top1_pts==nb_top2_pts)
406 souaissa 66 {
407 souaissa 87 vector<unsigned int> indx1,indx2;
408     if(tns1_face.listes_equivalentes(ifac1,ifac2,indx1))
409 souaissa 66 {
410 souaissa 87 if(tns1_face.listes_equivalentes(isurf1,isurf2,indx2))
411     {
412     ssimilarite.ajouter(id1);
413     ssimilarite.ajouter(id2);
414     }
415 souaissa 66 }
416 souaissa 87 }
417 souaissa 66
418 souaissa 87 }
419 souaissa 66
420 souaissa 87 }
421 souaissa 66
422 souaissa 90 affecter_les_couleurs(22);
423 souaissa 87 }
424    
425 souaissa 90 void VCT_COMPARAISON::compare_une_geometrie_inertiellement(int modele)
426 souaissa 87 {
427 souaissa 99 TPL_LISTE_ENTITE<int> ssim_tmp;
428 souaissa 87
429 souaissa 90 MG_FILE *gst1;
430     MG_GEOMETRIE *mgeo1 ;
431     int laquelle;
432 souaissa 87
433 souaissa 90 switch(modele)
434     {
435     case 1:
436     {
437     gst1=gest1;
438     mgeo1=mggeo1;
439 souaissa 92 laquelle=31;
440 souaissa 90 break;
441     }
442     case 2:
443     {
444     gst1=gest2;
445     mgeo1=mggeo2;
446 souaissa 92 laquelle=32;
447 souaissa 90 break;
448     }
449 souaissa 87
450     }
451 souaissa 66
452 souaissa 90 int nb_face1=mgeo1->get_nb_mg_face();
453 souaissa 99
454 souaissa 90 for(int i=0;i<nb_face1; i++)
455 souaissa 87 {
456 souaissa 90 MG_FACE* face1=mgeo1->get_mg_face(i);
457 souaissa 87 MG_SURFACE*surf1=face1->get_surface();
458     int id1=face1->get_id();
459     OT_TENSEUR tns1_face(4),tns1_surf(4);
460     int nb_top1_pts= face1->get_vectorisation().get_nb_points();
461     int nb_geo1_pts= surf1->get_vectorisation().get_nb_points();
462 souaissa 66
463 souaissa 87 tns1_face=face1->get_vectorisation().calcule_tenseur_inertie_base_locale();
464     tns1_surf=surf1->get_vectorisation().calcule_tenseur_inertie_base_locale();
465     vector<double2> ifac1; vector<double2>isurf1;
466     for(int r=0;r<4;r++)
467     {
468     ifac1.insert( ifac1.end(), tns1_face(r,r));
469     isurf1.insert( isurf1.end(), tns1_surf(r,r));
470     }
471 souaissa 66
472 souaissa 90 for(int j=0;j<nb_face1;j++)
473 souaissa 87 {
474 souaissa 66
475 souaissa 90 MG_FACE* face2=mgeo1->get_mg_face(j);
476 souaissa 87 MG_SURFACE*surf2=face2->get_surface();
477     int id2=face2->get_id();
478     OT_TENSEUR tns2_face(4),tns2_surf(4);
479     int nb_top2_pts= face2->get_vectorisation().get_nb_points();
480     int nb_geo2_pts= surf2->get_vectorisation().get_nb_points();
481     tns2_face=face2->get_vectorisation().calcule_tenseur_inertie_base_locale();
482     tns2_surf=surf2->get_vectorisation().calcule_tenseur_inertie_base_locale();
483     vector<double2> ifac2; vector<double2> isurf2;
484     for(int r=0;r<4;r++)
485     {
486     ifac2.insert( ifac2.end(), tns2_face(r,r));
487     isurf2.insert( isurf2.end(), tns2_surf(r,r));
488     }
489 souaissa 66
490 souaissa 87 if(nb_geo1_pts==nb_geo2_pts&&nb_top1_pts==nb_top2_pts)
491     {
492     vector<unsigned int> indx1,indx2;
493     if(tns1_face.listes_equivalentes(ifac1,ifac2,indx1))
494     {
495     if(tns1_face.listes_equivalentes(isurf1,isurf2,indx2))
496     {
497 souaissa 99 ssim_tmp.ajouter(id1);
498     ssim_tmp.ajouter(id2);
499 souaissa 87 }
500     }
501     }
502 souaissa 66
503 souaissa 87 }
504    
505     }
506 souaissa 99 if (modele==1) ssim1=ssim_tmp;
507     if (modele==2) ssim2=ssim_tmp;
508    
509 souaissa 90 affecter_les_couleurs(laquelle);
510 souaissa 66 }
511    
512    
513    
514 souaissa 82
515 souaissa 87 TPL_LISTE_ENTITE<int> VCT_COMPARAISON::get_liste_des_identitees()
516     {
517     return identite;
518     }
519    
520 souaissa 99 TPL_LISTE_ENTITE<int> VCT_COMPARAISON::get_liste_des_simalarite_vectorielle(int type_comparais)
521 souaissa 87 {
522 souaissa 99 TPL_LISTE_ENTITE<int> lst_tmp;
523     switch ( type_comparais)
524     {
525     case 12: lst_tmp= similarite;
526     case 1: lst_tmp= sim1;
527     case 2: lst_tmp= sim2;
528     }
529     return lst_tmp;
530 souaissa 87 }
531    
532 souaissa 99 TPL_LISTE_ENTITE<int> VCT_COMPARAISON::get_liste_des_simalarite_inertielle(int type_comparais)
533 souaissa 87 {
534 souaissa 99 TPL_LISTE_ENTITE<int> lst_tmp;
535     switch ( type_comparais)
536     {
537     case 12: lst_tmp= ssimilarite;
538     case 1: lst_tmp= ssim1;
539     case 2: lst_tmp= ssim2;
540     }
541     return lst_tmp;
542 souaissa 87 }
543    
544    
545     void VCT_COMPARAISON::affecter_les_couleurs(int niveau)
546 souaissa 66 {
547 souaissa 87 randomize();
548     int nb_face_ident=similarite.get_nb()/2;
549     int nb_face_identt=ssimilarite.get_nb()/2;
550     int nb_face_iden=identite.get_nb()/2;
551     double val;
552     TPL_LISTE_ENTITE<int> lst;
553     TPL_LISTE_ENTITE<double> lst_val;
554     int num1,num2,num1_avant ;
555 souaissa 90 if (niveau==1) //pour afficher les identites entre le deux modèles
556 souaissa 87 {
557     for(int i=0;i< nb_face_iden;i++)
558     {
559     num1=identite.get(2*i) ;
560     num2=identite.get(2*i+1) ;
561     if(i>0) num1_avant= identite.get(2*(i-1));
562     MG_FACE* face1=mggeo1->get_mg_faceid(num1);
563     MG_FACE* face2=mggeo2->get_mg_faceid(num2);
564    
565     if(i==0)
566     {
567     choisir_une_couleur(val);
568     while(lst_val.est_dans_la_liste(val))
569     {
570     choisir_une_couleur(val);
571     }
572     face1->ajouter_ccf("Cc",val);
573     face2->ajouter_ccf("Cc",val);
574     lst_val.ajouter(val);
575     }
576    
577     if(i>0)
578     {
579     if(num1!=num1_avant)
580     {
581     choisir_une_couleur(val);
582     while(lst_val.est_dans_la_liste(val))
583     {
584     choisir_une_couleur(val);
585     }
586     face1->ajouter_ccf("Cc",val);
587     face2->ajouter_ccf("Cc",val);
588     lst_val.ajouter(val);
589     }
590     else{
591     face2->ajouter_ccf("Cc",val);
592     }
593    
594     }
595     }
596    
597     }
598    
599 souaissa 99 if(niveau==21||niveau==22||niveau==23) //pour afficher la similarite entre le deux modèle vectoriellement ou inertiellement
600 souaissa 90 {
601     TPL_LISTE_ENTITE<int> simu;
602     if(niveau==21)simu=similarite;
603     if(niveau==22) simu=ssimilarite;
604 souaissa 99 if(niveau==23) simu=sim_double;
605 souaissa 90 TPL_LISTE_ENTITE<int> llst1;
606     TPL_LISTE_ENTITE<int> llst2;
607     int nb_face_sim=simu.get_nb()/2.;
608     for(int i=0;i< nb_face_sim;i++)
609     {
610     TPL_LISTE_ENTITE<int> lst1;
611     TPL_LISTE_ENTITE<int> lst2;
612     TPL_LISTE_ENTITE<int> llst3;
613     num1=simu.get(2*i) ;
614     if(!llst1.est_dans_la_liste(num1))
615 souaissa 87 {
616 souaissa 90 num2=simu.get(2*i+1) ;
617     lst1.ajouter(num1);
618     lst2.ajouter(num2);
619     llst1.ajouter(num1);
620     llst2.ajouter(num2);
621     for(int j=1;j< nb_face_sim;j++)
622     {
623     int Num1=simu.get(2*j) ;
624     int Num2=simu.get(2*j+1) ;
625 souaissa 87
626 souaissa 90 if(num1==Num1)
627     {
628     llst3.ajouter(Num2);
629     }
630     if(num2==Num2||llst3.est_dans_la_liste(Num2))
631     {
632     if(!lst1.est_dans_la_liste(Num1)) {
633     lst1.ajouter(Num1);
634     llst1.ajouter(Num1); }
635     if(!lst2.est_dans_la_liste(Num2)) {
636     lst2.ajouter(Num2);
637     llst2.ajouter(Num2); }
638     }
639 souaissa 87
640     }
641    
642 souaissa 90 choisir_une_couleur(val);
643     while(lst_val.est_dans_la_liste(val))
644     {
645 souaissa 87 choisir_une_couleur(val);
646 souaissa 90 }
647     lst_val.ajouter(val);
648     int nb1=lst1.get_nb();
649     int nb2=lst2.get_nb();
650     for(int i=0;i<nb1;i++)
651     {
652     int n1=lst1.get(i);
653     MG_FACE* face1=mggeo1->get_mg_faceid(n1);
654     face1->ajouter_ccf("Cc",val);
655 souaissa 87 }
656 souaissa 90 for(int i=0;i<nb2;i++)
657     {
658     int n2=lst2.get(i);
659     MG_FACE* face2=mggeo2->get_mg_faceid(n2);
660     face2->ajouter_ccf("Cc",val);
661     }
662    
663     }
664     }
665 souaissa 87
666    
667     }
668    
669 souaissa 92 if(niveau== 31||niveau==32) //pour afficher la similarite dans le premier modèle ou le second modele
670 souaissa 87 {
671    
672 souaissa 90 MG_GEOMETRIE *mgeo1 ;
673     int laquelle;
674 souaissa 87
675 souaissa 90 switch(niveau)
676     {
677     case 31:
678     {
679     mgeo1=mggeo1;
680     laquelle=31;
681     break;
682 souaissa 87 }
683 souaissa 90 case 32:
684     {
685     mgeo1=mggeo2;
686     laquelle=32;
687     break;
688     }
689    
690 souaissa 87 }
691    
692 souaissa 90 for(int i=0;i< nb_face_identt;i++)
693 souaissa 87 {
694 souaissa 90 num1=ssimilarite.get(2*i) ;
695     num2=ssimilarite.get(2*i+1) ;
696 souaissa 87
697 souaissa 90 if(i>0) num1_avant= ssimilarite.get(2*(i-1));
698     MG_FACE* face1=mgeo1->get_mg_faceid(num1);
699     MG_FACE* face2=mgeo1->get_mg_faceid(num2);
700     if(!lst.est_dans_la_liste(num2))
701     {
702 souaissa 87 if(i==0)
703     {
704     choisir_une_couleur(val);
705 souaissa 90 while(lst_val.est_dans_la_liste(val))
706     {
707     choisir_une_couleur(val);
708     }
709 souaissa 87 face1->ajouter_ccf("Cc",val);
710 souaissa 90 if(num1!=num2) face2->ajouter_ccf("Cc",val); lst.ajouter(num2);
711     lst_val.ajouter(val);
712 souaissa 87 }
713    
714     if(i>0)
715     {
716     if(num1!=num1_avant)
717     {
718 souaissa 90 choisir_une_couleur(val);
719     while(lst_val.est_dans_la_liste(val))
720     {
721 souaissa 87 choisir_une_couleur(val);
722 souaissa 90 }
723     face1->ajouter_ccf("Cc",val);
724     if(num1!=num2) face2->ajouter_ccf("Cc",val); lst.ajouter(num2);
725     lst_val.ajouter(val);
726 souaissa 87 }
727     else{
728 souaissa 90 if(num1!=num2) face2->ajouter_ccf("Cc",val); lst.ajouter(num2);
729 souaissa 87 }
730    
731     }
732 souaissa 90 }
733 souaissa 87 }
734    
735    
736     }
737    
738    
739     }
740    
741    
742     void VCT_COMPARAISON::choisir_une_couleur(double& val)
743     {
744     randomize();
745    
746     unsigned char r=rand() % 255;
747     unsigned char g=rand() % 255;
748     unsigned char b=rand() % 255;
749     val=0.;
750     unsigned char* p =(unsigned char*)&val;
751    
752     *p=r;
753     p++;*p=g;
754     p++;*p=b;
755    
756     }
757    
758 souaissa 99 /*
759     void VCT_COMPARAISON::trouve_la_face_de_reference(TPL_LISTE_ENTITE<int>&lst_sim_inert)
760     {
761     vector<OT_VECTEUR_4DD> vct_bary;
762     OT_VECTEUR_4DD VCT_NUL(0.,0.,0.,0.);
763     doubele2 ZERO=0.;
764     int nbsim=nb_sim.get_nb();
765     int *t=new int [nbsim];
766     int *tt=new int [nbsim];
767     for(int i=0;i<nbsim;i++)
768     {
769     t[i]= nb_sim.get(i);
770     tt[i]=nb_sim.get(i);
771     }
772     int pos_min=0;
773     int min=t[0];
774     for (int i=1;i<nbsim;i++)
775     {
776     if(t[i]<min&&t[i]>0)
777     {
778     min=t[i];
779     pos_min =i;
780     }
781     }
782     sort (tt,tt+nbsim);
783     for (int i=1;i<nbsim;i++)
784     {
785     if(t[i]>min)
786     {
787     max=tt[i];
788     break;
789     }
790     }
791     int pos_max;
792     for (int i=0;i<nbsim;i++)
793     {
794     if(t[i]==max)
795     {
796     pos_max =i;
797     }
798     }
799 souaissa 87
800 souaissa 99 int num1= lst_sim_inert(2*i);
801     MG_FACE* face1=mggeo1->get_mg_face(pos_min);
802     OT_VECTEUR_4DD G1=face1->get_vectorisation().calcule_barycentre();
803 souaissa 87
804    
805    
806    
807    
808    
809 souaissa 99
810    
811    
812    
813     int nb_face_sim=lst_sim_inert.get_nb()/2;
814     for(int i=0;i<nb_face_sim;i++)
815     {
816     int num1= lst_sim_inert(2*i);
817     MG_FACE* face1=mggeo1->get_mg_faceid(num1);
818     OT_VECTEUR_4DD G1=face1->get_vectorisation().calcule_barycentre();
819    
820     for(int j=0;j<nb_face_sim;j++)
821     {
822     int num2= lst_sim_inert(2*j+1);
823     MG_FACE* face2=mggeo2->get_mg_faceid(num2);
824     OT_VECTEUR_4DD G2=face2->get_vectorisation().calcule_barycentre();
825     OT_VECTEUR_4DD G1G2=G2-G1;
826    
827     double2 norm_au_carre=(G1G2[0]*G1G2[0])+(G1G2[1]*G1G2[1])+(G1G2[2]*G1G2[2])+(G1G2[3]*G1G2[3]);
828     double2 norm=norm_au_carre^0.5;
829    
830     if(G1G2==VCT_NUL)
831     lst_vecteurs.insert(lst_vecteurs.end(),VCT_NUL);
832    
833     if(norm!=ZERO)
834     {
835     G1G2=1./norm*G1G2;
836     lst_vecteurs.insert(lst_vecteurs.end(),G1G2);
837     }
838    
839     }
840    
841     }
842    
843    
844     }
845    
846     */
847     void VCT_COMPARAISON::trouve_face_de_reference(int &face_ref1,int &face_ref2)// ,TPL_LISTE_ENTITE<int>& list
848     {
849     //compare_les_deux_geometries();
850     int nb_simdble=sim_double.get_nb()/2 ;
851    
852     int num1,num2 ;
853    
854    
855 souaissa 87 OT_VECTEUR_4DD Dv,Dv1,Dv2,G1,G2,g1g2;
856     OT_TENSEUR V(4),V1(4),V2(4);
857    
858    
859 souaissa 99 int nbsim=nb_sim.get_nb();
860     int *t=new int [nbsim];
861     int *tt=new int [nbsim];
862     for(int i=0;i<nbsim;i++)
863     {
864     t[i]= nb_sim.get(i);
865     tt[i]=nb_sim.get(i);
866     }
867     int pos_min,pos_max;
868     int min,max;
869     int trouve=0;
870     sort (tt,tt+nbsim);
871     for (int i=0;i<nbsim;i++)
872     {
873     if(tt[i]>0)
874     {
875     min=tt[i];
876     break;
877     }
878     }
879 souaissa 87
880 souaissa 99 for (int i=0;i<nbsim;i++)
881     {
882     if(tt[i]>min)
883     {
884     max=tt[i];
885     trouve=1;
886     break;
887     }
888 souaissa 87 }
889 souaissa 99 for (int i=0;i<nbsim;i++)
890     {
891     if(t[i]==min)
892     {
893     pos_min=i;
894     break;
895     }
896     }
897     for (int i=0;i<nbsim;i++)
898     {
899     if(t[i]==max&&i!=pos_min)
900     {
901     pos_max=i;
902     break;
903     }
904     }
905     if(!trouve)
906     {
907     pos_max=pos_min+1;
908     max= t[pos_max];
909 souaissa 87 }
910 souaissa 99
911    
912    
913    
914    
915    
916 souaissa 87 OT_VECTEUR_4DD g1_ref,g2_ref;
917 souaissa 99 MG_FACE* face1_ref=mggeo1->get_mg_face(pos_min);
918     int id1=face1_ref->get_id();
919 souaissa 87 face1_ref->get_vectorisation().calcule_axes_dinertie(Dv1,V1);
920     G1= face1_ref->get_vectorisation().calcule_barycentre();
921    
922     for(int r=0;r<4;r++) {
923     for(int s=0;s<4;s++) {
924     g1_ref[r]= g1_ref[r]+V1(s,r)*G1[s];
925     }
926     }
927    
928    
929 souaissa 99 MG_FACE* face12_ref=mggeo1->get_mg_face(pos_max);
930     face12_ref->get_vectorisation().calcule_axes_dinertie(Dv2,V2);
931     int id2=face12_ref->get_id();
932     G2= face12_ref->get_vectorisation().calcule_barycentre();
933 souaissa 87 for(int r=0;r<4;r++) {
934     for(int s=0;s<4;s++) {
935 souaissa 99 g2_ref[r]= g2_ref[r]+V1(s,r)*G2[s];
936 souaissa 87 }
937     }
938    
939 souaissa 99 OT_VECTEUR_4DD g12_ref= g2_ref -g1_ref;
940    
941    
942 souaissa 87 OT_VECTEUR_4DD g1refg1,g2refg2;
943 souaissa 99 TPL_LISTE_ENTITE<int> lst1,lst2;
944     for(int k=0;k<nb_simdble;k++)
945     {
946     if(sim_double.get(2*k)==id1)
947     lst1.ajouter( sim_double.get(2*k+1));
948     if(sim_double.get(2*k)==id2)
949     lst2.ajouter(sim_double.get(2*k+1));
950     }
951 souaissa 87
952 souaissa 99
953     trouve=0;
954    
955     for(int i=0;i<lst1.get_nb();i++)
956 souaissa 87 {
957 souaissa 99
958     int num1=lst1.get(i);
959     OT_VECTEUR_4DD g1,G1;
960     MG_FACE* face1=mggeo2->get_mg_faceid(num1);
961     face1->get_vectorisation().calcule_axes_dinertie(Dv2,V2);
962 souaissa 87 G1= face1->get_vectorisation().calcule_barycentre();
963     for(int r=0;r<4;r++) {
964     for(int s=0;s<4;s++) {
965 souaissa 99 g1[r]= g1[r]+V2(s,r)*G1[s];
966 souaissa 87 }
967     }
968    
969 souaissa 99 // g1refg1=g1-g1_ref;
970     // num2=list.get(2*i+1);
971     for(int j=0;j<lst2.get_nb();j++)
972     {
973     int num2=lst2.get(j);
974 souaissa 87 OT_VECTEUR_4DD g2;
975     MG_FACE* face2=mggeo2->get_mg_faceid(num2);
976     G2= face2->get_vectorisation().calcule_barycentre();
977     for(int r=0;r<4;r++) {
978     for(int s=0;s<4;s++) {
979     g2[r]= g2[r]+V2(s,r)*G2[s];
980     }
981     }
982    
983 souaissa 99 OT_VECTEUR_4DD g2g1=g2-g1;
984     if(g2g1==g12_ref)
985 souaissa 87 {
986 souaissa 99 // lst_fin.ajouter(num1);
987     // lst_fin.ajouter(num2);
988     face_ref1=id1;
989     face_ref2=num1;
990     trouve=1;
991     break;
992 souaissa 87 }
993 souaissa 99 }
994     if(trouve) break;
995 souaissa 87 }
996    
997 souaissa 100 delete [] t;
998     delete [] tt;
999 souaissa 87
1000     /*
1001    
1002     int trouve=-1;
1003     TPL_LISTE_ENTITE<int> vct_ident;
1004     for(int i=0;i<vctbary1.size();i++)
1005     {
1006     OT_VECTEUR_4DD Vg1= vctbary1[i];
1007     for(int j=0;j<vctbary1.size();j++)
1008     {
1009     OT_VECTEUR_4DD Vg2= vctbary2[j];
1010     if(Vg1==Vg2)
1011     {
1012     face_ref1=lst1g1g2.get(2*i);
1013     face_ref2=lst2g1g2.get(2*j);
1014     trouve=1;
1015     break;
1016     }
1017     }
1018     if (trouve>0) break;
1019     }
1020     */
1021    
1022    
1023     }
1024    
1025    
1026    
1027     std::ostream& operator <<(std::ostream& os,const VCT_COMPARAISON& vct_cmp)
1028     {
1029     vct_cmp.enregistrer(os) ;
1030     return os;
1031     }
1032    
1033    
1034    
1035    
1036    
1037     void VCT_COMPARAISON::enregistrer(ostream& os)
1038     {
1039 souaissa 66 os<<"COMPARAISON VECTORIELLE DE DEUX GEOMETRIES"<<endl;
1040     int nb_cl=2;
1041 souaissa 87 int nb_lg=similarite.get_nb()/2;
1042 souaissa 66 os<<"FACES_PREMIERE_GEOMETRIE : ";
1043     for(int j=0;j<nb_lg;j++)
1044 souaissa 87 os<<setw(5)<<similarite.get(j*nb_cl+0);
1045 souaissa 66 os<<endl;
1046     os<<"FACES_SECONDE_GEOMETRIE : ";
1047     for(int j=0;j<nb_lg;j++)
1048 souaissa 87 os<<setw(5)<<similarite.get(j*nb_cl+1);
1049 souaissa 66 os<<endl;
1050    
1051 souaissa 87 //affecter_une_couleur();
1052 souaissa 82
1053    
1054 souaissa 66 }