summaryrefslogtreecommitdiff
path: root/src/Contraction/example/Rips_contraction.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Contraction/example/Rips_contraction.cpp')
-rw-r--r--src/Contraction/example/Rips_contraction.cpp27
1 files changed, 10 insertions, 17 deletions
diff --git a/src/Contraction/example/Rips_contraction.cpp b/src/Contraction/example/Rips_contraction.cpp
index 8d9b1ca2..bd0a8b8c 100644
--- a/src/Contraction/example/Rips_contraction.cpp
+++ b/src/Contraction/example/Rips_contraction.cpp
@@ -24,42 +24,34 @@
#include "gudhi/Edge_contraction.h"
#include "gudhi/Skeleton_blocker.h"
#include "gudhi/Off_reader.h"
-
+#include "gudhi/Point.h"
using namespace std;
using namespace Gudhi;
using namespace skbl;
using namespace contraction;
+
struct Geometry_trait{
- typedef std::vector<double> Point;
+ typedef Point_d Point;
};
+
typedef Geometry_trait::Point Point;
typedef Skeleton_blocker_simple_geometric_traits<Geometry_trait> Complex_geometric_traits;
typedef Skeleton_blocker_geometric_complex< Complex_geometric_traits > Complex;
typedef Edge_profile<Complex> Profile;
typedef Skeleton_blocker_contractor<Complex> Complex_contractor;
-template<typename Point>
-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<typename ComplexType>
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)
+ for (auto q = p; ++q != vertices.end(); /**/){
+ if ( squared_dist(complex.point(*p), complex.point(*q)) < 4 * offset * offset)
complex.add_edge(*p,*q);
+ }
}
int main (int argc, char *argv[])
@@ -71,13 +63,14 @@ int main (int argc, char *argv[])
Complex complex;
- // load the points
+ // load only the points
Skeleton_blocker_off_reader<Complex> off_reader(argv[1],complex,true);
if(!off_reader.is_valid()){
std::cerr << "Unable to read file:"<<argv[1]<<std::endl;
return EXIT_FAILURE;
}
- std::cout << "Build the Rips complex"<<std::endl;
+
+ std::cout << "Build the Rips complex with "<<complex.num_vertices()<<" vertices"<<std::endl;
build_rips(complex,atof(argv[2]));