summaryrefslogtreecommitdiff
path: root/src/GudhUI/utils/Vertex_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/Vertex_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/Vertex_collapsor.h')
-rw-r--r--src/GudhUI/utils/Vertex_collapsor.h76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/GudhUI/utils/Vertex_collapsor.h b/src/GudhUI/utils/Vertex_collapsor.h
new file mode 100644
index 00000000..d4911a35
--- /dev/null
+++ b/src/GudhUI/utils/Vertex_collapsor.h
@@ -0,0 +1,76 @@
+/*
+ * Vertex_collapsor.h
+ *
+ * Created on: Sep 25, 2014
+ * Author: dsalinas
+ */
+
+#ifndef VERTEX_COLLAPSOR_H_
+#define VERTEX_COLLAPSOR_H_
+
+#include "utils/Edge_contractor.h"
+#include "utils/Furthest_point_epsilon_net.h"
+#include "utils/UI_utils.h"
+/**
+ * Iteratively puts every vertex at the center of its neighbors
+ */
+template<typename SkBlComplex> class Vertex_collapsor{
+private:
+ SkBlComplex& complex_;
+ size_t 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.
+ */
+ Vertex_collapsor(SkBlComplex& complex, size_t num_collapses) :
+ complex_(complex),num_collapses_(num_collapses)
+ {
+// std::list<Vertex_handle> vertices;
+// vertices.insert(vertices.begin(),complex_.vertex_range().begin(),complex_.vertex_range().end());
+// UIDBG("Collapse vertices");
+// collapse_vertices(vertices);
+
+ std::list<Vertex_handle> vertices;
+
+ UIDBG("Compute eps net");
+ Furthest_point_epsilon_net<Complex> eps_net(complex_);
+
+ for(auto vh : eps_net.net_filtration_)
+ vertices.push_back(vh.vertex_handle);
+
+ UIDBG("Collapse vertices");
+ collapse_vertices(vertices);
+
+
+
+ }
+
+private:
+
+
+ void collapse_vertices(std::list<Vertex_handle>& vertices){
+ while(!vertices.empty() && num_collapses_--){
+ Vertex_handle current_vertex = vertices.front();
+ vertices.pop_front();
+ if(is_link_reducible(current_vertex))
+ complex_.remove_vertex(current_vertex);
+ }
+ }
+
+ bool is_link_reducible(Vertex_handle v){
+ auto link = complex_.link(v);
+ 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);
+ }
+
+};
+
+
+#endif /* VERTEX_COLLAPSOR_H_ */