summaryrefslogtreecommitdiff
path: root/src/GudhUI/utils/Edge_collapsor.h
diff options
context:
space:
mode:
authorsalinasd <salinasd@636b058d-ea47-450e-bf9e-a15bfbe3eedb>2015-01-27 10:20:13 +0000
committersalinasd <salinasd@636b058d-ea47-450e-bf9e-a15bfbe3eedb>2015-01-27 10:20:13 +0000
commitf527cde6342c5b8109a20f0a6b483327c6569844 (patch)
tree1c0464b56b21ef7767f814b9a35a6e5c68aa7613 /src/GudhUI/utils/Edge_collapsor.h
parentdf6c26bdcb28805e8949d08dad5acd012e91ecb8 (diff)
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
Diffstat (limited to 'src/GudhUI/utils/Edge_collapsor.h')
-rw-r--r--src/GudhUI/utils/Edge_collapsor.h84
1 files changed, 84 insertions, 0 deletions
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 <list>
+#include "utils/Edge_contractor.h"
+
+/**
+ * Iteratively puts every vertex at the center of its neighbors
+ */
+template<typename SkBlComplex> 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<Edge_handle> 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<Edge_handle>& 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<Complex> 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_ */