Wildmeshing Toolkit
Loading...
Searching...
No Matches
delaunay_geogram.cpp
Go to the documentation of this file.
2
3#include <cassert>
4#include <mutex>
6
7#include <Delaunay_psm.h>
8
10
11std::tuple<Eigen::MatrixXd, Eigen::MatrixXi> delaunay_geogram(
12 Eigen::Ref<const Eigen::MatrixXd> points)
13{
14 Eigen::MatrixXd vertices;
15 Eigen::MatrixXi tetrahedra;
16
17 if (points.rows() == 0) {
18 wmtk::logger().warn("Cannot run delaunay on an empty point set");
19 return {vertices, tetrahedra};
20 }
21
22 int64_t dim = points.cols();
23
24 static std::once_flag once_flag;
25 std::call_once(once_flag, []() { GEO::initialize(); });
26
27 GEO::Delaunay_var engine;
28 switch (dim) {
29 case 2: {
30 engine = GEO::Delaunay::create(2, "BDEL2d");
31 break;
32 }
33 case 3: {
34 engine = GEO::Delaunay::create(3, "BDEL");
35 break;
36 }
37 default: throw std::runtime_error("unexpected vector type in delaunay_geogram");
38 }
39
40 assert(engine);
41
42 // Some settings
43 engine->set_reorder(false);
44 engine->set_stores_cicl(false); // Incident tetrahedral list.
45 engine->set_stores_neighbors(false); // Vertex neighbors.
46 engine->set_refine(false);
47 engine->set_keeps_infinite(false);
48
49 // Run!
50 geo_assert(points.size() > 0);
51 Eigen::MatrixXd points_transposed = points.transpose();
52 engine->set_vertices(static_cast<GEO::index_t>(points.rows()), points_transposed.data());
53
54 // Extract output.
55 vertices.resize(engine->nb_vertices(), dim);
56 tetrahedra.resize(engine->nb_cells(), dim + 1);
57
58 for (GEO::index_t i = 0; i < vertices.rows(); ++i) {
59 // depending on branch prediction to make these calls cost nothing
60 switch (dim) {
61 case 2: {
62 vertices.row(i) = Eigen::Map<const Eigen::Vector2d>(engine->vertex_ptr(i)).transpose();
63 break;
64 }
65 case 3: {
66 vertices.row(i) = Eigen::Map<const Eigen::Vector3d>(engine->vertex_ptr(i)).transpose();
67 break;
68 }
69 // default: {
70 // // for generality allowing for arbitrary dimensions
71 // vertices.row(i) =
72 // Eigen::Map<const Eigen::VectorXd>(engine->vertex_ptr(i), dim).transpose();
73 // break;
74 //}
75 }
76 }
77
78 for (GEO::index_t i = 0; i < tetrahedra.rows(); ++i) {
79 for (GEO::index_t j = 0; j < tetrahedra.cols(); ++j) {
80 tetrahedra(i, j) = engine->cell_vertex(i, j);
81 }
82 }
83
84 return {vertices, tetrahedra};
85}
86
87
88} // namespace wmtk::components::internal
std::tuple< Eigen::MatrixXd, Eigen::MatrixXi > delaunay_geogram(Eigen::Ref< const Eigen::MatrixXd > points)
std::vector< Tuple > vertices(const Mesh &m, const Simplex &simplex)
spdlog::logger & logger()
Retrieves the current logger.
Definition Logger.cpp:58