ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/comparaison/src/vct_comparaison.cpp
Revision: 102
Committed: Mon May 26 11:51:43 2008 UTC (16 years, 11 months ago) by francois
Original Path: magic/lib/vectorisation/vectorisation/src/vct_comparaison.cpp
File size: 28632 byte(s)
Log Message:
mise a jour linux des versions lib

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