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_collapsor.h | 84 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 src/GudhUI/utils/Edge_collapsor.h (limited to 'src/GudhUI/utils/Edge_collapsor.h') diff --git a/src/GudhUI/utils/Edge_collapsor.h b/src/GudhUI/utils/Edge_collapsor.h new file mode 100644 index 00000000..9cf880e0 --- /dev/null +++ b/src/GudhUI/utils/Edge_collapsor.h @@ -0,0 +1,84 @@ +/* + * Collapsor.h + * + * Created on: Sep 25, 2014 + * Author: dsalinas + */ + +#ifndef COLLAPSOR_H_ +#define COLLAPSOR_H_ + +#include +#include "utils/Edge_contractor.h" + +/** + * Iteratively puts every vertex at the center of its neighbors + */ +template class Edge_collapsor{ +private: + SkBlComplex& complex_; + unsigned num_collapses_; +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_collapsor(SkBlComplex& complex,unsigned num_collapses): + complex_(complex),num_collapses_(num_collapses) + { + std::list edges; + edges.insert(edges.begin(),complex_.edge_range().begin(),complex_.edge_range().end()); + + edges.sort( + [&](Edge_handle e1,Edge_handle e2){ + return squared_edge_length(e1) < squared_edge_length(e2); + }); + + collapse_edges(edges); + + } + +private: + + + void collapse_edges(std::list& edges){ + while(!edges.empty() && num_collapses_--){ + Edge_handle current_edge = edges.front(); + edges.pop_front(); + if(is_link_reducible(current_edge)) + complex_.remove_edge(current_edge); + } + + } + + bool is_link_reducible(Edge_handle e){ + auto link = complex_.link(e); + + if(link.empty()) return false; + + if(link.is_cone()) return true; + + if(link.num_connected_components()>1) return false; + + Edge_contractor contractor(link,link.num_vertices()-1); + + return (link.num_vertices()==1); + } + + + double squared_edge_length(Edge_handle e) const{ + return squared_eucl_distance(complex_.point(complex_.first_vertex(e)),complex_.point(complex_.second_vertex(e))); + } + + double squared_eucl_distance(const Point& p1,const Point& p2) const{ + return Geometry_trait::Squared_distance_d()(p1,p2); + } + +}; + + + +#endif /* COLLAPSOR_H_ */ -- cgit v1.2.3