Corrected SegmentPointSquaredDistance to do not use anymore a hardcoded EPSilon value...

This commit is contained in:
Paolo Cignoni 2012-07-02 16:45:49 +00:00
parent 776fbe45a0
commit b08fda7641
1 changed files with 6 additions and 7 deletions

View File

@ -222,22 +222,21 @@ void LineLineDistance(const vcg::Line3<ScalarType> &mLine0,
* @param[in] sqr_dist The squared distance * @param[in] sqr_dist The squared distance
*/ */
template <class ScalarType> template <class ScalarType>
void SegmentPointSquaredDistance( Segment3<ScalarType> s, void SegmentPointSquaredDistance( const Segment3<ScalarType> &s,
const Point3<ScalarType> & p, const Point3<ScalarType> & p,
Point3< ScalarType > &closest, Point3< ScalarType > &closest,
ScalarType &sqr_dist) ScalarType &sqr_dist)
{ {
Point3<ScalarType> e = s.P1()-s.P0(); Point3<ScalarType> e = s.P1()-s.P0();
ScalarType EPS=0.00000001; ScalarType eSquaredNorm = e.SquaredNorm();
if (e.Norm()<EPS) if (eSquaredNorm < std::numeric_limits<ScalarType>::min())
{ {
Point3<ScalarType> AvP=(s.P0()+s.P1())/2.0; closest=s.MidPoint();
closest=AvP; sqr_dist=SquaredDistance(closest,p);
sqr_dist=(AvP-p).Norm();
} }
else else
{ {
ScalarType t = ((p-s.P0())*e)/e.SquaredNorm(); ScalarType t = ((p-s.P0())*e)/eSquaredNorm;
if(t<0) t = 0; if(t<0) t = 0;
else if(t>1) t = 1; else if(t>1) t = 1;
closest = s.P0()+e*t; closest = s.P0()+e*t;