error in plane segment corrected
This commit is contained in:
parent
7263ed4589
commit
6524344684
|
@ -24,6 +24,11 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.2 2004/04/26 12:34:50 ganovelli
|
||||||
|
plane line
|
||||||
|
plane segment
|
||||||
|
triangle triangle added
|
||||||
|
|
||||||
Revision 1.1 2004/04/21 14:22:27 cignoni
|
Revision 1.1 2004/04/21 14:22:27 cignoni
|
||||||
Initial Commit
|
Initial Commit
|
||||||
|
|
||||||
|
@ -99,16 +104,40 @@ inline bool Intersection( const Plane3<T> & pl, const Line3<T> & li, Point3<T> &
|
||||||
template<class T>
|
template<class T>
|
||||||
inline bool Intersection( const Plane3<T> & pl, const Segment3<T> & sg, Point3<T> & po){
|
inline bool Intersection( const Plane3<T> & pl, const Segment3<T> & sg, Point3<T> & po){
|
||||||
const T epsilon = T(1e-8);
|
const T epsilon = T(1e-8);
|
||||||
T k = pl.d - pl.n * (sg.P1()-sg.P0());
|
|
||||||
|
T k = pl.Direction() * (sg.P1()-sg.P0());
|
||||||
if( (k > -epsilon) && (k < epsilon))
|
if( (k > -epsilon) && (k < epsilon))
|
||||||
return false;
|
return false;
|
||||||
T r = (pl.d - pl.n*sg.P0())/k; // Compute ray distance
|
T r = (pl.Offset() - pl.Direction()*sg.P0())/k; // Compute ray distance
|
||||||
if( (r<0) || (r > 1.0))
|
if( (r<0) || (r > 1.0))
|
||||||
return false;
|
return false;
|
||||||
po = sg.P0()*(1-r)+sg.P1() * r;
|
po = sg.P0()*(1-r)+sg.P1() * r;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// intersection between plane and triangle
|
||||||
|
// not optimal: uses plane-segment intersection (and the fact the two or none edges can be intersected)
|
||||||
|
template<class T, class TRIANGLE >
|
||||||
|
inline bool Intersection( const Plane3<T> & pl, const TRIANGLE & tr, Segment3<T> & sg){
|
||||||
|
if(Intersection(pl,Segment3<T>(tr.P(0),tr.P(1)),sg.P0())){
|
||||||
|
if(Intersection(pl,Segment3<T>(tr.P(0),tr.P(2)),sg.P1()))
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Intersection(pl,Segment3<T>(tr.P(1),tr.P(2)),sg.P1());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
if(Intersection(pl,Segment3<T>(tr.P(1),tr.P(2)),sg.P0()))
|
||||||
|
{
|
||||||
|
Intersection(pl,Segment3<T>(tr.P(0),tr.P(2)),sg.P1());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/// intersection between two triangles
|
/// intersection between two triangles
|
||||||
template<class T>
|
template<class T>
|
||||||
inline bool Intersection( Triangle3<T> t0,Triangle3<T> t1){
|
inline bool Intersection( Triangle3<T> t0,Triangle3<T> t1){
|
||||||
|
@ -139,5 +168,7 @@ inline bool Intersection( Triangle3<T> t0,Triangle3<T> t1,bool &coplanar,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} // end namespace
|
} // end namespace
|
||||||
#endif
|
#endif
|
Loading…
Reference in New Issue