diff --git a/src/Unittests/unittests_trimesh_circulator_vertex_ihalfedge.cc b/src/Unittests/unittests_trimesh_circulator_vertex_ihalfedge.cc index 370554f4..7b0e4a04 100644 --- a/src/Unittests/unittests_trimesh_circulator_vertex_ihalfedge.cc +++ b/src/Unittests/unittests_trimesh_circulator_vertex_ihalfedge.cc @@ -532,4 +532,115 @@ TEST_F(OpenMeshTrimeshCirculatorVertexIHalfEdge, CWAndCCWCheck) { } +/* + * Test CW and CCW iterators with custom starts + */ +TEST_F(OpenMeshTrimeshCirculatorVertexIHalfEdge, CustomStart) { + + mesh_.clear(); + + // Add some vertices + Mesh::VertexHandle vhandle[5]; + + vhandle[0] = mesh_.add_vertex(Mesh::Point(0, 1, 0)); + vhandle[1] = mesh_.add_vertex(Mesh::Point(1, 0, 0)); + vhandle[2] = mesh_.add_vertex(Mesh::Point(2, 1, 0)); + vhandle[3] = mesh_.add_vertex(Mesh::Point(0,-1, 0)); + vhandle[4] = mesh_.add_vertex(Mesh::Point(2,-1, 0)); + + // Add two faces + std::vector face_vhandles; + + face_vhandles.push_back(vhandle[0]); + face_vhandles.push_back(vhandle[1]); + face_vhandles.push_back(vhandle[2]); + mesh_.add_face(face_vhandles); + + face_vhandles.clear(); + + face_vhandles.push_back(vhandle[1]); + face_vhandles.push_back(vhandle[3]); + face_vhandles.push_back(vhandle[4]); + mesh_.add_face(face_vhandles); + + face_vhandles.clear(); + + face_vhandles.push_back(vhandle[0]); + face_vhandles.push_back(vhandle[3]); + face_vhandles.push_back(vhandle[1]); + mesh_.add_face(face_vhandles); + + face_vhandles.clear(); + + face_vhandles.push_back(vhandle[2]); + face_vhandles.push_back(vhandle[1]); + face_vhandles.push_back(vhandle[4]); + mesh_.add_face(face_vhandles); + + /* Test setup: + 0 ==== 2 + |\ 0 /| + | \ / | + |2 1 3| + | / \ | + |/ 1 \| + 3 ==== 4 */ + + + for (auto vh : mesh_.vertices()) + { + auto hes_default_start = mesh_.vih_range(vh).to_vector(); + + int offset = 2; + auto hes_custom_start = mesh_.vih_range(hes_default_start[offset]).to_vector(); + + ASSERT_EQ(hes_default_start.size(), hes_custom_start.size()); + size_t n = hes_default_start.size(); + for (size_t i = 0; i < n; ++i) + EXPECT_EQ(hes_default_start[(i+offset)%n], hes_custom_start[i]); + } + + + for (auto vh : mesh_.vertices()) + { + auto hes_default_start = mesh_.vih_ccw_range(vh).to_vector(); + + int offset = 2; + auto hes_custom_start = mesh_.vih_ccw_range(hes_default_start[offset]).to_vector(); + + ASSERT_EQ(hes_default_start.size(), hes_custom_start.size()); + size_t n = hes_default_start.size(); + for (size_t i = 0; i < n; ++i) + EXPECT_EQ(hes_default_start[(i+offset)%n], hes_custom_start[i]); + } + + + for (auto vh : mesh_.vertices()) + { + auto hes_default_start = mesh_.vih_cw_range(vh).to_vector(); + + int offset = 2; + auto hes_custom_start = mesh_.vih_cw_range(hes_default_start[offset]).to_vector(); + + ASSERT_EQ(hes_default_start.size(), hes_custom_start.size()); + size_t n = hes_default_start.size(); + for (size_t i = 0; i < n; ++i) + EXPECT_EQ(hes_default_start[(i+offset)%n], hes_custom_start[i]); + } + + + for (auto vh : mesh_.vertices()) + { + auto hes_default_start_cw = mesh_.vih_cw_range(vh).to_vector(); + auto hes_default_start_ccw = mesh_.vih_ccw_range(vh).to_vector(); + + ASSERT_EQ(hes_default_start_cw.size(), hes_default_start_ccw.size()); + size_t n = hes_default_start_cw.size(); + for (size_t i = 0; i < n; ++i) + EXPECT_EQ(hes_default_start_cw[(n-i)%n], hes_default_start_ccw[i]); + } + +} + + } diff --git a/src/Unittests/unittests_trimesh_circulator_vertex_ohalfedge.cc b/src/Unittests/unittests_trimesh_circulator_vertex_ohalfedge.cc index 7d66b6df..c9e408cf 100644 --- a/src/Unittests/unittests_trimesh_circulator_vertex_ohalfedge.cc +++ b/src/Unittests/unittests_trimesh_circulator_vertex_ohalfedge.cc @@ -532,6 +532,116 @@ TEST_F(OpenMeshTrimeshCirculatorVertexOHalfEdge, CWAndCCWCheck) { } +/* + * Test CW and CCW iterators with custom starts + */ +TEST_F(OpenMeshTrimeshCirculatorVertexOHalfEdge, CustomStart) { + + mesh_.clear(); + + // Add some vertices + Mesh::VertexHandle vhandle[5]; + + vhandle[0] = mesh_.add_vertex(Mesh::Point(0, 1, 0)); + vhandle[1] = mesh_.add_vertex(Mesh::Point(1, 0, 0)); + vhandle[2] = mesh_.add_vertex(Mesh::Point(2, 1, 0)); + vhandle[3] = mesh_.add_vertex(Mesh::Point(0,-1, 0)); + vhandle[4] = mesh_.add_vertex(Mesh::Point(2,-1, 0)); + + // Add two faces + std::vector face_vhandles; + + face_vhandles.push_back(vhandle[0]); + face_vhandles.push_back(vhandle[1]); + face_vhandles.push_back(vhandle[2]); + mesh_.add_face(face_vhandles); + + face_vhandles.clear(); + + face_vhandles.push_back(vhandle[1]); + face_vhandles.push_back(vhandle[3]); + face_vhandles.push_back(vhandle[4]); + mesh_.add_face(face_vhandles); + + face_vhandles.clear(); + + face_vhandles.push_back(vhandle[0]); + face_vhandles.push_back(vhandle[3]); + face_vhandles.push_back(vhandle[1]); + mesh_.add_face(face_vhandles); + + face_vhandles.clear(); + + face_vhandles.push_back(vhandle[2]); + face_vhandles.push_back(vhandle[1]); + face_vhandles.push_back(vhandle[4]); + mesh_.add_face(face_vhandles); + + /* Test setup: + 0 ==== 2 + |\ 0 /| + | \ / | + |2 1 3| + | / \ | + |/ 1 \| + 3 ==== 4 */ + + for (auto vh : mesh_.vertices()) + { + auto hes_default_start = mesh_.voh_range(vh).to_vector(); + + int offset = 2; + auto hes_custom_start = mesh_.voh_range(hes_default_start[offset]).to_vector(); + + ASSERT_EQ(hes_default_start.size(), hes_custom_start.size()); + size_t n = hes_default_start.size(); + for (size_t i = 0; i < n; ++i) + EXPECT_EQ(hes_default_start[(i+offset)%n], hes_custom_start[i]); + } + + + for (auto vh : mesh_.vertices()) + { + auto hes_default_start = mesh_.voh_ccw_range(vh).to_vector(); + + int offset = 2; + auto hes_custom_start = mesh_.voh_ccw_range(hes_default_start[offset]).to_vector(); + + ASSERT_EQ(hes_default_start.size(), hes_custom_start.size()); + size_t n = hes_default_start.size(); + for (size_t i = 0; i < n; ++i) + EXPECT_EQ(hes_default_start[(i+offset)%n], hes_custom_start[i]); + } + + + for (auto vh : mesh_.vertices()) + { + auto hes_default_start = mesh_.voh_cw_range(vh).to_vector(); + + int offset = 2; + auto hes_custom_start = mesh_.voh_cw_range(hes_default_start[offset]).to_vector(); + + ASSERT_EQ(hes_default_start.size(), hes_custom_start.size()); + size_t n = hes_default_start.size(); + for (size_t i = 0; i < n; ++i) + EXPECT_EQ(hes_default_start[(i+offset)%n], hes_custom_start[i]); + } + + + for (auto vh : mesh_.vertices()) + { + auto hes_default_start_cw = mesh_.voh_cw_range(vh).to_vector(); + auto hes_default_start_ccw = mesh_.voh_ccw_range(vh).to_vector(); + + ASSERT_EQ(hes_default_start_cw.size(), hes_default_start_ccw.size()); + size_t n = hes_default_start_cw.size(); + for (size_t i = 0; i < n; ++i) + EXPECT_EQ(hes_default_start_cw[(n-i)%n], hes_default_start_ccw[i]); + } + +} + + }