From b71f0a15333e763a5a82f432a1d10296c86d0a31 Mon Sep 17 00:00:00 2001 From: Joel Hecht <156119383+Joel-Hecht@users.noreply.github.com> Date: Tue, 3 Mar 2026 02:02:43 +0000 Subject: [PATCH 1/3] [fix](flip geodesics) Added option to remove back-and-forth from piecewise edge networks --- .../geometrycentral/surface/flip_geodesics.h | 2 +- src/surface/flip_geodesics.cpp | 31 +++++++++++++++++-- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/include/geometrycentral/surface/flip_geodesics.h b/include/geometrycentral/surface/flip_geodesics.h index 04de0aeb..73a7ebe5 100644 --- a/include/geometrycentral/surface/flip_geodesics.h +++ b/include/geometrycentral/surface/flip_geodesics.h @@ -107,7 +107,7 @@ class FlipEdgeNetwork { // Run Dijkstra between i'th and (i+1)'th point to initialize path static std::unique_ptr constructFromPiecewiseDijkstraPath(ManifoldSurfaceMesh& mesh, IntrinsicGeometryInterface& geom, - std::vector points, bool closed = false, bool markInterior = false); + std::vector points, bool closed = false, bool markInterior = false, bool removeOverlap = true); // Consturct path(s) from marked edges, heuristically inferring endpoints, loopiness, etc static std::unique_ptr constructFromEdgeSet(ManifoldSurfaceMesh& mesh, diff --git a/src/surface/flip_geodesics.cpp b/src/surface/flip_geodesics.cpp index a9abbcbb..de345280 100644 --- a/src/surface/flip_geodesics.cpp +++ b/src/surface/flip_geodesics.cpp @@ -283,7 +283,7 @@ std::unique_ptr FlipEdgeNetwork::constructFromDijkstraPath(Mani std::unique_ptr FlipEdgeNetwork::constructFromPiecewiseDijkstraPath(ManifoldSurfaceMesh& mesh_, IntrinsicGeometryInterface& geom, std::vector points, - bool closed, bool markInterior) { + bool closed, bool markInterior, bool removeOverlap) { std::vector halfedges; @@ -307,8 +307,33 @@ std::unique_ptr FlipEdgeNetwork::constructFromPiecewiseDijkstra halfedges.insert(halfedges.end(), dijkstraPath.begin(), dijkstraPath.end()); } - - return std::unique_ptr(new FlipEdgeNetwork(mesh_, geom, {halfedges}, extraMark)); + + if(!removeOverlap || halfedges.size() == 0) { + return std::unique_ptr(new FlipEdgeNetwork(mesh_, geom, {halfedges}, extraMark)); + } + + // 2 Adjacent Dijkstra paths may share edge(s) + // This creates a 'back-and-forth' that FlipOut cannot solve + std::vector heClean; + Halfedge hePrev, heNext; + size_t i, behind; + behind = 1; + heClean.push_back(halfedges[0]); + for(i = 1; i < halfedges.size(); i++) { + hePrev = halfedges[i - behind]; + heNext = halfedges[i]; + heClean.push_back(halfedges[i]); + if(hePrev.edge() == heNext.twin().edge()) { + /* Backtrack in case >2 edges overlap */ + behind = (behind >= i) ? 1 : behind + 2; + heClean.pop_back(); + heClean.pop_back(); + } else { + behind = 1; + } + } + + return std::unique_ptr(new FlipEdgeNetwork(mesh_, geom, {heClean}, extraMark)); } From 6fbcc6c82789fd930af74d492d718124ecb1d414 Mon Sep 17 00:00:00 2001 From: Joel Hecht <156119383+Joel-Hecht@users.noreply.github.com> Date: Tue, 3 Mar 2026 04:05:10 +0000 Subject: [PATCH 2/3] [test](flip geodesics) added a few trivial tests for prev commit --- test/CMakeLists.txt | 1 + test/assets/dijkstra.obj | 12 +++ test/src/load_test_meshes.cpp | 1 + test/src/piecewise_edge_network_test.cpp | 93 ++++++++++++++++++++++++ 4 files changed, 107 insertions(+) create mode 100644 test/assets/dijkstra.obj create mode 100644 test/src/piecewise_edge_network_test.cpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index b739fc4b..3487fc98 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -109,6 +109,7 @@ set(TEST_SRCS src/polygon_operators_test.cpp src/stl_reader_test.cpp src/surface_misc_test.cpp + src/piecewise_edge_network_test.cpp ) add_executable(geometry-central-test "${TEST_SRCS}") diff --git a/test/assets/dijkstra.obj b/test/assets/dijkstra.obj new file mode 100644 index 00000000..4759eaf5 --- /dev/null +++ b/test/assets/dijkstra.obj @@ -0,0 +1,12 @@ +v 0.000000 0.000000 0.000000 +v 0.000000 3.000000 0.000000 +v 0.000000 3.000000 1.000000 +v 0.000000 5.000000 0.000000 +v 0.000000 5.000000 5.000000 +v 0.000000 3.000000 2.000000 +v 0.000000 5.000000 0.000000 +f 1 2 7 +f 2 4 5 +f 3 2 5 +f 3 5 6 +f 2 3 7 diff --git a/test/src/load_test_meshes.cpp b/test/src/load_test_meshes.cpp index aced7d61..ea051cc6 100644 --- a/test/src/load_test_meshes.cpp +++ b/test/src/load_test_meshes.cpp @@ -87,6 +87,7 @@ void MeshAssetSuite::SetUpTestSuite() { allMeshAssets.emplace_back("platonic_shelf.obj", true); allMeshAssets.emplace_back("fox.ply", true); allMeshAssets.emplace_back("cat_head.obj", true); + allMeshAssets.emplace_back("dijkstra.obj", true); // Load general surface mesh variants allMeshAssets.emplace_back("tet.obj", false); diff --git a/test/src/piecewise_edge_network_test.cpp b/test/src/piecewise_edge_network_test.cpp new file mode 100644 index 00000000..a95625cc --- /dev/null +++ b/test/src/piecewise_edge_network_test.cpp @@ -0,0 +1,93 @@ +#include "geometrycentral/surface/surface_mesh.h" +#include "geometrycentral/surface/manifold_surface_mesh.h" +#include +#include +#include +#include "geometrycentral/surface/flip_geodesics.h" + +#include +#include + +#include "load_test_meshes.h" + +#include "gtest/gtest.h" + +#include +#include +#include + +using namespace geometrycentral; +using namespace geometrycentral::surface; +using std::cout; +using std::endl; + +class pieceWiseEdgeNetworkTest : public MeshAssetSuite {}; + +TEST_F(pieceWiseEdgeNetworkTest, deletesSingleDetour) { + for(auto& asset : {getAsset("dijkstra.obj", true)}) { + Eigen::MatrixXd out; + ManifoldSurfaceMesh& mesh = *asset.manifoldMesh; + std::unique_ptr network; + VertexPositionGeometry& origGeometry = *asset.geometry; + std::vector path; + std::vector points = {0, 2, 3}; + + for(size_t i = 0; i < points.size(); i++) { + path.push_back(mesh.vertex(points[i])); + } + + network = FlipEdgeNetwork::constructFromPiecewiseDijkstraPath(mesh, origGeometry, path, false); + for(auto &eptr : network->paths){ + auto x = eptr->getHalfedgeList(); + for(auto he : x) { + std::cout << he.vertex() << std::endl; + } + EXPECT_EQ(x.size(), 2); + } + + } + +} + +TEST_F(pieceWiseEdgeNetworkTest, deleteMultipleAtStart) { + for(auto& asset : {getAsset("dijkstra.obj", true)}) { + Eigen::MatrixXd out; + ManifoldSurfaceMesh& mesh = *asset.manifoldMesh; + std::unique_ptr network; + VertexPositionGeometry& origGeometry = *asset.geometry; + std::vector path; + std::vector points = {1, 5, 3}; + + for(size_t i = 0; i < points.size(); i++) { + path.push_back(mesh.vertex(points[i])); + } + + network = FlipEdgeNetwork::constructFromPiecewiseDijkstraPath(mesh, origGeometry, path, false); + for(auto &eptr : network->paths){ + EXPECT_EQ(eptr->getHalfedgeList().size(), 1); + } + + } + +} + +TEST_F(pieceWiseEdgeNetworkTest, deleteMultipleAtEnd) { + for(auto& asset : {getAsset("dijkstra.obj", true)}) { + Eigen::MatrixXd out; + ManifoldSurfaceMesh& mesh = *asset.manifoldMesh; + std::unique_ptr network; + VertexPositionGeometry& origGeometry = *asset.geometry; + std::vector path; + std::vector points = {0, 2, 5, 1}; + + for(size_t i = 0; i < points.size(); i++) { + path.push_back(mesh.vertex(points[i])); + } + + network = FlipEdgeNetwork::constructFromPiecewiseDijkstraPath(mesh, origGeometry, path, false); + for(auto &eptr : network->paths){ + EXPECT_EQ(eptr->getHalfedgeList().size(), 1); + } + } + +} From ee3efde29b49e11f6abadf654550632e6f990879 Mon Sep 17 00:00:00 2001 From: Nicholas Sharp Date: Sun, 26 Apr 2026 20:52:03 -0700 Subject: [PATCH 3/3] reorganize code --- .../geometrycentral/surface/flip_geodesics.h | 3 +- src/surface/flip_geodesics.cpp | 45 ++--- test/CMakeLists.txt | 2 +- test/assets/dijkstra.obj | 12 -- test/src/flip_geodesic_test.cpp | 170 ++++++++++++++++++ test/src/load_test_meshes.cpp | 1 - test/src/piecewise_edge_network_test.cpp | 93 ---------- 7 files changed, 191 insertions(+), 135 deletions(-) delete mode 100644 test/assets/dijkstra.obj create mode 100644 test/src/flip_geodesic_test.cpp delete mode 100644 test/src/piecewise_edge_network_test.cpp diff --git a/include/geometrycentral/surface/flip_geodesics.h b/include/geometrycentral/surface/flip_geodesics.h index 73a7ebe5..2f820d7c 100644 --- a/include/geometrycentral/surface/flip_geodesics.h +++ b/include/geometrycentral/surface/flip_geodesics.h @@ -107,7 +107,7 @@ class FlipEdgeNetwork { // Run Dijkstra between i'th and (i+1)'th point to initialize path static std::unique_ptr constructFromPiecewiseDijkstraPath(ManifoldSurfaceMesh& mesh, IntrinsicGeometryInterface& geom, - std::vector points, bool closed = false, bool markInterior = false, bool removeOverlap = true); + std::vector points, bool closed = false, bool markInterior = false); // Consturct path(s) from marked edges, heuristically inferring endpoints, loopiness, etc static std::unique_ptr constructFromEdgeSet(ManifoldSurfaceMesh& mesh, @@ -185,7 +185,6 @@ class FlipEdgeNetwork { SegmentAngleType locallyShortestTest(Halfedge hePrev, Halfedge heNext); double minWedgeAngle(Halfedge hePrev, Halfedge heNext); double minWedgeAngle(const FlipPathSegment& segment); - bool isStraight(double angleThresh = 1e-4); double minAngle(); // minimum over all angles double minAngleIsotopy(); // minimum over all angles, excluding those blocked by an path endpoint struct ShortestReturnBoth { diff --git a/src/surface/flip_geodesics.cpp b/src/surface/flip_geodesics.cpp index de345280..43c11655 100644 --- a/src/surface/flip_geodesics.cpp +++ b/src/surface/flip_geodesics.cpp @@ -283,7 +283,7 @@ std::unique_ptr FlipEdgeNetwork::constructFromDijkstraPath(Mani std::unique_ptr FlipEdgeNetwork::constructFromPiecewiseDijkstraPath(ManifoldSurfaceMesh& mesh_, IntrinsicGeometryInterface& geom, std::vector points, - bool closed, bool markInterior, bool removeOverlap) { + bool closed, bool markInterior) { std::vector halfedges; @@ -307,31 +307,24 @@ std::unique_ptr FlipEdgeNetwork::constructFromPiecewiseDijkstra halfedges.insert(halfedges.end(), dijkstraPath.begin(), dijkstraPath.end()); } - - if(!removeOverlap || halfedges.size() == 0) { - return std::unique_ptr(new FlipEdgeNetwork(mesh_, geom, {halfedges}, extraMark)); - } - - // 2 Adjacent Dijkstra paths may share edge(s) - // This creates a 'back-and-forth' that FlipOut cannot solve - std::vector heClean; - Halfedge hePrev, heNext; - size_t i, behind; - behind = 1; - heClean.push_back(halfedges[0]); - for(i = 1; i < halfedges.size(); i++) { - hePrev = halfedges[i - behind]; - heNext = halfedges[i]; - heClean.push_back(halfedges[i]); - if(hePrev.edge() == heNext.twin().edge()) { - /* Backtrack in case >2 edges overlap */ - behind = (behind >= i) ? 1 : behind + 2; - heClean.pop_back(); - heClean.pop_back(); - } else { - behind = 1; - } - } + + if (markInterior || halfedges.size() == 0) { + return std::unique_ptr(new FlipEdgeNetwork(mesh_, geom, {halfedges}, extraMark)); + } + + // Sometimes Dijkstra segments to an intermediate point create a back-and-forth that the FlipOut algorithm + // cannot remove, because of an implementation limitation of how we pass it to the stacked representation. This is a + // quick filtering pass to collapse and remove such segments when they trivially exist + // + // NOTE: we can only do this when markInterior==false, because the path will no longer touch the marked vertex. + std::vector heClean; + for (Halfedge he : halfedges) { + if (!heClean.empty() && heClean.back() == he.twin()) { + heClean.pop_back(); + } else { + heClean.push_back(he); + } + } return std::unique_ptr(new FlipEdgeNetwork(mesh_, geom, {heClean}, extraMark)); } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 3487fc98..ddb63090 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -107,9 +107,9 @@ set(TEST_SRCS src/point_cloud_test.cpp src/poisson_disk_sampler_test.cpp src/polygon_operators_test.cpp + src/flip_geodesic_test.cpp src/stl_reader_test.cpp src/surface_misc_test.cpp - src/piecewise_edge_network_test.cpp ) add_executable(geometry-central-test "${TEST_SRCS}") diff --git a/test/assets/dijkstra.obj b/test/assets/dijkstra.obj deleted file mode 100644 index 4759eaf5..00000000 --- a/test/assets/dijkstra.obj +++ /dev/null @@ -1,12 +0,0 @@ -v 0.000000 0.000000 0.000000 -v 0.000000 3.000000 0.000000 -v 0.000000 3.000000 1.000000 -v 0.000000 5.000000 0.000000 -v 0.000000 5.000000 5.000000 -v 0.000000 3.000000 2.000000 -v 0.000000 5.000000 0.000000 -f 1 2 7 -f 2 4 5 -f 3 2 5 -f 3 5 6 -f 2 3 7 diff --git a/test/src/flip_geodesic_test.cpp b/test/src/flip_geodesic_test.cpp new file mode 100644 index 00000000..93f19f70 --- /dev/null +++ b/test/src/flip_geodesic_test.cpp @@ -0,0 +1,170 @@ +#include "geometrycentral/surface/flip_geodesics.h" +#include "geometrycentral/surface/manifold_surface_mesh.h" +#include "geometrycentral/surface/surface_mesh_factories.h" +#include "geometrycentral/surface/vertex_position_geometry.h" + +#include "load_test_meshes.h" + +#include "gtest/gtest.h" + +#include + +using namespace geometrycentral; +using namespace geometrycentral::surface; + +class FlipGeodesicSuite : public MeshAssetSuite {}; + + +// ============================================================ +// =============== Construction +// ============================================================ + +TEST_F(FlipGeodesicSuite, ConstructFromDijkstra) { + for (const MeshAsset& a : {getAsset("fox.ply", true), getAsset("cat_head.obj", true)}) { + a.printThyName(); + ManifoldSurfaceMesh& mesh = *a.manifoldMesh; + VertexPositionGeometry& geom = *a.geometry; + + std::unique_ptr network = + FlipEdgeNetwork::constructFromDijkstraPath(mesh, geom, mesh.vertex(0), mesh.vertex(mesh.nVertices() / 2)); + + ASSERT_NE(network, nullptr); + ASSERT_EQ(network->paths.size(), 1); + EXPECT_GT(network->paths[0]->size(), 0); + } +} + +TEST_F(FlipGeodesicSuite, ConstructFromPiecewiseDijkstra) { + for (const MeshAsset& a : {getAsset("fox.ply", true), getAsset("cat_head.obj", true)}) { + a.printThyName(); + ManifoldSurfaceMesh& mesh = *a.manifoldMesh; + VertexPositionGeometry& geom = *a.geometry; + + size_t nV = mesh.nVertices(); + std::vector waypoints = {mesh.vertex(0), mesh.vertex(nV / 3), mesh.vertex(2 * nV / 3)}; + + std::unique_ptr network = + FlipEdgeNetwork::constructFromPiecewiseDijkstraPath(mesh, geom, waypoints, false); + + ASSERT_NE(network, nullptr); + ASSERT_EQ(network->paths.size(), 1); + EXPECT_GT(network->paths[0]->size(), 0); + } +} + +TEST_F(FlipGeodesicSuite, ConstructClosedLoop) { + for (const MeshAsset& a : {getAsset("fox.ply", true), getAsset("cat_head.obj", true)}) { + a.printThyName(); + ManifoldSurfaceMesh& mesh = *a.manifoldMesh; + VertexPositionGeometry& geom = *a.geometry; + + size_t nV = mesh.nVertices(); + std::vector waypoints = {mesh.vertex(0), mesh.vertex(nV / 3), mesh.vertex(2 * nV / 3)}; + + std::unique_ptr network = + FlipEdgeNetwork::constructFromPiecewiseDijkstraPath(mesh, geom, waypoints, /*closed=*/true); + + ASSERT_NE(network, nullptr); + ASSERT_EQ(network->paths.size(), 1); + EXPECT_TRUE(network->paths[0]->isClosed); + } +} + + +// ============================================================ +// =============== Shortening +// ============================================================ + +TEST_F(FlipGeodesicSuite, ShortenedPathIsStraight) { + for (const MeshAsset& a : {getAsset("fox.ply", true), getAsset("cat_head.obj", true)}) { + a.printThyName(); + ManifoldSurfaceMesh& mesh = *a.manifoldMesh; + VertexPositionGeometry& geom = *a.geometry; + + std::unique_ptr network = + FlipEdgeNetwork::constructFromDijkstraPath(mesh, geom, mesh.vertex(0), mesh.vertex(mesh.nVertices() / 2)); + ASSERT_NE(network, nullptr); + + network->iterativeShorten(); + + EXPECT_GE(network->minAngle(), M_PI - network->EPS_ANGLE); + } +} + +TEST_F(FlipGeodesicSuite, ShorteningDoesNotIncreaseLength) { + for (const MeshAsset& a : {getAsset("fox.ply", true), getAsset("cat_head.obj", true)}) { + a.printThyName(); + ManifoldSurfaceMesh& mesh = *a.manifoldMesh; + VertexPositionGeometry& geom = *a.geometry; + + std::unique_ptr network = + FlipEdgeNetwork::constructFromDijkstraPath(mesh, geom, mesh.vertex(0), mesh.vertex(mesh.nVertices() / 2)); + ASSERT_NE(network, nullptr); + + double lengthBefore = network->length(); + network->iterativeShorten(); + double lengthAfter = network->length(); + + EXPECT_LE(lengthAfter, lengthBefore + 1e-6); + } +} + +// ============================================================ +// =============== Piecewise Dijkstra overlap removal +// ============================================================ + +// See: https://github.com/nmwsharp/geometry-central/pull/237 + +// Small 5-triangle mesh for overlap-removal tests +namespace { +std::tuple, std::unique_ptr> buildOverlapTestMesh() { + std::vector verts = {{0, 0, 0}, {0, 3, 0}, {0, 3, 1}, {0, 5, 0}, {0, 5, 5}, {0, 3, 2}, {0, 5, 0}}; + std::vector> faces = {{0, 1, 6}, {1, 3, 4}, {2, 1, 4}, {2, 4, 5}, {1, 2, 6}}; + return makeManifoldSurfaceMeshAndGeometry(faces, verts); +} +} // namespace + +TEST_F(FlipGeodesicSuite, PiecewiseDijkstraSingleDetour) { + std::unique_ptr meshPtr; + std::unique_ptr geomPtr; + std::tie(meshPtr, geomPtr) = buildOverlapTestMesh(); + ManifoldSurfaceMesh& mesh = *meshPtr; + VertexPositionGeometry& geom = *geomPtr; + + std::vector path = {mesh.vertex(0), mesh.vertex(2), mesh.vertex(3)}; + std::unique_ptr network = + FlipEdgeNetwork::constructFromPiecewiseDijkstraPath(mesh, geom, path, false); + + ASSERT_EQ(network->paths.size(), 1); + EXPECT_EQ(network->paths[0]->getHalfedgeList().size(), 2); +} + +TEST_F(FlipGeodesicSuite, PiecewiseDijkstraMultipleOverlapAtStart) { + std::unique_ptr meshPtr; + std::unique_ptr geomPtr; + std::tie(meshPtr, geomPtr) = buildOverlapTestMesh(); + ManifoldSurfaceMesh& mesh = *meshPtr; + VertexPositionGeometry& geom = *geomPtr; + + std::vector path = {mesh.vertex(1), mesh.vertex(5), mesh.vertex(3)}; + std::unique_ptr network = + FlipEdgeNetwork::constructFromPiecewiseDijkstraPath(mesh, geom, path, false); + + ASSERT_EQ(network->paths.size(), 1); + EXPECT_EQ(network->paths[0]->getHalfedgeList().size(), 1); +} + +TEST_F(FlipGeodesicSuite, PiecewiseDijkstraMultipleOverlapAtEnd) { + std::unique_ptr meshPtr; + std::unique_ptr geomPtr; + std::tie(meshPtr, geomPtr) = buildOverlapTestMesh(); + ManifoldSurfaceMesh& mesh = *meshPtr; + VertexPositionGeometry& geom = *geomPtr; + + std::vector path = {mesh.vertex(0), mesh.vertex(2), mesh.vertex(5), mesh.vertex(1)}; + std::unique_ptr network = + FlipEdgeNetwork::constructFromPiecewiseDijkstraPath(mesh, geom, path, false); + + ASSERT_EQ(network->paths.size(), 1); + EXPECT_EQ(network->paths[0]->getHalfedgeList().size(), 1); +} diff --git a/test/src/load_test_meshes.cpp b/test/src/load_test_meshes.cpp index ea051cc6..aced7d61 100644 --- a/test/src/load_test_meshes.cpp +++ b/test/src/load_test_meshes.cpp @@ -87,7 +87,6 @@ void MeshAssetSuite::SetUpTestSuite() { allMeshAssets.emplace_back("platonic_shelf.obj", true); allMeshAssets.emplace_back("fox.ply", true); allMeshAssets.emplace_back("cat_head.obj", true); - allMeshAssets.emplace_back("dijkstra.obj", true); // Load general surface mesh variants allMeshAssets.emplace_back("tet.obj", false); diff --git a/test/src/piecewise_edge_network_test.cpp b/test/src/piecewise_edge_network_test.cpp deleted file mode 100644 index a95625cc..00000000 --- a/test/src/piecewise_edge_network_test.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include "geometrycentral/surface/surface_mesh.h" -#include "geometrycentral/surface/manifold_surface_mesh.h" -#include -#include -#include -#include "geometrycentral/surface/flip_geodesics.h" - -#include -#include - -#include "load_test_meshes.h" - -#include "gtest/gtest.h" - -#include -#include -#include - -using namespace geometrycentral; -using namespace geometrycentral::surface; -using std::cout; -using std::endl; - -class pieceWiseEdgeNetworkTest : public MeshAssetSuite {}; - -TEST_F(pieceWiseEdgeNetworkTest, deletesSingleDetour) { - for(auto& asset : {getAsset("dijkstra.obj", true)}) { - Eigen::MatrixXd out; - ManifoldSurfaceMesh& mesh = *asset.manifoldMesh; - std::unique_ptr network; - VertexPositionGeometry& origGeometry = *asset.geometry; - std::vector path; - std::vector points = {0, 2, 3}; - - for(size_t i = 0; i < points.size(); i++) { - path.push_back(mesh.vertex(points[i])); - } - - network = FlipEdgeNetwork::constructFromPiecewiseDijkstraPath(mesh, origGeometry, path, false); - for(auto &eptr : network->paths){ - auto x = eptr->getHalfedgeList(); - for(auto he : x) { - std::cout << he.vertex() << std::endl; - } - EXPECT_EQ(x.size(), 2); - } - - } - -} - -TEST_F(pieceWiseEdgeNetworkTest, deleteMultipleAtStart) { - for(auto& asset : {getAsset("dijkstra.obj", true)}) { - Eigen::MatrixXd out; - ManifoldSurfaceMesh& mesh = *asset.manifoldMesh; - std::unique_ptr network; - VertexPositionGeometry& origGeometry = *asset.geometry; - std::vector path; - std::vector points = {1, 5, 3}; - - for(size_t i = 0; i < points.size(); i++) { - path.push_back(mesh.vertex(points[i])); - } - - network = FlipEdgeNetwork::constructFromPiecewiseDijkstraPath(mesh, origGeometry, path, false); - for(auto &eptr : network->paths){ - EXPECT_EQ(eptr->getHalfedgeList().size(), 1); - } - - } - -} - -TEST_F(pieceWiseEdgeNetworkTest, deleteMultipleAtEnd) { - for(auto& asset : {getAsset("dijkstra.obj", true)}) { - Eigen::MatrixXd out; - ManifoldSurfaceMesh& mesh = *asset.manifoldMesh; - std::unique_ptr network; - VertexPositionGeometry& origGeometry = *asset.geometry; - std::vector path; - std::vector points = {0, 2, 5, 1}; - - for(size_t i = 0; i < points.size(); i++) { - path.push_back(mesh.vertex(points[i])); - } - - network = FlipEdgeNetwork::constructFromPiecewiseDijkstraPath(mesh, origGeometry, path, false); - for(auto &eptr : network->paths){ - EXPECT_EQ(eptr->getHalfedgeList().size(), 1); - } - } - -}