41 if ( (noeud5==noeud1) || (noeud5==noeud2) || (noeud5==noeud3) || (noeud5==noeud4) ) commun1=1;
else commun1=0;
42 if ( (noeud6==noeud1) || (noeud6==noeud2) || (noeud6==noeud3) || (noeud6==noeud4) ) commun2=1;
else commun2=0;
43 if ( (noeud7==noeud1) || (noeud7==noeud2) || (noeud7==noeud3) || (noeud7==noeud4) ) commun3=1;
else commun3=0;
44 int nb_commun=commun1+commun2+commun3;
45 if (nb_commun==3)
return(
false);
47 if (nb_commun>0) inter=
true;
50 double bxmin=std::min(noeud1->
get_x(),noeud2->
get_x());
51 bxmin=std::min(bxmin,noeud3->
get_x());
52 bxmin=std::min(bxmin,noeud4->
get_x());
53 double bxmax=std::max(noeud1->
get_x(),noeud2->
get_x());
54 bxmax=std::max(bxmax,noeud3->
get_x());
55 bxmax=std::max(bxmax,noeud4->
get_x());
56 double bymin=std::min(noeud1->
get_y(),noeud2->
get_y());
57 bymin=std::min(bymin,noeud3->
get_y());
58 bymin=std::min(bymin,noeud4->
get_y());
59 double bymax=std::max(noeud1->
get_y(),noeud2->
get_y());
60 bymax=std::max(bymax,noeud3->
get_y());
61 bymax=std::max(bymax,noeud4->
get_y());
62 double bzmin=std::min(noeud1->
get_z(),noeud2->
get_z());
63 bzmin=std::min(bzmin,noeud3->
get_z());
64 bzmin=std::min(bzmin,noeud4->
get_z());
65 double bzmax=std::max(noeud1->
get_z(),noeud2->
get_z());
66 bzmax=std::max(bzmax,noeud3->
get_z());
67 bzmax=std::max(bzmax,noeud4->
get_z());
68 BOITE_3D boite_tetra(bxmin,bymin,bzmin,bxmax,bymax,bzmax);
69 double b2xmin=std::min(noeud5->
get_x(),noeud6->
get_x());
70 b2xmin=std::min(b2xmin,noeud7->
get_x());
71 double b2xmax=std::max(noeud5->
get_x(),noeud6->
get_x());
72 b2xmax=std::max(b2xmax,noeud7->
get_x());
73 double b2ymin=std::min(noeud5->
get_y(),noeud6->
get_y());
74 b2ymin=std::min(b2ymin,noeud7->
get_y());
75 double b2ymax=std::max(noeud5->
get_y(),noeud6->
get_y());
76 b2ymax=std::max(b2ymax,noeud7->
get_y());
77 double b2zmin=std::min(noeud5->
get_z(),noeud6->
get_z());
78 b2zmin=std::min(b2zmin,noeud7->
get_z());
79 double b2zmax=std::max(noeud5->
get_z(),noeud6->
get_z());
80 b2zmax=std::max(b2zmax,noeud7->
get_z());
81 BOITE_3D boite_triangle(b2xmin,b2ymin,b2zmin,b2xmax,b2ymax,b2zmax);
82 inter=boite_tetra*boite_triangle;
102 double eps1=0.33333333333*(n1n3.diff()+n1n2.diff()+n1n5.
diff());
103 double eps2=0.33333333333*(n1n4.diff()+n1n2.diff()+n1n5.
diff());
104 double eps3=0.33333333333*(n2n4.diff()+n2n3.
diff()+n2n5.
diff());
105 double eps4=0.33333333333*(n1n4.diff()+n1n3.diff()+n1n5.
diff());
112 if (normal1*n1n5<eps1)
113 if (normal2*n1n5<eps2)
114 if (normal3*n2n5<eps3)
115 if (normal4*n1n5<eps4)
return true;
117 eps1=0.33333333333*(n1n3.diff()+n1n2.diff()+n1n6.
diff());
118 eps2=0.33333333333*(n1n4.diff()+n1n2.diff()+n1n6.
diff());
119 eps3=0.33333333333*(n2n4.diff()+n2n3.
diff()+n2n6.
diff());
120 eps4=0.33333333333*(n1n4.diff()+n1n3.diff()+n1n6.
diff());
126 if (normal1*n1n6<eps1)
127 if (normal2*n1n6<eps2)
128 if (normal3*n2n6<eps3)
129 if (normal4*n1n6<eps4)
return true;
131 eps1=0.33333333333*(n1n3.diff()+n1n2.diff()+n1n7.
diff());
132 eps2=0.33333333333*(n1n4.diff()+n1n2.diff()+n1n7.
diff());
133 eps3=0.33333333333*(n2n4.diff()+n2n3.
diff()+n2n7.
diff());
134 eps4=0.33333333333*(n1n4.diff()+n1n3.diff()+n1n7.
diff());
140 if (normal1*n1n7<eps1)
141 if (normal2*n1n7<eps2)
142 if (normal3*n2n7<eps3)
143 if (normal4*n1n7<eps4)
return true;
157 if ( (noeud4==noeud1) || (noeud4==noeud2) || (noeud4==noeud3) ) nb_commun++;
158 if ( (noeud5==noeud1) || (noeud5==noeud2) || (noeud5==noeud3) ) nb_commun++;
159 if ( (noeud6==noeud1) || (noeud6==noeud2) || (noeud6==noeud3) ) nb_commun++;
160 if (nb_commun==3)
return(
false);
161 double bxmin=std::min(noeud1->
get_x(),noeud2->
get_x());
162 bxmin=std::min(bxmin,noeud3->
get_x());
163 double bxmax=std::max(noeud1->
get_x(),noeud2->
get_x());
164 bxmax=std::max(bxmax,noeud3->
get_x());
165 double bymin=std::min(noeud1->
get_y(),noeud2->
get_y());
166 bymin=std::min(bymin,noeud3->
get_y());
167 double bymax=std::max(noeud1->
get_y(),noeud2->
get_y());
168 bymax=std::max(bymax,noeud3->
get_y());
169 double bzmin=std::min(noeud1->
get_z(),noeud2->
get_z());
170 bzmin=std::min(bzmin,noeud3->
get_z());
171 double bzmax=std::max(noeud1->
get_z(),noeud2->
get_z());
172 bzmax=std::max(bzmax,noeud3->
get_z());
173 BOITE_3D boite_triangle1(bxmin,bymin,bzmin,bxmax,bymax,bzmax);
174 double b2xmin=std::min(noeud5->
get_x(),noeud6->
get_x());
175 b2xmin=std::min(b2xmin,noeud4->
get_x());
176 double b2xmax=std::max(noeud5->
get_x(),noeud6->
get_x());
177 b2xmax=std::max(b2xmax,noeud4->
get_x());
178 double b2ymin=std::min(noeud5->
get_y(),noeud6->
get_y());
179 b2ymin=std::min(b2ymin,noeud4->
get_y());
180 double b2ymax=std::max(noeud5->
get_y(),noeud6->
get_y());
181 b2ymax=std::max(b2ymax,noeud4->
get_y());
182 double b2zmin=std::min(noeud5->
get_z(),noeud6->
get_z());
183 b2zmin=std::min(b2zmin,noeud4->
get_z());
184 double b2zmax=std::max(noeud5->
get_z(),noeud6->
get_z());
185 b2zmax=std::max(b2zmax,noeud4->
get_z());
186 BOITE_3D boite_triangle2(b2xmin,b2ymin,b2zmin,b2xmax,b2ymax,b2zmax);
187 int inter=boite_triangle1*boite_triangle2;
197 double ps1=normal*n1n4;
198 double ps2=normal*n1n5;
199 double ps3=normal*n1n6;
200 double eps1=0.333333333*(n1n2.
diff()+n1n3.diff()+n1n4.diff());
201 double eps2=0.333333333*(n1n2.
diff()+n1n3.diff()+n1n5.diff());
202 double eps3=0.333333333*(n1n2.
diff()+n1n3.diff()+n1n6.diff());
209 if ((ps1<-eps1) && (ps2<-eps2) && (ps3<-eps3) )
return false;
210 if ((ps1>eps1) && (ps2>eps2) && (ps3>eps3) )
return false;
226 if ( (noeud4==noeud1) || (noeud4==noeud2) || (noeud4==noeud3) ) nb_commun++;
227 if ( (noeud5==noeud1) || (noeud5==noeud2) || (noeud5==noeud3) ) nb_commun++;
228 if (nb_commun==2)
return(
false);
236 double eps=0.333333333333*(g1.
diff()+g2.
diff()+g3.
diff());
243 double eps2=0.333333333333*(g1.
diff()+g2.
diff()+g3b.
diff());
256 if ( (noeud4==noeud1) || (noeud4==noeud2) || (noeud4==noeud3) )
return false;
257 if ( (noeud5==noeud1) || (noeud5==noeud2) || (noeud5==noeud3) )
return false;
272 double alpha1=n1n4*g1b;
273 double alpha2=n1n4*g2b;
274 double alpha3=-(n1n4*g3b);
275 double alpha4=1-alpha1-alpha2;
279 if ((alpha1>-eps) && (alpha1<1.+eps))
280 if ((alpha2>-eps) && (alpha2<1.+eps))
281 if ((alpha3>-eps) && (alpha3<1.+eps))
282 if ((alpha4>-eps) && (alpha4<1.+eps))
return true;
376 if (((AC*AD>ZERO) || (AC*AD==ZERO)) && ((AC*
u<ZERO)||(AC*
u==ZERO)) )
return 0;
377 else if (((BC*BD>ZERO) || (BC*BD==ZERO)) && ((BC*
u>ZERO)||(BC*
u==ZERO)))
return 0;
392 t1=t1/(a2*
u.get_x()+b2*
u.get_y()+c2*
u.get_z());
401 t2=t2/(a1*
v.get_x()+b1*
v.get_y()+c1*
v.get_z());
428 #define PSCA(a,b) (a[0]*b[0]+a[1]*b[1]+a[2]*b[2])
429 #define EGAL(x,y,eps) (double)fabs((double)(x-y))<eps
430 #define DETER(a,b,c,d) (a*d-b*c)
453 double epsab=0.3333333333333*(fabs(ab[0])+fabs(ab[1])+fabs(ab[2]))*
EPS_BASE_RELATIVE;
454 double epsnm=0.3333333333333*(fabs(nm[0])+fabs(nm[1])+fabs(nm[2]))*
EPS_BASE_RELATIVE;
455 double epsam=0.3333333333333*(fabs(am[0])+fabs(am[1])+fabs(am[2]))*
EPS_BASE_RELATIVE;
457 if ( (
EGAL(ab[0],0,epsab)) && (
EGAL(nm[0],0,epsnm)) )
458 if (
EGAL(am[0],0,epsam)) equation[0]=0;
else return false;
459 if ( (
EGAL(ab[1],0,epsab)) && (
EGAL(nm[1],0,epsnm)) )
460 if (
EGAL(am[1],0,epsam)) equation[1]=0;
else return false;
461 if ( (
EGAL(ab[2],0,epsab)) && (
EGAL(nm[2],0,epsnm)) )
462 if (
EGAL(am[2],0,epsam)) equation[2]=0;
else return false;
463 equation[3]=equation[0]+equation[1]+equation[2];
466 double det=
DETER(ab[0],nm[0],ab[1],nm[1]);
467 double eps2=0.25*(fabs(ab[0])+fabs(nm[0])+fabs(ab[1])+fabs(nm[1]));
472 double sol1=det*
DETER(am[0],nm[0],am[1],nm[1]);
473 double sol2=det*
DETER(ab[0],am[0],ab[1],am[1]);
474 double epssol1=0.25*(fabs(am[0])+fabs(nm[0])+fabs(am[1])+fabs(nm[1]));
476 double epssol2=0.25*(fabs(ab[0])+fabs(am[0])+fabs(ab[1])+fabs(am[1]));
478 double eps3=0.5*(ab[2]+nm[2]);
480 if (fabs((
double)(sol1*ab[2]-sol2*nm[2]-am[2]))>eps3)
return false;
491 tmp=ab[1]*am[0]/ab[0];
492 eps=0.5*(fabs(ab[1])+fabs(am[0]));
493 eps=2*eps*eps/ab[0]+eps*eps/ab[0];
498 tmp=nm[1]*am[0]/nm[0];
499 eps=0.5*(fabs(nm[1])+fabs(am[0]));
500 eps=2*eps*eps/nm[0]+eps*eps/nm[0];
504 if (!(
EGAL(tmp,am[1],eps)))
return false;
515 if (equation[1]!=0) ne2=1;
else ne2=2;
523 double det2=
DETER(ab[ne1],nm[ne1],ab[ne2],nm[ne2]);
524 double eps2=0.25*(fabs(ab[ne1])+fabs(nm[ne1])+fabs(ab[ne2])+fabs(nm[ne2]));
529 double sol1=det*
DETER(am[ne1],nm[ne1],am[ne2],nm[ne2]);
530 double sol2=det*
DETER(ab[ne1],am[ne1],ab[ne2],am[ne2]);
531 double epssol1=0.25*(fabs(am[ne1])+fabs(nm[ne1])+fabs(am[ne2])+fabs(nm[ne2]));
533 double epssol2=0.25*(fabs(ab[ne1])+fabs(am[ne1])+fabs(ab[ne2])+fabs(am[ne2]));
545 tmp=ab[ne2]*am[ne1]/ab[ne1];
546 eps=0.5*(fabs(ab[ne2])+fabs(am[ne1]));
547 eps=2*eps*eps/ab[ne1]+eps*eps/ab[ne1];
552 tmp=nm[ne2]*am[ne1]/nm[ne1];
553 eps=0.5*(fabs(nm[ne2])+fabs(am[ne1]));
554 eps=2*eps*eps/nm[ne1]+eps*eps/nm[ne1];
558 if (!(
EGAL(tmp,am[ne2],eps)))
return false;
566 if (equation[0]!=0) ne1=0;
else
567 if (equation[1]!=0) ne1=1;
else ne1=2;
572 double tmp=1./ab[ne1];
573 double sol1=am[ne1]*tmp;
574 double sol2=an[ne1]*tmp;
593 if ((epssol1>1e-0) || (epssol2>1e-0))
594 std::cout << epssol1 <<
" " << epssol2 << std::endl;
597 if ( (sol1>epssol1) && ((sol1)<(1-epssol1)) && (sol2>epssol2) && ((sol2)<(1-epssol2)) )
return true;
598 if ( ( (
EGAL(sol1,0,epssol1)) || (
EGAL(sol1,1,epssol1))) && ( (sol2>epssol2) && ((sol2)<(1-epssol2)) ) )
return true;
599 if ( ( (
EGAL(sol2,0,epssol2)) || (
EGAL(sol2,1,epssol2))) && ( (sol1>epssol1) && ((sol1)<(1-epssol1)) ) )
return true;
606 if ( (sol1>epssol1) && ((sol1)<(1-epssol1)) )
return true;
607 if ( (sol2>epssol2) && ((sol2)<(1-epssol2)) )
return true;
608 if ( ((sol1)>(1+epssol1)) && ((-sol2)>epssol2) )
return true;
609 if ( ((sol2)>(1+epssol2)) && ((-sol1)>epssol1) )
return true;