From f527cde6342c5b8109a20f0a6b483327c6569844 Mon Sep 17 00:00:00 2001 From: salinasd Date: Tue, 27 Jan 2015 10:20:13 +0000 Subject: Merge GudhUI, a UI for gudhi based on Qt git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@427 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 17fedd974f14a8225b27d94361e835964eeb5cba --- src/GudhUI/utils/Edge_contractor.h | 68 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/GudhUI/utils/Edge_contractor.h (limited to 'src/GudhUI/utils/Edge_contractor.h') diff --git a/src/GudhUI/utils/Edge_contractor.h b/src/GudhUI/utils/Edge_contractor.h new file mode 100644 index 00000000..c7a86e0b --- /dev/null +++ b/src/GudhUI/utils/Edge_contractor.h @@ -0,0 +1,68 @@ +/* + * Contractor.h + * + * Created on: Sep 25, 2014 + * Author: dsalinas + */ + +#ifndef EDGE_CONTRACTOR_H_ +#define EDGE_CONTRACTOR_H_ + + +#include "gudhi/Skeleton_blocker_contractor.h" + +#include "gudhi/Contraction/Edge_profile.h" +#include "gudhi/Contraction/policies/Cost_policy.h" + + +/** + * Iteratively puts every vertex at the center of its neighbors + */ +template class Edge_contractor{ +private: + SkBlComplex& complex_; + unsigned num_contractions_; + + /** + * @brief return a cost corresponding to the squared length of the edge + */ + template< typename EdgeProfile> class Length_cost : public contraction::Cost_policy{ + public: + typedef typename contraction::Cost_policy::Cost_type Cost_type; + typedef typename EdgeProfile::Point Point; + Cost_type operator()(const EdgeProfile& profile, const boost::optional& placement) const override{ + Cost_type res; + if(!placement) return res; + return Geometry_trait::Squared_distance_d()(profile.p0(),profile.p1()); //not working?? + } + }; + + public: + typedef typename SkBlComplex::Vertex_handle Vertex_handle; + typedef typename SkBlComplex::Edge_handle Edge_handle; + + /** + * @brief Modify complex to be the expansion of the k-nearest neighbor + * symetric graph. + */ + Edge_contractor(SkBlComplex& complex,unsigned num_contractions): + complex_(complex),num_contractions_(num_contractions) + { + typedef typename contraction::Edge_profile Profile; + num_contractions = (std::min)((int)num_contractions,(int)(complex_.num_vertices()-1)); + contraction::Skeleton_blocker_contractor contractor( + complex_, + new Length_cost>(), + contraction::make_first_vertex_placement(), + contraction::make_link_valid_contraction(), + contraction::make_remove_popable_blockers_visitor() + ); + contractor.contract_edges(num_contractions); + } + + +}; + + + +#endif /* EDGE_CONTRACTOR_H_ */ -- cgit v1.2.3