added RayBoxIntersection function and RaySegmentIntersectionFunctor
This commit is contained in:
parent
565308c80d
commit
433d070691
|
@ -40,7 +40,7 @@ added circle-line intersection
|
||||||
#include <vcg/space/point2.h>
|
#include <vcg/space/point2.h>
|
||||||
#include <vcg/space/triangle2.h>
|
#include <vcg/space/triangle2.h>
|
||||||
#include <vcg/space/box2.h>
|
#include <vcg/space/box2.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -137,6 +137,34 @@ namespace vcg {
|
||||||
return ((d0<length)&&(d1<length));
|
return ((d0<length)&&(d1<length));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// interseciton between point and triangle
|
||||||
|
template<class SCALAR_TYPE>
|
||||||
|
inline bool RayBoxIntersection(const vcg::Ray2<SCALAR_TYPE> & r,
|
||||||
|
const vcg::Box2<SCALAR_TYPE> &bbox,
|
||||||
|
Point2<SCALAR_TYPE> &p_inters)
|
||||||
|
{
|
||||||
|
///first create the 4 segments
|
||||||
|
vcg::Segment2<SCALAR_TYPE> S[4];
|
||||||
|
for (int i=0;i<4;i++)
|
||||||
|
S[i]=vcg::Segment2<SCALAR_TYPE>(bbox.P(i),bbox.P((i+1)%4));
|
||||||
|
|
||||||
|
SCALAR_TYPE mind=std::numeric_limits<SCALAR_TYPE>::max();
|
||||||
|
bool found=false;
|
||||||
|
for (int i=0;i<4;i++)
|
||||||
|
{
|
||||||
|
Point2<SCALAR_TYPE> p_inters_test;
|
||||||
|
if (!RaySegmentIntersection(r,S[i],p_inters_test))continue;
|
||||||
|
SCALAR_TYPE Norm=(p_inters_test-r.Origin()).Norm();
|
||||||
|
if (Norm<mind)
|
||||||
|
{
|
||||||
|
mind=Norm;
|
||||||
|
p_inters=p_inters_test;
|
||||||
|
found=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
/// interseciton between point and triangle
|
/// interseciton between point and triangle
|
||||||
template<class SCALAR_TYPE>
|
template<class SCALAR_TYPE>
|
||||||
inline bool LineSegmentIntersection(const vcg::Line2<SCALAR_TYPE> & line,
|
inline bool LineSegmentIntersection(const vcg::Line2<SCALAR_TYPE> & line,
|
||||||
|
@ -333,6 +361,28 @@ namespace vcg {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Ray-Segment Functor
|
||||||
|
class RaySegmentIntersectionFunctor {
|
||||||
|
public:
|
||||||
|
|
||||||
|
template <class SEGMENTTYPE, class SCALARTYPE>
|
||||||
|
inline bool operator () (const SEGMENTTYPE & S,
|
||||||
|
const Ray2<SCALARTYPE> & ray,
|
||||||
|
SCALARTYPE & t)
|
||||||
|
{
|
||||||
|
typedef SCALARTYPE ScalarType;
|
||||||
|
typedef vcg::Point2<ScalarType> CoordType;
|
||||||
|
|
||||||
|
CoordType inters_test;
|
||||||
|
bool bret = RaySegmentIntersection(ray,S, inters_test);
|
||||||
|
if (bret)
|
||||||
|
t=(inters_test-ray.Origin()).Norm();
|
||||||
|
return (bret);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/*@}*/
|
/*@}*/
|
||||||
} // end namespace
|
} // end namespace
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue