MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
mg_geometrie_outils.cpp
Aller à la documentation de ce fichier.
1 //####//------------------------------------------------------------
2 //####//------------------------------------------------------------
3 //####// MAGiC
4 //####// Jean Christophe Cuilliere et Vincent FRANCOIS
5 //####// Departement de Genie Mecanique - UQTR
6 //####//------------------------------------------------------------
7 //####// MAGIC est un projet de recherche de l equipe ERICCA
8 //####// du departement de genie mecanique de l Universite du Quebec a Trois Rivieres
9 //####// http://www.uqtr.ca/ericca
10 //####// http://www.uqtr.ca/
11 //####//------------------------------------------------------------
12 //####//------------------------------------------------------------
13 //####//
14 //####// mg_geometrie_outils.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:53 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 #include "gestionversion.h"
23 #include "mg_geometrie_outils.h"
24 
25 
26 
27 
28 
30 {
31 }
32 
34 {
35 }
36 
38 {
39  while (lstsegfrontadetruire.get_nb()!=0)
40  {
43  delete seg;
44  }
45  while (tabquad.size()!=0)
46  {
47  std::map <long,TPL_QUADTREE<MG_SEGMENT_FRONTIERE*,MG_SEGMENT_FRONTIERE*> *,std::less<long> >::iterator it=tabquad.begin();
49  delete quad;
50  tabquad.erase(it);
51  }
52  while (tabseg.size()!=0)
53  {
54  std::map <long,TPL_LISTE_ENTITE<MG_SEGMENT_FRONTIERE*>*,std::less<long> >::iterator it=tabseg.begin();
56  delete seg;
57  tabseg.erase(it);
58  }
59 }
60 
61 
63 {
64  epsilon=eps;
65 }
66 
67 int MG_GEOMETRIE_OUTILS::calcule_distance_contour_face_xyz(double *xyz,class MG_FACE* face,double *dis,int avecverif)
68 {
69  double uv[2];
70  face->inverser(uv,xyz);
71  if (avecverif)
72  {
73  double xyz2[3];
74  face->evaluer(uv,xyz2);
75  OT_VECTEUR_3D vec(xyz,xyz2);
76  if (vec.get_longueur()>1e-6) return 0;
77  }
79  return 1;
80 }
81 
82 
84 {
85  *quad=tabquad[face->get_id()];
86  if (*quad==NULL)
87  {
89  tabquad[face->get_id()]=(*quad);
90  }
91  *lstsegfront=tabseg[face->get_id()];
92  if (*lstsegfront==NULL)
93  {
95  tabseg[face->get_id()]=(*lstsegfront);
96  }
97  if ((*quad)->get_nb_cellule()==0)
98  cree_quadtree(face,*quad,*lstsegfront);
99 }
100 
102 {
105  ini_methode(face,&quad,&lstsegfront);
106  BOITE_2D b=quad->get_cellule(0)->get_boite();
107  return b;
108 }
109 
111 {
114  ini_methode(face,&quad,&lstsegfront);
115  double uvajoute[3]={uv[0],uv[1],0.};
117  int nbboucle=face->get_nb_mg_boucle();
118  for (int i=0;i<nbboucle;i++)
119  {
120  int nbcoarete=face->get_mg_boucle(i)->get_nb_mg_coarete();
121  for (int j=0;j<nbcoarete;j++)
122  lst.ajouter(face->get_mg_boucle(i)->get_mg_coarete(j));
123  }
124  BOITE_2D b=quad->get_cellule(0)->get_boite();
125  double rayon=b.get_rayon();
127  MG_SEGMENT_FRONTIERE* segretenu=NULL;
128  MG_COARETE* coareteretenu=NULL;
129  int typeretenu=1;
130  double d1retenu,d2retenu;
131  double distance=1e300;
133  int typesurf=face->get_surface()->get_type_geometrique(param);
134  int sortie=0;
135  do
136  {
137  int nbavant=lsttrouve.get_nb();
138  do
139  {
140  quad->rechercher(uv[0],uv[1],rayon,lsttrouve);
141  rayon=rayon*1.25;
142  }
143  while (lsttrouve.get_nb()==0);
144  int nb=lsttrouve.get_nb();
145  for (int i=nbavant;i<nb;i++)
146  {
147  MG_SEGMENT_FRONTIERE* seg=lsttrouve.get(i);
148  MG_ARETE* are=(MG_ARETE*)seg->get_lien_topologie();
149  int nbco=are->get_nb_mg_coarete();
150  MG_COARETE* coarete=NULL;
151  for (int j=0;j<nbco;j++)
152  if (lst.getid(are->get_mg_coarete(j)->get_id())!=NULL) coarete=are->get_mg_coarete(j);
153  if (coarete!=NULL)
154  {
155  double uv1[3],uv2[3];
156  uv1[0]=seg->get_uv1()[0];
157  uv1[1]=seg->get_uv1()[1];
158  uv1[2]=0;
159  uv2[0]=seg->get_uv2()[0];
160  uv2[1]=seg->get_uv2()[1];
161  uv2[2]=0;
162  int type;
163  double d1,d2;
164  double dist=distance_pt_segment(uvajoute,uv1,uv2,face,&type,&d1,&d2);
165  if (dist<distance)
166  {
167  distance=dist;
168  segretenu=seg;
169  coareteretenu=coarete;
170  typeretenu=type;
171  d1retenu=d1;
172  d2retenu=d2;
173  }
174  }
175  }
176  if (typesurf==GEOMETRIE::CONST::Co_NURBS)
177  {
178  if (rayon>distance) sortie=1;
179  }
180  else if (typesurf==GEOMETRIE::CONST::Co_BSPLINES)
181  {
182  if (rayon>distance) sortie=1;
183  }
184  else
185  if (distance<1e308) sortie=1;
186  }
187  while (sortie==0);
188  if (typeretenu==2)
189  if (d1retenu<d2retenu)
190  {
191  if (angle_contour(uvajoute,segretenu,segretenu->get_precedent(),face)<0) segretenu=segretenu->get_precedent();
192  }
193  else
194  {
195  if (angle_contour(uvajoute,segretenu,segretenu->get_suivant(),face)<0) segretenu=segretenu->get_suivant();
196  }
197 
198  double uv1[3]={segretenu->get_uv1()[0],segretenu->get_uv1()[1],0.};
199  double uv2[3]={segretenu->get_uv2()[0],segretenu->get_uv2()[1],0.};
201  double du=deca.calcul_decalage_parametre_u(uv1[0]);
202  double dv=deca.calcul_decalage_parametre_v(uv1[1]);
203  uv1[0]=uv1[0]+du;
204  uv1[1]=uv1[1]+dv;
205  uv2[0]=deca.decalage_parametre_u(uv2[0],du);
206  uv2[1]=deca.decalage_parametre_v(uv2[1],dv);
207  uvajoute[0]=deca.decalage_parametre_u(uvajoute[0],du);
208  uvajoute[1]=deca.decalage_parametre_v(uvajoute[1],dv);
209  OT_VECTEUR_3D base(uv1,uv2);
210  double normal[3]={0.,0.,1.};
211  OT_VECTEUR_3D nor(normal);
212  OT_VECTEUR_3D dir(uv1,uvajoute);
213  OT_VECTEUR_3D dir2(uv2,uvajoute);
214  distance=std::min(distance,dir.get_longueur());
215  distance=std::min(distance,dir2.get_longueur());
216  base.norme();
217  dir.norme();
218  double sens=(nor&base)*dir;
219  if (sens<0.) distance=-distance;
220  return distance;
221 }
222 
223 
224 
225 
227 {
228  double uvcom[2],uv1[2],uv2[2];
229  if (seg1->memenoeud1(seg2->get_uv1()))
230  {
231  uvcom[0]=seg1->get_uv1()[0];
232  uvcom[1]=seg1->get_uv1()[1];
233  uv1[0]=seg1->get_uv2()[0];
234  uv1[1]=seg1->get_uv2()[1];
235  uv2[0]=seg2->get_uv2()[0];
236  uv2[1]=seg2->get_uv2()[1];
237  }
238  else if (seg1->memenoeud1(seg2->get_uv2()))
239  {
240  uvcom[0]=seg1->get_uv1()[0];
241  uvcom[1]=seg1->get_uv1()[1];
242  uv1[0]=seg1->get_uv2()[0];
243  uv1[1]=seg1->get_uv2()[1];
244  uv2[0]=seg2->get_uv1()[0];
245  uv2[1]=seg2->get_uv1()[1];
246  }
247  else if (seg1->memenoeud2(seg2->get_uv1()))
248  {
249  uvcom[0]=seg1->get_uv2()[0];
250  uvcom[1]=seg1->get_uv2()[1];
251  uv1[0]=seg1->get_uv1()[0];
252  uv1[1]=seg1->get_uv1()[1];
253  uv2[0]=seg2->get_uv2()[0];
254  uv2[1]=seg2->get_uv2()[1];
255  }
256  else if (seg1->memenoeud2(seg2->get_uv2()))
257  {
258  uvcom[0]=seg1->get_uv2()[0];
259  uvcom[1]=seg1->get_uv2()[1];
260  uv1[0]=seg1->get_uv1()[0];
261  uv1[1]=seg1->get_uv1()[1];
262  uv2[0]=seg2->get_uv1()[0];
263  uv2[1]=seg2->get_uv1()[1];
264  }
266  double du=deca.calcul_decalage_parametre_u(uv[0]);
267  double dv=deca.calcul_decalage_parametre_v(uv[1]);
268  double uvtmp[2];
269  uvtmp[0]=uv[0]+du;
270  uvtmp[1]=uv[1]+dv;
271  uvcom[0]=deca.decalage_parametre_u(uvcom[0],du);
272  uvcom[1]=deca.decalage_parametre_v(uvcom[1],dv);
273  uv1[0]=deca.decalage_parametre_u(uv1[0],du);
274  uv1[1]=deca.decalage_parametre_v(uv1[1],dv);
275  uv2[0]=deca.decalage_parametre_u(uv2[0],du);
276  uv2[1]=deca.decalage_parametre_v(uv2[1],dv);
277  OT_VECTEUR_3D ubase(uvtmp[0]-uvcom[0],uvtmp[1]-uvcom[1],0.);
278  ubase.norme();
279  OT_VECTEUR_3D wbase(0.,0.,1.);
280  OT_VECTEUR_3D vbase=wbase&ubase;
281  vbase.norme();
282  OT_VECTEUR_3D v1(uv1[0]-uvcom[0],uv1[1]-uvcom[1],0.);
283  OT_VECTEUR_3D v2(uv2[0]-uvcom[0],uv2[1]-uvcom[1],0.);
284  v1.norme();
285  v2.norme();
286  double angle1=acos(v1*ubase);
287  double angle2=acos(v2*ubase);
288  if ((v1*vbase)<0.) angle1=-angle1;
289  if ((v2*vbase)<0.) angle2=-angle2;
290  int rep=-1;
291  if (fabs(angle1)<fabs(angle2)) rep=1;
292  return rep;
293 }
294 
295 
296 double MG_GEOMETRIE_OUTILS::distance_pt_segment(double *uv,double *uv1,double *uv2,MG_FACE* face,int *type,double *d1,double *d2)
297 {
299  double du=deca.calcul_decalage_parametre_u(uv1[0]);
300  double dv=deca.calcul_decalage_parametre_v(uv1[1]);
301  uv1[0]=uv1[0]+du;
302  uv1[1]=uv1[1]+dv;
303  uv2[0]=deca.decalage_parametre_u(uv2[0],du);
304  uv2[1]=deca.decalage_parametre_v(uv2[1],dv);
305  double uvtmp[3];
306  uvtmp[0]=deca.decalage_parametre_u(uv[0],du);
307  uvtmp[1]=deca.decalage_parametre_v(uv[1],dv);
308  uvtmp[2]=0.;
309  double distance;
310  OT_VECTEUR_3D vec12(uv1,uv2);
311  OT_VECTEUR_3D vec1p(uv1,uvtmp);
312  double t=(vec12.get_x()*vec1p.get_x()+vec12.get_y()*vec1p.get_y()+vec12.get_z()*vec1p.get_z())/(vec12.get_x()*vec12.get_x()+vec12.get_y()*vec12.get_y()+vec12.get_z()*vec12.get_z());
313  if ((t<-1e-10) || (t-1.>1e-10))
314  {
315  OT_VECTEUR_3D vec2p(uv2,uvtmp);
316  *d1=vec1p.get_longueur();
317  *d2=vec2p.get_longueur();
318  distance=0.5*(*d1+(*d2));
319  *type=2;
320  }
321  else
322  {
323  OT_VECTEUR_3D pvec=vec12&vec1p;
324  distance=pvec.get_longueur()/vec12.get_longueur();
325  *type=1;
326  }
327  return distance;
328 }
329 double MG_GEOMETRIE_OUTILS::projete(double *xyz,MG_FACE* face,double *uvproj,double *xyzproj,double precision)
330 {
331  double dist=projete(xyz,face->get_surface(),uvproj,xyzproj,precision);
332  if (face->get_orientation()!=MEME_SENS) uvproj[0]=face->get_surface()->get_umin()+face->get_surface()->get_umax()-uvproj[0];
333  return dist;
334 }
335 
336 double MG_GEOMETRIE_OUTILS::projete(double *xyz,MG_SURFACE* surface,double *uvproj,double *xyzproj,double precision)
337 {
338  double uvii[2];
339  surface->inverser(uvii,xyz);
340  int compteur=0;
341  OT_VECTEUR_3D Pt(xyz[0],xyz[1],xyz[2]);
342  double delta_u,delta_v;
343  do
344  {
345  compteur++;
346  double uvi[2];
347  uvi[0]=uvii[0];
348  uvi[1]=uvii[1];
349  double xyzduu[3],xyzdvv[3],xyzduv[3],xyzdu[3],xyzdv[3];
350  surface->deriver_seconde(uvi,xyzduu,xyzduv,xyzdvv,xyz,xyzdu,xyzdv);
351  OT_VECTEUR_3D S(xyz[0],xyz[1],xyz[2]);
352  OT_VECTEUR_3D Su(xyzdu[0],xyzdu[1],xyzdu[2]);
353  OT_VECTEUR_3D Sv(xyzdv[0],xyzdv[1],xyzdv[2]);
354  OT_VECTEUR_3D Suu(xyzduu[0],xyzduu[1],xyzduu[2]);
355  OT_VECTEUR_3D Suv(xyzduv[0],xyzduv[1],xyzduv[2]);
356  OT_VECTEUR_3D Svv(xyzdvv[0],xyzdvv[1],xyzdvv[2]);
357  OT_VECTEUR_3D Distance = S-Pt;
358  double a[4],b[2];
359  a[0]=Su.get_longueur2()+Distance*Suu;
360  a[1]=Su*Sv+Distance*Suv;
361  a[2]=Su*Sv+Distance*Suv;
362  a[3]=Sv.get_longueur2()+Distance*Svv;
363  b[0]=Distance*Su;
364  b[0]=-b[0];
365  b[1]=Distance*Sv;
366  b[1]=-b[1];
367  double deltau,deltav;
368  double denominateur_delta=(a[0]*a[3]-a[2]*a[1]);
369  if (a[0]<1E-12)
370  deltau=0;
371  else delta_u=(b[0]*a[3]-b[1]*a[1])/denominateur_delta;
372  if (a[3]<1E-12)
373  deltav=0;
374  else delta_v=(a[0]*b[1]-a[2]*b[0])/denominateur_delta;
375  /*if (fabs(denominateur_delta) < ( (fabs(a[0])+fabs(a[1])+fabs(a[2])+fabs(a[3]))*1e-12 ) )
376  return 1e300;*/
377  uvii[0]=uvi[0]+delta_u;
378  uvii[1]=uvi[1]+delta_v;
379  if (surface->est_periodique_u()==1)
380  {
381  double eps=1e-10*surface->get_periode_u();
382  if (uvii[0]<-eps) uvii[0]=surface->get_periode_u()-uvii[0];
383  if (uvii[0]>surface->get_periode_u()-eps) uvii[0]=uvii[0]-surface->get_periode_u();
384  }
385  if (surface->est_periodique_v()==1)
386  {
387  double eps=1e-10*surface->get_periode_v();
388  if (uvii[1]<-eps) uvii[0]=surface->get_periode_v()-uvii[1];
389  if (uvii[1]>surface->get_periode_v()-eps) uvii[1]=uvii[1]-surface->get_periode_v();
390  }
391  delta_u=uvii[0]-uvi[0];
392  delta_v=uvii[1]-uvi[1];
393  if (compteur>500) return 1e300;
394  }
395 
396  while ((fabs(delta_u)>precision)||(fabs(delta_v)>precision));
397  surface->evaluer(uvii,xyzproj);
398  OT_VECTEUR_3D S(xyzproj[0],xyzproj[1],xyzproj[2]);
399  double distance=(S-Pt).get_longueur();
400  uvproj[0]=uvii[0];
401  uvproj[1]=uvii[1];
402  return distance;
403 }
404 
406 {
407  double umax=-1e300;
408  double vmax=-1e300;
409  double umin=1e300;
410  double vmin=1e300;
411  int nbboucle=face->get_nb_mg_boucle();
412  for (int j=0;j<nbboucle;j++)
413  {
414  MG_BOUCLE* bou=face->get_mg_boucle(j);
415  int nbarete=bou->get_nb_mg_coarete();
416  MG_SEGMENT_FRONTIERE* premier=NULL;
417  MG_SEGMENT_FRONTIERE* dernier=NULL;
418  MG_SEGMENT_FRONTIERE* precedent=NULL;
419  MG_COARETE* coarepremier=bou->get_mg_coarete(0);
420  MG_COARETE* coare=coarepremier;
421  do
422  {
423  MG_ARETE* are=coare->get_arete();
424  double t1=are->get_tmin();
425  double t2=are->get_tmax();
426  double xyz[3];
427  are->evaluer(t1,xyz);
428  double uv1[2];
429  double uv2[2];
430  if (coare->get_orientation()==1) face->inverser(uv1,xyz);
431  else face->inverser(uv2,xyz);
432  are->evaluer(t2,xyz);
433  if (coare->get_orientation()==1) face->inverser(uv2,xyz);
434  else face->inverser(uv1,xyz);
435  if (face->get_surface()->est_periodique_u()==1)
436  {
437  double eps=1e-10*face->get_surface()->get_periode_u();
438  if (uv1[0]<-eps) uv1[0]=uv1[0]+face->get_surface()->get_periode_u();
439  if (uv1[0]>face->get_surface()->get_periode_u()-eps) uv1[0]=uv1[0]-face->get_surface()->get_periode_u();
440  if (uv2[0]<-eps) uv2[0]=uv2[0]+face->get_surface()->get_periode_u();
441  if (uv2[0]>face->get_surface()->get_periode_u()-eps) uv2[0]=uv2[0]-face->get_surface()->get_periode_u();
442  }
443  if (face->get_surface()->est_periodique_v()==1)
444  {
445  double eps=1e-10*face->get_surface()->get_periode_v();
446  if (uv1[1]<-eps) uv1[1]=uv1[1]+face->get_surface()->get_periode_v();
447  if (uv1[1]>face->get_surface()->get_periode_v()-eps) uv1[1]=uv1[1]-face->get_surface()->get_periode_v();
448  if (uv2[1]<-eps) uv2[1]=uv2[1]+face->get_surface()->get_periode_v();
449  if (uv2[1]>face->get_surface()->get_periode_v()-eps) uv2[1]=uv2[1]-face->get_surface()->get_periode_v();
450  }
451 
452 
453 
454 
455  int pas=1000;
456  double ds=0.;
457  double tni=t1;
458  double uvtni[2]={uv1[0],uv1[1]};
459  umin=std::min(umin,uv1[0]);
460  umin=std::min(umin,uv2[0]);
461  umax=std::max(umax,uv1[0]);
462  umax=std::max(umax,uv2[0]);
463  vmin=std::min(vmin,uv1[1]);
464  vmin=std::min(vmin,uv2[1]);
465  vmax=std::max(vmax,uv1[1]);
466  vmax=std::max(vmax,uv2[1]);
467  int nbavant=lstsegfront->get_nb();
468  for (int i=0;i<pas;i++)
469  {
470  double ti=t1+i*1.0/pas*(t2-t1);
471  double tii=t1+(i+1)*1.0/pas*(t2-t1);
472  double t=0.7886751345*ti+0.2113248654*tii;
473  if (coare->get_orientation()==-1) t=t1+t2-t;
474  double M=are->get_M(t);
475  double dxyz[3];
476  are->deriver(t,dxyz);
477  double rayon;
478  if (fabs(M)>0.00000001) rayon=1./M;
479  else rayon=1e308;
480  ds=ds+0.5*(tii-ti)*sqrt(dxyz[0]*dxyz[0]+dxyz[1]*dxyz[1]+dxyz[2]*dxyz[2])/2./rayon/sqrt(2.)/sqrt(epsilon);
481  if (coare->get_orientation()==-1) t=t1+t2-t;
482  t=0.7886751345*tii+0.2113248654*ti;
483  M=are->get_M(t);
484  are->deriver(t,dxyz);
485  if (fabs(M)>0.00000001) rayon=1./M;
486  else rayon=1e308;
487  ds=ds+0.5*(tii-ti)*sqrt(dxyz[0]*dxyz[0]+dxyz[1]*dxyz[1]+dxyz[2]*dxyz[2])/2./rayon/sqrt(2.)/sqrt(epsilon);
488  if (ds>lstsegfront->get_nb()+1-nbavant)
489  {
490  double tnii=tii;
491  double uvtnii[2];
492  if (coare->get_orientation()==-1) tnii=t1+t2-tnii;
493  are->evaluer(tnii,xyz);
494  face->inverser(uvtnii,xyz);
495  if (face->get_surface()->est_periodique_u()==1)
496  {
497  double eps=1e-10*face->get_surface()->get_periode_u();
498  if (uvtnii[0]<-eps) uvtnii[0]=uvtnii[0]+face->get_surface()->get_periode_u();
499  if (uvtnii[0]>face->get_surface()->get_periode_u()-eps) uvtnii[0]=uvtnii[0]-face->get_surface()->get_periode_u();
500  }
501  if (face->get_surface()->est_periodique_v()==1)
502  {
503  double eps=1e-10*face->get_surface()->get_periode_v();
504  if (uvtnii[1]<-eps) uvtnii[1]=uvtnii[1]+face->get_surface()->get_periode_v();
505  if (uvtnii[1]>face->get_surface()->get_periode_v()-eps) uvtnii[1]=uvtnii[1]-face->get_surface()->get_periode_v();
506  }
507  MG_SEGMENT_FRONTIERE* segfr=new MG_SEGMENT_FRONTIERE(are,NULL,precedent);
508  if (premier==NULL) premier=segfr;
509  if (precedent!=NULL) precedent->change_suivant(segfr);
510  precedent=segfr;
511  lstsegfront->ajouter(segfr);
513  segfr->get_uv1()[0]=uvtni[0];
514  segfr->get_uv1()[1]=uvtni[1];
515  segfr->get_uv2()[0]=uvtnii[0];
516  segfr->get_uv2()[1]=uvtnii[1];
517  umin=std::min(umin,uvtnii[0]);
518  umax=std::max(umax,uvtnii[0]);
519  vmin=std::min(vmin,uvtnii[1]);
520  vmax=std::max(vmax,uvtnii[1]);
521  tni=tnii;
522  uvtni[0]=uvtnii[0];
523  uvtni[1]=uvtnii[1];
524  }
525  }
526  MG_SEGMENT_FRONTIERE* segfr=new MG_SEGMENT_FRONTIERE(are,NULL,precedent);
527  if (premier==NULL) premier=segfr;
528  if (precedent!=NULL) precedent->change_suivant(segfr);
529  precedent=segfr;
530  dernier=segfr;
531  lstsegfront->ajouter(segfr);
533  segfr->get_uv1()[0]=uvtni[0];
534  segfr->get_uv1()[1]=uvtni[1];
535  segfr->get_uv2()[0]=uv2[0];
536  segfr->get_uv2()[1]=uv2[1];
537  coare=bou->get_mg_coarete_suivante(coare);
538  }
539  while (coare!=coarepremier);
540  dernier->change_suivant(premier);
541  premier->change_precedent(dernier);
542  }
543  double periodeenu=face->get_surface()->get_periode_u();
544  double periodeenv=face->get_surface()->get_periode_v();
545  if (periodeenu!=0.0)
546  {
547  umin=0.;
548  umax=periodeenu;
549  }
550  else
551  {
552  double diff=umax-umin;
553  umin=umin-0.125*diff;
554  umax=umax+0.125*diff;
555  }
556  if (periodeenv!=0.0)
557  {
558  vmin=0.;
559  vmax=periodeenv;
560  }
561  else
562  {
563  double diff=vmax-vmin;
564  vmin=vmin-0.125*diff;
565  vmax=vmax+0.125*diff;
566  }
568  quad->initialiser(lstsegfront,1,umin,vmin,umax,vmax,face->get_surface()->est_periodique_u(),face->get_surface()->est_periodique_v(),face->get_surface()->get_periode_u(),face->get_surface()->get_periode_v());
570  int nbsegfr=lstsegfront->get_nb();
571  for (int j=0;j<nbsegfr;j++)
572  {
573  quad->inserer( lstsegfront->get(j));
574  /* MG_SEGMENT_FRONTIERE* sfr=lstsegfront->get(j);
575  MG_SEGMENT_FRONTIERE* sfrp=sfr->get_precedent();
576  MG_SEGMENT_FRONTIERE* sfrs=sfr->get_suivant();
577  if (sfrp->get_suivant()!=sfr) cout << "Bug" << endl;
578  if (sfrs->get_precedent()!=sfr) cout << "Bug" << endl;
579  cout << sfr->get_uv1()[0] << " " << sfr->get_uv1()[1] << endl;
580  cout << sfr->get_uv2()[0] << " " << sfr->get_uv2()[1] << endl << "---" << endl;*/
581 
582  }
583 }
584 
586 {
587  int pas=100;
588  double eps=0.1;
589  double R1=0.0;
590  double R2=0.0;
591  int nb=are->get_nb_mg_coarete();
592  if (nb!=2) return 0;
593  MG_COARETE* coare1=are->get_mg_coarete(0);
594  MG_COARETE* coare2=are->get_mg_coarete(1);
595  MG_FACE* face1=coare1->get_boucle()->get_mg_face();
596  MG_FACE* face2=coare2->get_boucle()->get_mg_face();
597  for (int i=0;i<pas;i++)
598  {
599  double t=are->get_tmin()+i*1.0/pas*(are->get_tmax()-are->get_tmin());
600  double xyz[3],dxyz[3],xyz1du[3],xyz1dv[3],xyz2du[3],xyz2dv[3],xyz1duu[3],xyz1duv[3],xyz1dvv[3],xyz2duu[3],xyz2duv[3],xyz2dvv[3];
601  are->evaluer(t,xyz);
602  are->deriver(t,dxyz);
603  double uv1[2],uv2[2];
604  face1->inverser(uv1,xyz);
605  face2->inverser(uv2,xyz);
606  double normal1[3],normal2[3];
607  face1->calcul_normale_unitaire(uv1,normal1);
608  face2->calcul_normale_unitaire(uv2,normal2);
609  OT_VECTEUR_3D dir1(dxyz);
610  OT_VECTEUR_3D dir2(dxyz);
611  dir1=coare1->get_orientation()*dir1;
612  dir2=coare2->get_orientation()*dir2;
613  dir1.norme();
614  dir2.norme();
615  OT_VECTEUR_3D n1(normal1);
616  OT_VECTEUR_3D n2(normal2);
617  OT_VECTEUR_3D sens1=n1&dir1;
618  OT_VECTEUR_3D sens2=n2&dir2;
619  double angle=sens1*sens2;
620 
621  are->evaluer(t,dir1);
622  are->evaluer(t,dir2);
623 
624  face1->inverser(uv1,dir1);
625  face2->inverser(uv2,dir2);
626 
627  face1->deriver_seconde(uv1,xyz1duu,xyz1duv,xyz1dvv,xyz,xyz1du,xyz1dv);
628  face2->deriver_seconde(uv2,xyz2duu,xyz2duv,xyz2dvv,xyz,xyz2du,xyz2dv);
629 
630  double E1=sqrt(xyz1duu[0]*xyz1duu[0]+xyz1duu[1]*xyz1duu[1]+xyz1duu[2]*xyz1duu[2]);
631  double F1=sqrt(xyz2duu[0]*xyz2duu[0]+xyz2duu[1]*xyz2duu[1]+xyz2duu[2]*xyz2duu[2]);
632 
633  double E2=sqrt(xyz1duv[0]*xyz1duv[0]+xyz1duv[1]*xyz1duv[1]+xyz1duv[2]*xyz1duv[2]);
634  double F2=sqrt(xyz2duv[0]*xyz2duv[0]+xyz2duv[1]*xyz2duv[1]+xyz2duv[2]*xyz2duv[2]);
635 
636  double E3=sqrt(xyz1dvv[0]*xyz1dvv[0]+xyz1dvv[1]*xyz1dvv[1]+xyz1dvv[2]*xyz1dvv[2]);
637  double F3=sqrt(xyz2dvv[0]*xyz2dvv[0]+xyz2dvv[1]*xyz2dvv[1]+xyz2dvv[2]*xyz2dvv[2]);
638 
639  double E12=0.0;
640  double E22=0.0;
641  double E32=0.0;
642 
643  if(E1<eps)
644  {
645  E12=(1./E1);
646  }
647  else
648  {
649  E12=E1;
650  }
651 
652  if(E2<eps)
653  {
654  E22=(1./E2);
655  }
656  else
657  {
658  E22=E2;
659  }
660 
661  if(E3<eps)
662  {
663  E32=(1./E3);
664  }
665  else
666  {
667  E32=E3;
668  }
669 
670  double u=1.0;
671  double v=1.0;
672 
673  R1=(u*((E12*u)+(E22*v)))+(v*((E22*u)+(E32*v)));
674 
675 
676  double F12=0.0;
677  double F22=0.0;
678  double F32=0.0;
679 
680  if(F1<eps)
681  {
682  F12=(1./F1);
683  }
684  else
685  {
686  F12=F1;
687  }
688 
689  if(F2<eps)
690  {
691  F22=(1./F2);
692  }
693  else
694  {
695  F22=F2;
696  }
697 
698  if(F3<eps)
699  {
700  F32=(1./F3);
701  }
702  else
703  {
704  F32=F3;
705  }
706 
707  R2=(u*((F12*u)+(F22*v)))+(v*((F22*u)+(F32*v)));
708 
709  if (angle>-1+eps) return 0;
710  else
711  {
712  if(R1==R2) return 2;
713  }
714 
715 
716  }
717  if (tabface!=NULL)
718  {
719  tabface[0]=face1;
720  tabface[1]=face2;
721  }
722  return 1;
723 
724 }
725 
726 
727 
728 
729 
MG_SEGMENT_FRONTIERE::get_uv2
double * get_uv2(void)
Definition: mg_segment_frontiere.h:49
MG_GEOMETRIE_OUTILS::lstsegfrontadetruire
TPL_LISTE_ENTITE< MG_SEGMENT_FRONTIERE * > lstsegfrontadetruire
Definition: mg_geometrie_outils.h:57
TPL_QUADTREE::rechercher
virtual void rechercher(BOITE_2D &boite, TPL_MAP_ENTITE< A > &liste_entite_trouve, TPL_CELLULE_QUADTREE< A, CONDITION > *cellule)
Definition: tpl_quadtree.h:202
MG_GEOMETRIE_OUTILS::MG_GEOMETRIE_OUTILS
MG_GEOMETRIE_OUTILS()
Definition: mg_geometrie_outils.cpp:29
MG_SEGMENT_FRONTIERE::get_suivant
MG_SEGMENT_FRONTIERE * get_suivant(void)
Definition: mg_segment_frontiere.cpp:125
MG_GEOMETRIE_OUTILS::ini_methode
void ini_methode(MG_FACE *face, TPL_QUADTREE< MG_SEGMENT_FRONTIERE *, MG_SEGMENT_FRONTIERE * > **quad, TPL_LISTE_ENTITE< MG_SEGMENT_FRONTIERE * > **lstsegfront)
Definition: mg_geometrie_outils.cpp:83
MG_GEOMETRIE_OUTILS::cree_quadtree
void cree_quadtree(MG_FACE *face, TPL_QUADTREE< MG_SEGMENT_FRONTIERE *, MG_SEGMENT_FRONTIERE * > *quad, TPL_LISTE_ENTITE< MG_SEGMENT_FRONTIERE * > *lstsegfront)
Definition: mg_geometrie_outils.cpp:405
MG_BOUCLE
Definition: mg_boucle.h:35
gestionversion.h
MG_BOUCLE::get_nb_mg_coarete
virtual int get_nb_mg_coarete(void)
Definition: mg_boucle.cpp:78
MG_SURFACE
Definition: mg_surface.h:31
MG_SURFACE::get_periode_u
virtual double get_periode_u(void)=0
TPL_MAP_ENTITE
Definition: tpl_map_entite.h:35
MG_ARETE::evaluer
virtual void evaluer(double t, double *xyz)
Definition: mg_arete.cpp:143
MG_SURFACE::get_type_geometrique
virtual int get_type_geometrique(TPL_LISTE_ENTITE< double > &param)=0
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
MG_GEOMETRIE_OUTILS::epsilon
double epsilon
Definition: mg_geometrie_outils.h:58
BOITE_2D::get_rayon
double get_rayon(void)
Definition: ot_boite_2d.cpp:86
OT_VECTEUR_3D::get_longueur2
virtual double get_longueur2(void) const
Definition: ot_mathematique.cpp:488
MG_SURFACE::evaluer
virtual void evaluer(double *uv, double *xyz)=0
robustPredicates::epsilon
static REAL epsilon
Definition: robustpredicates.cc:371
a
#define a(i, j)
MG_SEGMENT_FRONTIERE::change_precedent
void change_precedent(MG_SEGMENT_FRONTIERE *p)
Definition: mg_segment_frontiere.cpp:130
MG_SEGMENT_FRONTIERE::get_precedent
MG_SEGMENT_FRONTIERE * get_precedent(void)
Definition: mg_segment_frontiere.cpp:120
MG_GEOMETRIE_OUTILS::angle_contour
int angle_contour(double *uv, class MG_SEGMENT_FRONTIERE *seg1, MG_SEGMENT_FRONTIERE *seg2, MG_FACE *face)
Definition: mg_geometrie_outils.cpp:226
MG_COARETE
Definition: mg_coarete.h:31
MG_GEOMETRIE_OUTILS::projete
double projete(double *xyz, MG_FACE *face, double *uvproj, double *xyzproj, double precision=1e-6)
Definition: mg_geometrie_outils.cpp:329
MG_SEGMENT_FRONTIERE::get_uv1
double * get_uv1(void)
Definition: mg_segment_frontiere.h:46
MG_SEGMENT_FRONTIERE::memenoeud2
int memenoeud2(double *uv2)
Definition: mg_segment_frontiere.cpp:102
MG_SEGMENT_FRONTIERE::change_etat_normal
static void change_etat_normal(void)
Definition: mg_segment_frontiere.cpp:115
MG_COARETE::get_boucle
virtual MG_BOUCLE * get_boucle(void)
Definition: mg_coarete.cpp:53
OT_VECTEUR_3D::get_x
virtual double get_x(void) const
Definition: ot_mathematique.cpp:417
MG_FACE::get_nb_mg_boucle
virtual int get_nb_mg_boucle(void)
Definition: mg_face.cpp:67
MG_GEOMETRIE_OUTILS::tabseg
std::map< long, TPL_LISTE_ENTITE< MG_SEGMENT_FRONTIERE * > *, std::less< long > > tabseg
Definition: mg_geometrie_outils.h:60
MG_ARETE::get_tmin
virtual double get_tmin(void)
Definition: mg_arete.cpp:179
TPL_QUADTREE::inserer
virtual void inserer(BOITE_2D &boite, A a, TPL_CELLULE_QUADTREE< A, CONDITION > *cellule)
Definition: tpl_quadtree.h:374
MG_FACE::inverser
virtual void inverser(double *uv, double *xyz, double precision=1e-6)
Definition: mg_face.cpp:228
MG_ARETE::get_nb_mg_coarete
virtual int get_nb_mg_coarete(void)
Definition: mg_arete.cpp:106
MG_SEGMENT_FRONTIERE
Definition: mg_segment_frontiere.h:34
MG_FACE::evaluer
virtual void evaluer(double *uv, double *xyz)
Definition: mg_face.cpp:192
MG_GEOMETRIE_OUTILS::get_boite_2D
BOITE_2D get_boite_2D(MG_FACE *face)
Definition: mg_geometrie_outils.cpp:101
TPL_MAP_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_map_entite.h:83
MG_FACE::deriver_seconde
virtual void deriver_seconde(double *uv, double *xyzduu, double *xyzduv, double *xyzdvv, double *xyz=NULL, double *xyzdu=NULL, double *xyzdv=NULL)
Definition: mg_face.cpp:212
MG_SURFACE::deriver_seconde
virtual void deriver_seconde(double *uv, double *xyzduu, double *xyzduv, double *xyzdvv, double *xyz=NULL, double *xyzdu=NULL, double *xyzdv=NULL)=0
GEOMETRIE::CONST::Co_NURBS
@ Co_NURBS
Definition: constantegeo.h:32
TPL_LISTE_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_liste_entite.h:38
MEME_SENS
const int MEME_SENS
Definition: mg_definition.h:35
MG_SURFACE::est_periodique_u
virtual int est_periodique_u(void)=0
MG_SURFACE::inverser
virtual void inverser(double *uv, double *xyz, double precision=1e-6)=0
MG_BOUCLE::get_mg_face
virtual MG_FACE * get_mg_face(void)
Definition: mg_boucle.cpp:102
MG_COARETE::get_orientation
virtual int get_orientation(void)
Definition: mg_coarete.cpp:71
TPL_LISTE_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_liste_entite.h:67
OT_VECTEUR_3D::norme
virtual void norme(void)
Definition: ot_mathematique.cpp:494
TPL_QUADTREE::initialiser
virtual void initialiser(TPL_LISTE_ENTITE< CONDITION > *lst_entite, int nombre, double xmin, double ymin, double xmax, double ymax, bool estu, bool estv, double periodeu, double periodev)
Definition: tpl_quadtree.h:97
OCC_FONCTION::precision
double precision
Definition: occ_fonction.h:64
MG_GEOMETRIE_OUTILS::calcule_distance_contour_face_uv
double calcule_distance_contour_face_uv(double *uv, class MG_FACE *face)
Definition: mg_geometrie_outils.cpp:110
TPL_LISTE_ENTITE::get
virtual X get(int num)
Definition: tpl_liste_entite.h:72
OT_DECALAGE_PARAMETRE::decalage_parametre_u
double decalage_parametre_u(double par, double dpar)
Definition: ot_decalage_parametre.cpp:51
OT_VECTEUR_3D::get_y
virtual double get_y(void) const
Definition: ot_mathematique.cpp:423
MG_ARETE::get_M
virtual double get_M(double t)
Definition: mg_arete.cpp:205
acos
double2 acos(double2 &val)
Definition: ot_doubleprecision.cpp:224
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
TPL_MAP_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_map_entite.h:55
BOITE_2D
Definition: ot_boite_2d.h:28
TPL_MAP_ENTITE::getid
virtual X getid(unsigned long num)
Definition: tpl_map_entite.h:96
MG_BOUCLE::get_mg_coarete
virtual MG_COARETE * get_mg_coarete(int num)
Definition: mg_boucle.cpp:84
MG_SURFACE::get_umax
virtual double get_umax()
Definition: mg_surface.cpp:61
MG_SURFACE::est_periodique_v
virtual int est_periodique_v(void)=0
sqrt
double2 sqrt(double2 &val)
Definition: ot_doubleprecision.cpp:345
MG_FACE::calcul_normale_unitaire
virtual void calcul_normale_unitaire(double *uv, double *normale)
Definition: mg_face.cpp:248
OT_DECALAGE_PARAMETRE::calcul_decalage_parametre_v
double calcul_decalage_parametre_v(double par)
Definition: ot_decalage_parametre.cpp:43
MG_SURFACE::get_periode_v
virtual double get_periode_v(void)=0
MG_SEGMENT_FRONTIERE::memenoeud1
int memenoeud1(double *uv2)
Definition: mg_segment_frontiere.cpp:94
TPL_MAP_ENTITE::get
virtual X get(int num)
Definition: tpl_map_entite.h:89
mg_geometrie_outils.h
OT_DECALAGE_PARAMETRE::calcul_decalage_parametre_u
double calcul_decalage_parametre_u(double par)
Definition: ot_decalage_parametre.cpp:35
OT_VECTEUR_3D::get_z
virtual double get_z(void) const
Definition: ot_mathematique.cpp:429
MG_GEOMETRIE_OUTILS::tabquad
std::map< long, TPL_QUADTREE< MG_SEGMENT_FRONTIERE *, MG_SEGMENT_FRONTIERE * > *, std::less< long > > tabquad
Definition: mg_geometrie_outils.h:59
MG_GEOMETRIE_OUTILS::calcule_distance_contour_face_xyz
int calcule_distance_contour_face_xyz(double *xyz, class MG_FACE *face, double *dis, int avecverif=1)
Definition: mg_geometrie_outils.cpp:67
OT_VECTEUR_3D::get_longueur
virtual double get_longueur(void) const
Definition: ot_mathematique.cpp:483
GEOMETRIE::CONST::Co_BSPLINES
@ Co_BSPLINES
Definition: constantegeo.h:32
TPL_LISTE_ENTITE< MG_SEGMENT_FRONTIERE * >
MG_BOUCLE::get_mg_coarete_suivante
virtual MG_COARETE * get_mg_coarete_suivante(MG_COARETE *coare)
Definition: mg_boucle.cpp:107
OT_DECALAGE_PARAMETRE::decalage_parametre_v
double decalage_parametre_v(double par, double dpar)
Definition: ot_decalage_parametre.cpp:75
TPL_QUADTREE
Definition: tpl_quadtree.h:77
MG_ARETE::deriver
virtual void deriver(double t, double *xyz)
Definition: mg_arete.cpp:149
MG_ARETE
Definition: mg_arete.h:36
MG_FACE
Definition: mg_face.h:34
MG_FACE::get_mg_boucle
virtual MG_BOUCLE * get_mg_boucle(int num)
Definition: mg_face.cpp:72
MG_GEOMETRIE_OUTILS
Definition: mg_geometrie_outils.h:37
TPL_LISTE_ENTITE::supprimer
virtual void supprimer(X x)
Definition: tpl_liste_entite.h:42
MG_COARETE::get_arete
virtual MG_ARETE * get_arete(void)
Definition: mg_coarete.cpp:58
MG_GEOMETRIE_OUTILS::arete_virtuelle
int arete_virtuelle(class MG_ARETE *are, MG_FACE **tabface=NULL)
Definition: mg_geometrie_outils.cpp:585
OT_DECALAGE_PARAMETRE
Definition: ot_decalage_parametre.h:28
MG_SEGMENT_FRONTIERE::change_suivant
void change_suivant(MG_SEGMENT_FRONTIERE *p)
Definition: mg_segment_frontiere.cpp:135
MG_GEOMETRIE_OUTILS::distance_pt_segment
double distance_pt_segment(double *uv, double *uv1, double *uv2, MG_FACE *face, int *type, double *d1, double *d2)
Definition: mg_geometrie_outils.cpp:296
MG_SURFACE::get_umin
virtual double get_umin()
Definition: mg_surface.cpp:56
MG_SEGMENT_FRONTIERE::get_lien_topologie
MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
Definition: mg_segment_frontiere.cpp:51
MG_SEGMENT_FRONTIERE::change_etat_initialise
static void change_etat_initialise(void)
Definition: mg_segment_frontiere.cpp:110
MG_GEOMETRIE_OUTILS::~MG_GEOMETRIE_OUTILS
virtual ~MG_GEOMETRIE_OUTILS()
Definition: mg_geometrie_outils.cpp:37
MG_ARETE::get_tmax
virtual double get_tmax(void)
Definition: mg_arete.cpp:184
MG_FACE::get_surface
virtual MG_SURFACE * get_surface(void)
Definition: mg_face.cpp:109
MG_FACE::get_orientation
virtual int get_orientation(void)
Definition: mg_face.cpp:140
MG_ARETE::get_mg_coarete
virtual MG_COARETE * get_mg_coarete(int num)
Definition: mg_arete.cpp:228
TPL_QUADTREE::get_cellule
virtual TPL_CELLULE_QUADTREE< A, CONDITION > * get_cellule(int num)
Definition: tpl_quadtree.h:94
MG_GEOMETRIE_OUTILS::change_epsilon
void change_epsilon(double eps)
Definition: mg_geometrie_outils.cpp:62