16#define DOCTEST_CONFIG_DISABLE
17#include <CGAL/draw_triangulation_3.h>
20#define DOCTEST_CONFIG_IMPLEMENT
22#include <doctest/doctest.h>
23#include <spdlog/spdlog.h>
29static inline std::floating_point
auto constexpr SQRT_2 =
30 std::numbers::sqrt2_v<double>;
31static inline std::floating_point
auto constexpr INV_SQRT_2 = 1 / SQRT_2;
33auto bistellar_triangulation_vertices() -> std::vector<Point_t<3>>
37 Point_t<3>{ INV_SQRT_2, 0, INV_SQRT_2},
38 Point_t<3>{ 0, INV_SQRT_2, INV_SQRT_2},
39 Point_t<3>{-INV_SQRT_2, 0, INV_SQRT_2},
40 Point_t<3>{ 0, -INV_SQRT_2, INV_SQRT_2},
46auto main(
int const argc,
char* argv[]) ->
int
50 doctest::Context context;
51 context.setOption(
"no-breaks",
53 context.applyCommandLine(argc, argv);
55 int const res = context.run();
56 if (context.shouldExit())
61 context.clearFilters();
66 fmt::print(
"Before bistellar flip.\n");
67 auto vertices = bistellar_triangulation_vertices();
68 ergodic_moves::Delaunay
const dt{vertices.begin(), vertices.end()};
72#ifdef ENABLE_VISUALIZATION
73 CGAL::draw(manifold.get_delaunay());
75 fmt::print(
"After bistellar flip.\n");
76 manifold.print_cells();
80catch (std::exception
const& e)
82 spdlog::critical(
"Error: {}\n", e.what());
88 spdlog::critical(
"Something went wrong ... Exiting.\n");
92SCENARIO(
"Perform bistellar flip on Delaunay triangulation" *
93 doctest::test_suite(
"bistellar"))
95 GIVEN(
"A triangulation setup for a bistellar flip")
97 auto vertices = bistellar_triangulation_vertices();
98 ergodic_moves::Delaunay triangulation(vertices.begin(), vertices.end());
99 WHEN(
"We have a valid triangulation")
101 CHECK(triangulation.is_valid());
102 THEN(
"We can perform a bistellar flip")
106 auto top = triangulation.insert(Point_t<3>{0, 0, 2});
107 auto bottom = triangulation.insert(Point_t<3>{0, 0, 0});
108 auto edges = foliated_triangulations::collect_edges<3>(triangulation);
109 auto pivot_edge = ergodic_moves::find_pivot_edge(triangulation, edges);
110 REQUIRE_MESSAGE(pivot_edge,
"No pivot edge found.");
113 REQUIRE_EQ(vertices.size(), 6);
117 auto flipped_triangulation = ergodic_moves::bistellar_flip(
118 triangulation, pivot_edge.value(), top, bottom);
120 REQUIRE_MESSAGE(flipped_triangulation,
"Bistellar flip failed.");
121 if (flipped_triangulation)
125 WARN(flipped_triangulation->is_valid());
Pachner moves on 2+1 dimensional foliated Delaunay triangulations.
void print_delaunay(TriangulationType const &t_triangulation)
Print triangulation statistics.
SCENARIO("Perform bistellar flip on Delaunay triangulation" *doctest::test_suite("bistellar"))
3D Foliated triangulation