37 #pragma package(smart_init)
71 affiche((
char*)
" Recherche de similarité");
78 affiche((
char*)
" Similar faces research");
87 sprintf(mess,
" Nombre de paires de faces similaires : %d",
similarite.
get_nb()/2);
89 affiche((
char*)
" Recherche d'identite");
98 affiche((
char*)
" Identical faces reseach");
107 sprintf(mess,
" Nombre de paires de faces identiques : %d",
identite.
get_nb()/2);
109 affiche((
char*)
" Recherche de localisation");
116 sprintf(mess,
" Nunber of identical faces : %d",
identite.
get_nb()/2);
118 affiche((
char*)
" Localized faces research");
140 sprintf(mess,
" Nombre de paires de faces localisées : %d",
localise.
get_nb()/2);
142 affiche((
char*)
" Recherche des arêtes et des sommets correspondants");
162 sprintf(mess,
" Number of localized faces : %d",
localise.
get_nb()/2);
164 affiche((
char*)
" Vertices and egdes correspondense research ");
174 sprintf(mess,
" Nombre de paires de sommets localisés : %d",
sommetparfait);
176 sprintf(mess,
" Nombre de paires d'aretes localisées : %d",
areteparfait);
185 sprintf(mess,
" Number of localized vertices : %d",
sommetparfait);
187 sprintf(mess,
" Number of localized edges : %d",
areteparfait);
193 if (cpu!=NULL) cpu->
ajouter_etape(
"Modifications partielles");
197 sprintf(mess,
" Nombre de paires de sommets : %d",
sommetpartiel);
199 sprintf(mess,
" Nombre de paires d'aretes : %d",
aretepartiel);
201 sprintf(mess,
" Nombre de paires de faces : %d",
facepartiel);
209 sprintf(mess,
" Partial modification vectices : %d",
sommetpartiel);
211 sprintf(mess,
" Partial modification edges : %d",
aretepartiel);
213 sprintf(mess,
" Partial modification faces : %d",
facepartiel);
227 for (
int i=0;i<nb_face1; i++)
236 for (
int j=0;j<nb_face2;j++)
244 if (nb_geo1_pts==nb_geo2_pts&&nb_top1_pts==nb_top2_pts)
263 for (
int i=0;i<nbpaire;i++)
295 int *paire=
new int[nbpaire];
296 for (
int i=0;i<nbpaire;i++)
298 for (
int ident=0;ident<nbpaire;ident++)
300 if (paire[ident]==1)
continue;
305 std::vector<OT_TENSEUR> list;
307 int nbessai=list.size()/2;
308 for (
int essai=0;essai<nbessai;essai++)
311 int *pairetmp=
new int[nbpaire];
312 for (
int i=0;i<nbpaire;i++)
320 for (
int i=0;i<nbpaire;i++)
326 trans1=trans1*tnsref1;
332 inerloc2prime=inerloc2prime*(*iner2);
333 inerloc2prime=inerloc2prime*tns2;
336 baryloc1=tnsrefinv1*baryloc1;
339 baryloc2=tnsrefinv2*baryloc2;
341 if (baryloc1==baryloc2)
350 int n=localisetmp.
get_nb();
352 for (
int i=0;i<n;i++)
354 for (
int i=0;i<nbpaire;i++)
355 paire[i]=pairetmp[i];
384 for (
int i=0;i<nbpaire;i++)
400 std::map<OT_VECTEUR_3DD,MG_SOMMET*,lessOT_VECTEUR_3DD > tabsom1;
401 std::map<OT_VECTEUR_3DD,MG_SOMMET*,lessOT_VECTEUR_3DD > tabsom2;
402 std::multimap<OT_VECTEUR_3DD,MG_ARETE*,lessOT_VECTEUR_3DD > tabare1;
403 std::multimap<OT_VECTEUR_3DD,MG_ARETE*,lessOT_VECTEUR_3DD > tabare2;
405 for (
int i=0;i<nb_boucle;i++)
409 for (
int j=0;j<nb_arete;j++)
413 std::pair<OT_VECTEUR_3DD,MG_ARETE*> tmp(*bary,are);
419 std::pair<OT_VECTEUR_3DD,MG_SOMMET*> tmp2(vec,som1);
420 tabsom1.insert(tmp2);
424 std::pair<OT_VECTEUR_3DD,MG_SOMMET*> tmp3(vec2,som2);
425 tabsom1.insert(tmp3);
429 for (
int j=0;j<nb_arete;j++)
437 barytrans=barytrans*w;
438 std::pair<OT_VECTEUR_3DD,MG_ARETE*> tmp(barytrans,are);
446 w=UN/vectranshomo.
get_w();
448 std::pair<OT_VECTEUR_3DD,MG_SOMMET*> tmp2(vectrans,som1);
449 tabsom2.insert(tmp2);
455 w=UN/vectranshomo2.
get_w();
456 vectrans2=vectrans2*w;
457 std::pair<OT_VECTEUR_3DD,MG_SOMMET*> tmp3(vectrans2,som2);
458 tabsom2.insert(tmp3);
461 std::multimap<OT_VECTEUR_3DD,MG_ARETE*,lessOT_VECTEUR_3DD >::iterator it1;
462 std::multimap<OT_VECTEUR_3DD,MG_ARETE*,lessOT_VECTEUR_3DD >::iterator it2;
465 if (it1==tabare1.end()) ok=1;
476 it2=tabare2.find(bary1);
480 if (it2==tabare2.end()) ok2=1;
485 if (!(bary2==bary1)) ok2=1;
494 if (nb_top1_pts==nb_top2_pts)
495 if (nb_geo1_pts==nb_geo2_pts)
518 if (it1==tabare1.end()) ok=1;
522 std::map<OT_VECTEUR_3DD,MG_SOMMET*,lessOT_VECTEUR_3DD >::iterator its1;
523 std::map<OT_VECTEUR_3DD,MG_SOMMET*,lessOT_VECTEUR_3DD >::iterator its2;
524 its1=tabsom1.begin();
529 its2=tabsom2.find((*its1).first);
530 if (its2!=tabsom2.end())
544 if (its1==tabsom1.end()) ok=1;
555 std::map<OT_VECTEUR_3DD,MG_SOMMET*,lessOT_VECTEUR_3DD > tabsom1;
556 std::map<OT_VECTEUR_3DD,MG_SOMMET*,lessOT_VECTEUR_3DD > tabsom2;
557 std::multimap<int,MG_ARETE* > tabare1;
558 std::multimap<int,MG_ARETE* > tabare2;
559 std::multimap<int,MG_FACE* > tabface1;
560 std::multimap<int,MG_FACE*> tabface2;
562 LISTE_MG_SOMMET::iterator itsom;
563 LISTE_MG_ARETE::iterator itare;
564 LISTE_MG_FACE::iterator itface;
571 som->get_point()->evaluer(xyz);
573 std::pair<OT_VECTEUR_3DD,MG_SOMMET*> tmp(vec,som);
583 int typecrb=are->get_courbe()->get_type_geometrique(param);
584 std::pair<int,MG_ARETE*> tmp(typecrb,are);
594 int typesurf=face->get_surface()->get_type_geometrique(param);
595 std::pair<int,MG_FACE*> tmp(typesurf,face);
596 tabface1.insert(tmp);
605 som->get_point()->evaluer(xyz);
611 std::pair<OT_VECTEUR_3DD,MG_SOMMET*> tmp(vectrans,som);
621 int typecrb=are->get_courbe()->get_type_geometrique(param);
622 std::pair<int,MG_ARETE*> tmp(typecrb,are);
632 int typesurf=face->get_surface()->get_type_geometrique(param);
633 std::pair<int,MG_FACE*> tmp(typesurf,face);
634 tabface2.insert(tmp);
637 std::map<OT_VECTEUR_3DD,MG_SOMMET*,lessOT_VECTEUR_3DD >::iterator its1;
638 std::map<OT_VECTEUR_3DD,MG_SOMMET*,lessOT_VECTEUR_3DD >::iterator its2;
639 its1=tabsom1.begin();
641 if (tabsom1.size()==0) ok=1;
644 its2=tabsom2.find((*its1).first);
645 if (its2!=tabsom2.end())
654 if (its1==tabsom1.end()) ok=1;
656 std::multimap<int,MG_ARETE* >::iterator ita1;
657 std::multimap<int,MG_ARETE* >::iterator ita2;
658 ita1=tabare1.begin();
660 if (tabare1.size()==0) ok=1;
664 int typecrb1=(*ita1).first;
668 ita2=tabare2.find(typecrb1);
672 if (ita2==tabare2.end()) ok2=1;
676 int typecrb2=(*ita2).first;
677 if (!(typecrb2==typecrb1)) ok2=1;
683 if (nb_geo1_pts==nb_geo2_pts)
702 if (ita1==tabare1.end()) ok=1;
705 std::multimap<int,MG_FACE* >::iterator itf1;
706 std::multimap<int,MG_FACE* >::iterator itf2;
707 itf1=tabface1.begin();
709 if (tabface1.size()==0) ok=1;
713 int typefac1=(*itf1).first;
717 itf2=tabface2.find(typefac1);
721 if (itf2==tabface2.end()) ok2=1;
725 int typefac2=(*itf2).first;
726 if (typefac1!=typefac2) ok2=1;
732 if (nb_geo1_pts==nb_geo2_pts)
751 if (itf1==tabface1.end()) ok=1;
753 for (its1=tabsom1.begin();its1!=tabsom1.end();its1++)
758 for (its1=tabsom2.begin();its1!=tabsom2.end();its1++)
763 for (ita1=tabare1.begin();ita1!=tabare1.end();ita1++)
768 for (ita1=tabare2.begin();ita1!=tabare2.end();ita1++)
773 for (itf1=tabface1.begin();itf1!=tabface1.end();itf1++)
778 for (itf1=tabface2.begin();itf1!=tabface2.end();itf1++)
790 double xyz1[3],xyz2[3],xyz3[3],xyz[3];
825 for (
int i=0;i<3;i++)
826 for (
int j=0;j<3;j++)
888 t1(0,3)=bary1.
get_x();
889 t1(1,3)=bary1.
get_y();
890 t1(2,3)=bary1.
get_z();
905 t2(0,3)=bary2.
get_x();
906 t2(1,3)=bary2.
get_y();
907 t2(2,3)=bary2.
get_z();
921 double uvproj1[2],xyzproj1[3];
922 ot.
projete(xyz1,faceref1,uvproj1,xyzproj1);
926 normal12[0]=normal1[0];
927 normal12[1]=normal1[1];
928 normal12[2]=normal1[2];
936 for (
int i=0;i<3;i++)
939 veci[0]=(*axe1)(0,i);
940 veci[1]=(*axe1)(1,i);
941 veci[2]=(*axe1)(2,i);
943 if (
f2abs(ps)>limit1)
946 if (ps<zero) signe13=-1;
964 if ((*inertie_base_locale1)(n11,n11)<(*inertie_base_locale1)(n12,n12)) {
970 OT_VECTEUR_3DD x13((*axe1)(0,n13)*signe13,(*axe1)(1,n13)*signe13,(*axe1)(2,n13)*signe13);
972 (tnsref1)(0,0)=x11.
get_x();
973 (tnsref1)(1,0)=x11.get_y();
974 (tnsref1)(2,0)=x11.get_z();
975 (tnsref1)(0,1)=x12.
get_x();
976 (tnsref1)(1,1)=x12.
get_y();
977 (tnsref1)(2,1)=x12.
get_z();
978 (tnsref1)(0,2)=x13.
get_x();
979 (tnsref1)(1,2)=x13.
get_y();
980 (tnsref1)(2,2)=x13.
get_z();
982 if ((*inertie_base_locale1)(n11,n11)==(*inertie_base_locale1)(n12,n12)) nbtest1=2;
983 for (
int test1=0;test1<nbtest1;test1++)
989 (tnsref1)(0,0)=x11.
get_x();
990 (tnsref1)(1,0)=x11.get_y();
991 (tnsref1)(2,0)=x11.get_z();
992 (tnsref1)(0,1)=x12.
get_x();
993 (tnsref1)(1,1)=x12.
get_y();
994 (tnsref1)(2,1)=x12.
get_z();
995 (tnsref1)(0,2)=x13.
get_x();
996 (tnsref1)(1,2)=x13.
get_y();
997 (tnsref1)(2,2)=x13.
get_z();
1002 int xp1=0,yp1=0,xn1=0,yn1=0;
1003 for (
int i=0;i<nbpt1;i++)
1007 point=point-(*bary1);
1009 if (point.get_x()>zero)
1011 bary1xp=bary1xp+point;
1014 if (point.get_x()<zero)
1016 bary1xn=bary1xn+point;
1019 if (point.get_y()>zero)
1021 bary1yp=bary1yp+point;
1024 if (point.get_y()<zero)
1026 bary1xn=bary1xn+point;
1030 bary1xp=bary1xp/xp1;
1031 bary1xn=bary1xn/xn1;
1032 bary1yp=bary1yp/yp1;
1033 bary1yp=bary1yp/yn1;
1037 double uvproj2[2],xyzproj2[3];
1038 ot.
projete(xyz2,faceref2,uvproj2,xyzproj2);
1042 normal22[0]=normal2[0];
1043 normal22[1]=normal2[1];
1044 normal22[2]=normal2[2];
1052 for (
int i=0;i<3;i++)
1055 veci[0]=(*axe2)(0,i);
1056 veci[1]=(*axe2)(1,i);
1057 veci[2]=(*axe2)(2,i);
1059 if (
f2abs(ps)>limit2)
1062 if (ps<zero) signe23=-1;
1080 if ((*inertie_base_locale2)(n21,n21)<(*inertie_base_locale2)(n22,n22)) {
1085 OT_VECTEUR_3DD x21((*axe2)(0,n21),(*axe2)(1,n21),(*axe2)(2,n21));
1086 OT_VECTEUR_3DD x23((*axe2)(0,n23)*signe23,(*axe2)(1,n23)*signe23,(*axe2)(2,n23)*signe23);
1088 (tnsref2)(0,0)=x21.
get_x();
1089 (tnsref2)(1,0)=x21.get_y();
1090 (tnsref2)(2,0)=x21.get_z();
1091 (tnsref2)(0,1)=x22.
get_x();
1092 (tnsref2)(1,1)=x22.
get_y();
1093 (tnsref2)(2,1)=x22.
get_z();
1094 (tnsref2)(0,2)=x23.
get_x();
1095 (tnsref2)(1,2)=x23.
get_y();
1096 (tnsref2)(2,2)=x23.
get_z();
1098 if ((*inertie_base_locale2)(n21,n21)==(*inertie_base_locale2)(n22,n22)) nbtest1=0;
1099 for (
int test2=0;test2<nbtest2;test2++)
1103 OT_VECTEUR_3DD x21((*axe1)(0,n22),(*axe1)(1,n22),(*axe1)(2,n22));
1105 (tnsref2)(0,0)=x21.
get_x();
1106 (tnsref2)(1,0)=x21.get_y();
1107 (tnsref2)(2,0)=x21.get_z();
1108 (tnsref2)(0,1)=x22.
get_x();
1109 (tnsref2)(1,1)=x22.
get_y();
1110 (tnsref2)(2,1)=x22.
get_z();
1111 (tnsref2)(0,2)=x23.
get_x();
1112 (tnsref2)(1,2)=x23.
get_y();
1113 (tnsref2)(2,2)=x23.
get_z();
1118 int xp2=0,yp2=0,xn2=0,yn2=0;
1119 for (
int i=0;i<nbpt2;i++)
1123 point=point-(*bary2);
1125 if (point.get_x()>zero)
1127 bary2xp=bary2xp+point;
1130 if (point.get_x()<zero)
1132 bary2xn=bary2xn+point;
1135 if (point.get_y()>zero)
1137 bary2yp=bary2yp+point;
1140 if (point.get_y()<zero)
1142 bary2xn=bary2xn+point;
1146 bary2xp=bary2xp/xp2;
1147 bary2xn=bary2xn/xn2;
1148 bary2yp=bary2yp/yp2;
1149 bary2yp=bary2yp/yn2;
1151 if ((bary2xp==bary1xp) && (bary2xn==bary1xn) && (bary2yp==bary1yp) && (bary2yn==bary1yn))
1153 list.insert(list.end(),tnsref1);
1154 list.insert(list.end(),tnsref2);
1162 tnsref2(0,0)=zero-tnsref2(0,0);
1163 tnsref2(1,0)=zero-tnsref2(1,0);
1164 tnsref2(2,0)=zero-tnsref2(2,0);
1165 tnsref2(0,1)=zero-tnsref2(0,1);
1166 tnsref2(1,1)=zero-tnsref2(1,1);
1167 tnsref2(2,1)=zero-tnsref2(2,1);
1170 xp2=0,yp2=0,xn2=0,yn2=0;
1171 for (
int i=0;i<nbpt2;i++)
1175 point=point-(*bary2);
1177 if (point.get_x()>zero)
1179 bary2xp=bary2xp+point;
1182 if (point.get_x()<zero)
1184 bary2xn=bary2xn+point;
1187 if (point.get_y()>zero)
1189 bary2yp=bary2yp+point;
1192 if (point.get_y()<zero)
1194 bary2xn=bary2xn+point;
1198 bary2xp=bary2xp/xp2;
1199 bary2xn=bary2xn/xn2;
1200 bary2yp=bary2yp/yp2;
1201 bary2yp=bary2yp/yn2;
1202 if ((bary2xp==bary1xp) && (bary2xn==bary1xn) && (bary2yp==bary1yp) && (bary2yn==bary1yn))
1204 list.insert(list.end(),tnsref1);
1205 list.insert(list.end(),tnsref2);