Wildmeshing Toolkit
delaunay_geogram.cpp
Go to the documentation of this file.
1 #include "delaunay_geogram.hpp"
2 
3 #include <cassert>
4 #include <mutex>
5 #include <wmtk/utils/Logger.hpp>
6 
7 #include <Delaunay_psm.h>
8 
10 
11 std::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