/* * Rips_contraction.cpp * * Created on: Nov 28, 2014 * Author: dsalinas */ #include #include #include #include "gudhi/Edge_contraction.h" #include "gudhi/Skeleton_blocker.h" #include "gudhi/Off_reader.h" using namespace std; using namespace Gudhi; using namespace skbl; using namespace contraction; struct Geometry_trait{ typedef std::vector Point; }; typedef Geometry_trait::Point Point; typedef Skeleton_blocker_simple_geometric_traits Complex_geometric_traits; typedef Skeleton_blocker_geometric_complex< Complex_geometric_traits > Complex; typedef Edge_profile Profile; typedef Skeleton_blocker_contractor Complex_contractor; template double eucl_distance(const Point& a,const Point& b){ double res = 0; auto a_coord = a.begin(); auto b_coord = b.begin(); for(; a_coord != a.end(); a_coord++, b_coord++){ res += (*a_coord - *b_coord) * (*a_coord - *b_coord); } return sqrt(res); } template void build_rips(ComplexType& complex, double offset){ if (offset<=0) return; auto vertices = complex.vertex_range(); for (auto p = vertices.begin(); p != vertices.end(); ++p) for (auto q = p; ++q != vertices.end(); /**/) if (eucl_distance(complex.point(*p), complex.point(*q)) < 2 * offset) complex.add_edge(*p,*q); } int main (int argc, char *argv[]) { if (argc!=3){ std::cerr << "Usage "< off_reader(argv[1],complex,true); if(!off_reader.is_valid()){ std::cerr << "Unable to read file:"<, //todo make_edge_length_cost contraction::make_first_vertex_placement(), contraction::make_link_valid_contraction(), contraction::make_remove_popable_blockers_visitor()); contractor.contract_edges(); std::cout << "Resulting complex has "<< complex.num_vertices()<<" vertices, "<< complex.num_edges()<<"edges and "<< complex.num_blockers()<<" blockers"<