added possibility to pass a functor to evaluate the distance between two vertices

other than the EuclideanDistance (which is the default value)
This commit is contained in:
ganovelli 2009-01-23 17:15:43 +00:00
parent 3d5ccb47f9
commit 79b2ad6eef
1 changed files with 21 additions and 8 deletions

View File

@ -58,7 +58,18 @@ basic example: farthest vertex from a specified one
*/ */
namespace vcg{ namespace vcg{
namespace tri{ namespace tri{
template <class MeshType> template <class MeshType>
struct EuclideanDistance{
typedef typename MeshType::VertexType VertexType;
typedef typename MeshType::ScalarType ScalarType;
EuclideanDistance(){}
ScalarType operator()(const VertexType * v0, const VertexType * v1) const
{return vcg::Distance(v0->cP(),v1->cP());}
};
template <class MeshType, class DistanceFunctor = EuclideanDistance<MeshType> >
class Geo{ class Geo{
public: public:
@ -71,6 +82,7 @@ class Geo{
typedef typename MeshType::ScalarType ScalarType; typedef typename MeshType::ScalarType ScalarType;
/* Auxiliary class for keeping the heap of vertices to visit and their estimated distance /* Auxiliary class for keeping the heap of vertices to visit and their estimated distance
*/ */
struct VertDist{ struct VertDist{
@ -116,13 +128,14 @@ class Geo{
const ScalarType &d_curr) const ScalarType &d_curr)
{ {
ScalarType curr_d=0; ScalarType curr_d=0;
CoordType w_c = pw->cP()- curr->cP();
CoordType w_w1 = pw->cP()- pw1->cP();
CoordType w1_c = pw1->cP()- curr->cP();
ScalarType ew_c = (w_c).Norm(); ScalarType ew_c = DistanceFunctor()(pw,curr);
ScalarType ew_w1 = (w_w1).Norm(); ScalarType ew_w1 = DistanceFunctor()(pw,pw1);
ScalarType ec_w1 = (w1_c).Norm(); ScalarType ec_w1 = DistanceFunctor()(pw1,curr);
CoordType w_c = (pw->cP()-curr->cP()).Normalize() * ew_c;
CoordType w_w1 = (pw->cP() - pw1->cP()).Normalize() * ew_w1;
CoordType w1_c = (pw1->cP() - curr->cP()).Normalize() * ec_w1;
ScalarType alpha,alpha_, beta,beta_,theta,h,delta,s,a,b; ScalarType alpha,alpha_, beta,beta_,theta,h,delta,s,a,b;
alpha = acos((w_c.dot(w1_c))/(ew_c*ec_w1)); alpha = acos((w_c.dot(w1_c))/(ew_c*ec_w1));
@ -238,7 +251,7 @@ class Geo{
const ScalarType & d_pw1 = (*TD)[pw1].d; const ScalarType & d_pw1 = (*TD)[pw1].d;
{ {
const ScalarType inter = (curr->P() - pw1->P()).Norm(); const ScalarType inter = DistanceFunctor()(curr,pw1);//(curr->P() - pw1->P()).Norm();
const ScalarType tol = (inter + d_curr + d_pw1)*.0001f; const ScalarType tol = (inter + d_curr + d_pw1)*.0001f;
if ( ((*TD)[pw1].source != (*TD)[curr].source)||// not the same source if ( ((*TD)[pw1].source != (*TD)[curr].source)||// not the same source
@ -246,7 +259,7 @@ class Geo{
(inter + d_pw1 < d_curr +tol ) || (inter + d_pw1 < d_curr +tol ) ||
(d_curr + d_pw1 < inter +tol ) // triangular inequality (d_curr + d_pw1 < inter +tol ) // triangular inequality
) )
curr_d = d_curr + (pw->P()-curr->P()).Norm(); curr_d = d_curr + DistanceFunctor()(pw,curr);//(pw->P()-curr->P()).Norm();
else else
curr_d = Distance(pw,pw1,curr,d_pw1,d_curr); curr_d = Distance(pw,pw1,curr,d_pw1,d_curr);