00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef __VCGLIB_EDGE_DISTANCE
00030 #define __VCGLIB_EDGE_DISTANCE
00031
00032 #include <vcg/math/base.h>
00033 #include <vcg/space/point3.h>
00034 #include <vcg/space/segment3.h>
00035
00036
00037 namespace vcg {
00038 namespace edge{
00039
00040
00041 template <class EdgeType>
00042 bool PointDistance( const EdgeType &e,
00043 const vcg::Point3<typename EdgeType::ScalarType> & q,
00044 typename EdgeType::ScalarType & dist,
00045 vcg::Point3<typename EdgeType::ScalarType> & p )
00046 {
00047 vcg::Segment3<typename EdgeType::ScalarType> s;
00048 s.P0()=e.V(0)->P();
00049 s.P1()=e.V(1)->P();
00050 typename EdgeType::CoordType nearest;
00051 nearest=vcg::ClosestPoint<typename EdgeType::ScalarType>(s,q);
00052 typename EdgeType::ScalarType d=(q-nearest).Norm();
00053 if (d<dist){
00054 dist=d;
00055 p=nearest;
00056 return true;
00057 }
00058 else
00059 return false;
00060 }
00061
00062 template <class S>
00063 class PointDistanceFunctor {
00064 public:
00065 typedef S ScalarType;
00066 typedef Point3<ScalarType> QueryType;
00067 static inline const Point3<ScalarType> & Pos(const QueryType & qt) {return qt;}
00068
00069 template <class EDGETYPE, class SCALARTYPE>
00070 inline bool operator () (const EDGETYPE & e, const Point3<SCALARTYPE> & p, SCALARTYPE & minDist, Point3<SCALARTYPE> & q) {
00071 const Point3<typename EDGETYPE::ScalarType> fp = Point3<typename EDGETYPE::ScalarType>::Construct(p);
00072 Point3<typename EDGETYPE::ScalarType> fq;
00073 typename EDGETYPE::ScalarType md = (typename EDGETYPE::ScalarType)(minDist);
00074 const bool ret = vcg::edge::PointDistance(e, fp, md, fq);
00075 minDist = (SCALARTYPE)(md);
00076 q = Point3<SCALARTYPE>::Construct(fq);
00077 return (ret);
00078 }
00079 };
00080
00081 }
00082
00083 }
00084
00085
00086 #endif
00087