Changed implementation of WeightedRips to store simplex values (max distance between simplices' vertices) as an invisible layer on top of each simplex object, so that the data() field of WeightedRips has been freed for use by the users again.
#include "geometry/euclidean.h"
#include <vector>
#include <iostream>
#include <cmath>
typedef Kernel<double> K;
typedef K::Point Point;
typedef K::Sphere Sphere;
typedef K::PointContainer PointContainer;
typedef K::MatrixType MatrixType;
int main()
{
K k(3);
std::vector<Point> points(6, k.origin());
points[0][0] = 0; points[0][1] = 0; points[0][2] = 0;
points[1][0] = 0; points[1][1] = 2; points[1][2] = 0;
points[2][0] = 0; points[2][1] = 0; points[2][2] = 5;
points[3][0] = 1; points[3][1] = 1; points[3][2] = 1;
points[4][0] = 0; points[4][1] = 1; points[4][2] = 0;
points[5][0] = 1; points[5][1] = 0; points[5][2] = 0;
// Edges
{
PointContainer vertices(2);
vertices[0] = &points[0]; vertices[1] = &points[2];
std::cout << "{0, 2}:" << std::endl;
Sphere s = k.circumsphere(vertices);
std::cout << "Circumsphere: " << s.center() << " " << s.squared_radius() << std::endl;
std::cout << "Side of: " << k.side_of_circumsphere(vertices, *vertices[1]) << std::endl;
std::cout << std::endl;
vertices[0] = &points[0]; vertices[1] = &points[3];
std::cout << "{0, 3}:" << std::endl;
s = k.circumsphere(vertices);
std::cout << "Circumsphere: " << s.center() << " " << s.squared_radius() << std::endl;
std::cout << "Side of: " << k.side_of_circumsphere(vertices, *vertices[1]) << std::endl;
std::cout << std::endl;
}
// Triangles
{
PointContainer vertices(3);
vertices[0] = &points[0]; vertices[1] = &points[3]; vertices[2] = &points[1];
std::cout << "{0, 3, 1}:" << std::endl;;
Sphere s = k.circumsphere(vertices);
std::cout << "Circumsphere: " << s.center() << " " << s.squared_radius() << std::endl;
std::cout << "Side of: " << k.side_of_circumsphere(vertices, *vertices[1]) << std::endl;
std::cout << std::endl;
vertices[0] = &points[0]; vertices[1] = &points[4]; vertices[2] = &points[5];
std::cout << "{0, 4, 5}:" << std::endl;
s = k.circumsphere(vertices);
std::cout << "Circumsphere: " << s.center() << " " << s.squared_radius() << std::endl;
std::cout << "Side of: " << k.side_of_circumsphere(vertices, *vertices[1]) << std::endl;
std::cout << std::endl;
}
// Tetrahedron
{
PointContainer vertices(4);
vertices[0] = &points[3]; vertices[1] = &points[1]; vertices[2] = &points[2]; vertices[3] = &points[0];
std::cout << "{3, 1, 2, 0}:" << std::endl;
Sphere s = k.circumsphere(vertices);
std::cout << "Circumsphere: " << s.center() << " " << s.squared_radius() << std::endl;
std::cout << "Side of: " << k.side_of_circumsphere(vertices, *vertices[1]) << std::endl;
std::cout << s.center().squared_distance(points[0]) << std::endl;
std::cout << std::endl;
}
{
PointContainer vertices(3);
vertices[0] = &points[3]; vertices[1] = &points[1]; vertices[2] = &points[2];
std::cout << "{3, 1, 2}:" << std::endl;
Sphere s = k.circumsphere(vertices);
std::cout << "Circumsphere: " << s.center() << " " << s.squared_radius() << std::endl;
std::cout << "Side of: " << k.side_of_circumsphere(vertices, points[0]) << std::endl;
std::cout << "Distance: " << points[0].squared_distance(s.center()) << std::endl;
std::cout << s.center().squared_distance(points[0]) << std::endl;
std::cout << std::endl;
}
}