added:
- RayLineIntersection - RaySegmentIntersection - SegmentSegmentIntersection
This commit is contained in:
parent
9732b0f8b8
commit
9ec0e7b571
|
@ -30,6 +30,7 @@
|
||||||
#ifndef __VCGLIB_INTERSECTION_2
|
#ifndef __VCGLIB_INTERSECTION_2
|
||||||
#define __VCGLIB_INTERSECTION_2
|
#define __VCGLIB_INTERSECTION_2
|
||||||
#include <vcg/space/line2.h>
|
#include <vcg/space/line2.h>
|
||||||
|
#include <vcg/space/ray2.h>
|
||||||
#include <vcg/space/segment2.h>
|
#include <vcg/space/segment2.h>
|
||||||
#include <vcg/space/point2.h>
|
#include <vcg/space/point2.h>
|
||||||
#include <vcg/space/triangle2.h>
|
#include <vcg/space/triangle2.h>
|
||||||
|
@ -37,6 +38,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace vcg {
|
namespace vcg {
|
||||||
/** \addtogroup space */
|
/** \addtogroup space */
|
||||||
/*@{*/
|
/*@{*/
|
||||||
|
@ -90,6 +92,46 @@ inline bool LineLineIntersection(const vcg::Line2<SCALAR_TYPE> & l0,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///return if exist the intersection point
|
||||||
|
///between 2 lines in a 2d plane
|
||||||
|
template<class SCALAR_TYPE>
|
||||||
|
inline bool RayLineIntersection(const vcg::Line2<SCALAR_TYPE> & l,
|
||||||
|
const vcg::Ray2<SCALAR_TYPE> & r,
|
||||||
|
Point2<SCALAR_TYPE> &p)
|
||||||
|
{
|
||||||
|
///construct line from ray
|
||||||
|
vcg::Line2<SCALAR_TYPE> l_test;
|
||||||
|
l_test.Set(r.Origin(),r.Direction());
|
||||||
|
if (!LineLineIntersection(l,l_test,p))
|
||||||
|
return false;
|
||||||
|
Point2<SCALAR_TYPE> dir=p-r.Origin();
|
||||||
|
dir.Normalize();
|
||||||
|
return (dir*r.Direction()>0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// interseciton between point and triangle
|
||||||
|
template<class SCALAR_TYPE>
|
||||||
|
inline bool RaySegmentIntersection(const vcg::Ray2<SCALAR_TYPE> & r,
|
||||||
|
const vcg::Segment2<SCALAR_TYPE> &seg,
|
||||||
|
Point2<SCALAR_TYPE> &p_inters)
|
||||||
|
{
|
||||||
|
///first compute intersection between lines
|
||||||
|
vcg::Line2<SCALAR_TYPE> line2;
|
||||||
|
line2.SetOrigin(seg.P0());
|
||||||
|
vcg::Point2<SCALAR_TYPE> dir=seg.P1()-seg.P0();
|
||||||
|
dir.Normalize();
|
||||||
|
line2.SetDirection(dir);
|
||||||
|
if(!RayLineIntersection<SCALAR_TYPE>(line2,r,p_inters))
|
||||||
|
return false;
|
||||||
|
///then test if intersection point is nearest
|
||||||
|
///to both extremes then lenght of the segment
|
||||||
|
SCALAR_TYPE d0=(seg.P1()-p_inters).Norm();
|
||||||
|
SCALAR_TYPE d1=(seg.P0()-p_inters).Norm();
|
||||||
|
SCALAR_TYPE lenght=(seg.P0()-seg.P1()).Norm();
|
||||||
|
return ((d0<lenght)&&(d1<lenght));
|
||||||
|
}
|
||||||
|
|
||||||
/// 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,
|
||||||
|
@ -112,6 +154,38 @@ inline bool LineSegmentIntersection(const vcg::Line2<SCALAR_TYPE> & line,
|
||||||
return ((d0<lenght)&&(d1<lenght));
|
return ((d0<lenght)&&(d1<lenght));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// interseciton between point and triangle
|
||||||
|
template<class SCALAR_TYPE>
|
||||||
|
inline bool SegmentSegmentIntersection(const vcg::Segment2<SCALAR_TYPE> &seg0,
|
||||||
|
const vcg::Segment2<SCALAR_TYPE> &seg1,
|
||||||
|
Point2<SCALAR_TYPE> &p_inters)
|
||||||
|
{
|
||||||
|
///test intersection of bbox
|
||||||
|
vcg::Box2<SCALAR_TYPE> bb0,bb1;
|
||||||
|
bb0.Add(seg0.P0());
|
||||||
|
bb0.Add(seg0.P1());
|
||||||
|
bb1.Add(seg1.P0());
|
||||||
|
bb1.Add(seg1.P1());
|
||||||
|
if (!bb0.Collide(bb1))
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
///first compute intersection between lines
|
||||||
|
vcg::Line2<SCALAR_TYPE> l0,l1;
|
||||||
|
|
||||||
|
l0.SetOrigin(seg0.P0());
|
||||||
|
vcg::Point2<SCALAR_TYPE> dir0=seg0.P1()-seg0.P0();
|
||||||
|
dir0.Normalize();
|
||||||
|
l0.SetDirection(dir0);
|
||||||
|
l1.SetOrigin(seg1.P0());
|
||||||
|
vcg::Point2<SCALAR_TYPE> dir1=seg1.P1()-seg1.P0();
|
||||||
|
dir1.Normalize();
|
||||||
|
l1.SetDirection(dir1);
|
||||||
|
return ((LineSegmentIntersection<SCALAR_TYPE>(l0,seg1,p_inters))&&
|
||||||
|
(LineSegmentIntersection<SCALAR_TYPE>(l1,seg0,p_inters)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// interseciton between point and triangle
|
/// interseciton between point and triangle
|
||||||
template<class SCALAR_TYPE>
|
template<class SCALAR_TYPE>
|
||||||
inline bool IsInsideTrianglePoint( const Triangle2<SCALAR_TYPE> & t,const Point2<SCALAR_TYPE> & p)
|
inline bool IsInsideTrianglePoint( const Triangle2<SCALAR_TYPE> & t,const Point2<SCALAR_TYPE> & p)
|
||||||
|
|
Loading…
Reference in New Issue