diff --git a/CMakeLists.txt b/CMakeLists.txt index a6bc02f..6c57106 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,6 +39,7 @@ if(Octree_BUILD_TEST) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/tests/udf_test) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/tests/search_assign_test) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/tests/aabb_tree_test) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/tests/2d_broken_test) endif() enable_testing() @@ -48,4 +49,5 @@ if(Octree_BUILD_TEST) add_test(NAME udf_test COMMAND $) add_test(NAME search_assign_test COMMAND $) add_test(NAME aabb_tree_test COMMAND $) + add_test(NAME 2d_broken_test COMMAND $) endif() \ No newline at end of file diff --git a/tests/2d_broken_test/.gitignore b/tests/2d_broken_test/.gitignore new file mode 100644 index 0000000..298482a --- /dev/null +++ b/tests/2d_broken_test/.gitignore @@ -0,0 +1 @@ +test-path.h \ No newline at end of file diff --git a/tests/2d_broken_test/CMakeLists.txt b/tests/2d_broken_test/CMakeLists.txt new file mode 100644 index 0000000..eea0af4 --- /dev/null +++ b/tests/2d_broken_test/CMakeLists.txt @@ -0,0 +1,8 @@ +set(LOCAL_TEST_DATA_BASE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/data) + +configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/test-path.h.in" + "${CMAKE_CURRENT_SOURCE_DIR}/test-path.h" +) +add_executable(2d_broken_test main.cpp) +target_link_libraries(2d_broken_test Octree pMesh) diff --git a/tests/2d_broken_test/data/broken.vtk b/tests/2d_broken_test/data/broken.vtk new file mode 100644 index 0000000..d52c816 --- /dev/null +++ b/tests/2d_broken_test/data/broken.vtk @@ -0,0 +1,548 @@ +# vtk DataFile Version 3.0 +Volume Mesh +ASCII +DATASET UNSTRUCTURED_GRID +POINTS 181 float +0 2 0 +0.0349048 1.9997 0 +0.069799 1.99878 0 +0.104672 1.99726 0 +0.139513 1.99513 0 +0.174311 1.99239 0 +0.209057 1.98904 0 +0.243739 1.98509 0 +0.278346 1.98054 0 +0.312869 1.97538 0 +0.347296 1.96962 0 +0.381618 1.96325 0 +0.415823 1.9563 0 +0.449902 1.94874 0 +0.483844 1.94059 0 +0.517638 1.93185 0 +0.551275 1.92252 0 +0.584743 1.91261 0 +0.618034 1.90211 0 +0.651136 1.89104 0 +0.68404 1.87939 0 +0.716736 1.86716 0 +0.749213 1.85437 0 +0.781462 1.84101 0 +0.813473 1.82709 0 +0.845237 1.81262 0 +0.876742 1.79759 0 +0.907981 1.78201 0 +0.938943 1.7659 0 +0.969619 1.74924 0 +1 1.73205 0 +1.03008 1.71433 0 +1.05984 1.6961 0 +1.08928 1.67734 0 +1.11839 1.65808 0 +1.14715 1.6383 0 +1.17557 1.61803 0 +1.20363 1.59727 0 +1.23132 1.57602 0 +1.25864 1.55429 0 +1.28558 1.53209 0 +1.31212 1.50942 0 +1.33826 1.48629 0 +1.364 1.46271 0 +1.38932 1.43868 0 +1.41421 1.41421 0 +1.43868 1.38932 0 +1.46271 1.364 0 +1.48629 1.33826 0 +1.50942 1.31212 0 +1.53209 1.28558 0 +1.55429 1.25864 0 +1.57602 1.23132 0 +1.59727 1.20363 0 +1.61803 1.17557 0 +1.6383 1.14715 0 +1.65808 1.11839 0 +1.67734 1.08928 0 +1.6961 1.05984 0 +1.71433 1.03008 0 +1.73205 1 0 +1.74924 0.969619 0 +1.7659 0.938943 0 +1.78201 0.907981 0 +1.79759 0.876742 0 +1.81262 0.845237 0 +1.82709 0.813473 0 +1.84101 0.781462 0 +1.85437 0.749213 0 +1.86716 0.716736 0 +1.87939 0.68404 0 +1.89104 0.651136 0 +1.90211 0.618034 0 +1.91261 0.584743 0 +1.92252 0.551275 0 +1.93185 0.517638 0 +1.94059 0.483844 0 +1.94874 0.449902 0 +1.9563 0.415823 0 +1.96325 0.381618 0 +1.96962 0.347296 0 +1.97538 0.312869 0 +1.98054 0.278346 0 +1.98509 0.243739 0 +1.98904 0.209057 0 +1.99239 0.174311 0 +1.99513 0.139513 0 +1.99726 0.104672 0 +1.99878 0.069799 0 +1.9997 0.0349048 0 +2 0 0 +1.9997 -0.0349048 0 +1.99878 -0.069799 0 +1.99726 -0.104672 0 +1.99513 -0.139513 0 +1.99239 -0.174311 0 +1.98904 -0.209057 0 +1.98509 -0.243739 0 +1.98054 -0.278346 0 +1.97538 -0.312869 0 +1.96962 -0.347296 0 +1.96325 -0.381618 0 +1.9563 -0.415823 0 +1.94874 -0.449902 0 +1.94059 -0.483844 0 +1.93185 -0.517638 0 +1.92252 -0.551275 0 +1.91261 -0.584743 0 +1.90211 -0.618034 0 +1.89104 -0.651136 0 +1.87939 -0.68404 0 +1.86716 -0.716736 0 +1.85437 -0.749213 0 +1.84101 -0.781462 0 +1.82709 -0.813473 0 +1.81262 -0.845237 0 +1.79759 -0.876742 0 +1.78201 -0.907981 0 +1.7659 -0.938943 0 +1.74924 -0.969619 0 +1.73205 -1 0 +1.71433 -1.03008 0 +1.6961 -1.05984 0 +1.67734 -1.08928 0 +1.65808 -1.11839 0 +1.6383 -1.14715 0 +1.61803 -1.17557 0 +1.59727 -1.20363 0 +1.57602 -1.23132 0 +1.55429 -1.25864 0 +1.53209 -1.28558 0 +1.50942 -1.31212 0 +1.48629 -1.33826 0 +1.46271 -1.364 0 +1.43868 -1.38932 0 +1.41421 -1.41421 0 +1.38932 -1.43868 0 +1.364 -1.46271 0 +1.33826 -1.48629 0 +1.31212 -1.50942 0 +1.28558 -1.53209 0 +1.25864 -1.55429 0 +1.23132 -1.57602 0 +1.20363 -1.59727 0 +1.17557 -1.61803 0 +1.14715 -1.6383 0 +1.11839 -1.65808 0 +1.08928 -1.67734 0 +1.05984 -1.6961 0 +1.03008 -1.71433 0 +1 -1.73205 0 +0.969619 -1.74924 0 +0.938943 -1.7659 0 +0.907981 -1.78201 0 +0.876742 -1.79759 0 +0.845237 -1.81262 0 +0.813473 -1.82709 0 +0.781462 -1.84101 0 +0.749213 -1.85437 0 +0.716736 -1.86716 0 +0.68404 -1.87939 0 +0.651136 -1.89104 0 +0.618034 -1.90211 0 +0.584743 -1.91261 0 +0.551275 -1.92252 0 +0.517638 -1.93185 0 +0.483844 -1.94059 0 +0.449902 -1.94874 0 +0.415823 -1.9563 0 +0.381618 -1.96325 0 +0.347296 -1.96962 0 +0.312869 -1.97538 0 +0.278346 -1.98054 0 +0.243739 -1.98509 0 +0.209057 -1.98904 0 +0.174311 -1.99239 0 +0.139513 -1.99513 0 +0.104672 -1.99726 0 +0.069799 -1.99878 0 +0.0349048 -1.9997 0 +0 -2 0 +CELLS 180 540 +2 0 1 +2 1 2 +2 2 3 +2 3 4 +2 4 5 +2 5 6 +2 6 7 +2 7 8 +2 8 9 +2 9 10 +2 10 11 +2 11 12 +2 12 13 +2 13 14 +2 14 15 +2 15 16 +2 16 17 +2 17 18 +2 18 19 +2 19 20 +2 20 21 +2 21 22 +2 22 23 +2 23 24 +2 24 25 +2 25 26 +2 26 27 +2 27 28 +2 28 29 +2 29 30 +2 30 31 +2 31 32 +2 32 33 +2 33 34 +2 34 35 +2 35 36 +2 36 37 +2 37 38 +2 38 39 +2 39 40 +2 40 41 +2 41 42 +2 42 43 +2 43 44 +2 44 45 +2 45 46 +2 46 47 +2 47 48 +2 48 49 +2 49 50 +2 50 51 +2 51 52 +2 52 53 +2 53 54 +2 54 55 +2 55 56 +2 56 57 +2 57 58 +2 58 59 +2 59 60 +2 60 61 +2 61 62 +2 62 63 +2 63 64 +2 64 65 +2 65 66 +2 66 67 +2 67 68 +2 68 69 +2 69 70 +2 70 71 +2 71 72 +2 72 73 +2 73 74 +2 74 75 +2 75 76 +2 76 77 +2 77 78 +2 78 79 +2 79 80 +2 80 81 +2 81 82 +2 82 83 +2 83 84 +2 84 85 +2 85 86 +2 86 87 +2 87 88 +2 88 89 +2 89 90 +2 90 91 +2 91 92 +2 92 93 +2 93 94 +2 94 95 +2 95 96 +2 96 97 +2 97 98 +2 98 99 +2 99 100 +2 100 101 +2 101 102 +2 102 103 +2 103 104 +2 104 105 +2 105 106 +2 106 107 +2 107 108 +2 108 109 +2 109 110 +2 110 111 +2 111 112 +2 112 113 +2 113 114 +2 114 115 +2 115 116 +2 116 117 +2 117 118 +2 118 119 +2 119 120 +2 120 121 +2 121 122 +2 122 123 +2 123 124 +2 124 125 +2 125 126 +2 126 127 +2 127 128 +2 128 129 +2 129 130 +2 130 131 +2 131 132 +2 132 133 +2 133 134 +2 134 135 +2 135 136 +2 136 137 +2 137 138 +2 138 139 +2 139 140 +2 140 141 +2 141 142 +2 142 143 +2 143 144 +2 144 145 +2 145 146 +2 146 147 +2 147 148 +2 148 149 +2 149 150 +2 150 151 +2 151 152 +2 152 153 +2 153 154 +2 154 155 +2 155 156 +2 156 157 +2 157 158 +2 158 159 +2 159 160 +2 160 161 +2 161 162 +2 162 163 +2 163 164 +2 164 165 +2 165 166 +2 166 167 +2 167 168 +2 168 169 +2 169 170 +2 170 171 +2 171 172 +2 172 173 +2 173 174 +2 174 175 +2 175 176 +2 176 177 +2 177 178 +2 178 179 +2 179 180 +CELL_TYPES 180 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 diff --git a/tests/2d_broken_test/main.cpp b/tests/2d_broken_test/main.cpp new file mode 100644 index 0000000..9b64ae7 --- /dev/null +++ b/tests/2d_broken_test/main.cpp @@ -0,0 +1,101 @@ +/** + * ------------------------------------ + * @author: Weipeng Kong + * @date: 2021/11/17 + * @email: yjxkwp@foxmail.com + * @site: https://donot.fit + * @description: + * ------------------------------------ +**/ + +#include +#include "Octree/sdf/SDFOctree.h" +#include "Octree/OctreeBuilder.h" +#include "Octree/OctreeTraverser.h" +#include "Octree/sdf/SDFTraversalSampler.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "test-path.h" + +int main(){ + auto out_sphere_path = boost::filesystem::path(LOCAL_TEST_DATA_BASE_PATH) / "broken.vtk"; + auto inside_out_point_path = boost::filesystem::path(LOCAL_TEST_DATA_BASE_PATH) / "inside_output_point.vtk"; + auto outside_out_point_path = boost::filesystem::path(LOCAL_TEST_DATA_BASE_PATH) / "outside_output_point.vtk"; + + double radius = 2; + + Eigen::MatrixXd V; + Eigen::MatrixXi F; + + std::vector mesh; + pMesh::SurfaceMesh half_sphere; + + pMesh::SurfaceMesh debug_point_cloud; + + for (int i = 0; i <= 180; ++i) { + double rad = i * M_PI / 180; + double x = radius * std::sin(rad); + double y = radius * std::cos(rad); + half_sphere.push_vertex(Eigen::Vector3d{x, y, 0}); + if(i != 0) + half_sphere.push_face({i - 1, i}); + } + pMesh::io::VTKWriter(3, out_sphere_path) << pMesh::io::DefaultSurfaceWriteAdapter(half_sphere)(); + + V.resize(half_sphere.v_size(), 3); + F.resize(half_sphere.f_size(), 2); + + for (int i = 0; i < half_sphere.v_size(); ++i) { + V.row(i) = half_sphere.vertices[i].attr.coordinate; + } + for (int i = 0; i < half_sphere.f_size(); ++i) { + F.row(i) << half_sphere.faces[i].attr.vertices[0].id(), half_sphere.faces[i].attr.vertices[1].id(); + } + + Eigen::MatrixXd GV; + Eigen::RowVector3i res; + const int s = 10; + igl::voxel_grid(V, 0, s, 0, GV, res); + + Eigen::MatrixXd S; + Eigen::MatrixXi I; + Eigen::MatrixXd C; + Eigen::MatrixXd N; + + igl::signed_distance(GV, V, F, igl::SIGNED_DISTANCE_TYPE_PSEUDONORMAL, S, I, C, N); + +// pMesh::SurfaceMesh inside_mesh; +// pMesh::SurfaceMesh outside_mesh; +// +// for (int i = 0; i < GV.rows(); ++i) { +// auto p = GV.row(i); +// if (S(i) < 0) { +//// std::cout << hier3.winding_number(p) << std::endl; +// auto v = pMesh::Surface::Vertex(inside_mesh.v_size(), GV.row(i)); +// auto f = pMesh::Surface::Face({.vertices={pMesh::Surface::VertexHandle(inside_mesh.v_size())}}); +// inside_mesh.vertices.emplace_back(v); +// inside_mesh.faces.emplace_back(f); +// +// } else { +// auto v = pMesh::Surface::Vertex(outside_mesh.v_size(), GV.row(i)); +// auto f = pMesh::Surface::Face({.vertices={pMesh::Surface::VertexHandle(outside_mesh.v_size())}}); +// outside_mesh.vertices.emplace_back(v); +// outside_mesh.faces.emplace_back(f); +// } +// } +// pMesh::io::VTKWriter(1, inside_out_point_path.string()) << pMesh::io::DefaultSurfaceWriteAdapter(inside_mesh)(); +// pMesh::io::VTKWriter(1, outside_out_point_path.string()) << pMesh::io::DefaultSurfaceWriteAdapter(outside_mesh)(); +} \ No newline at end of file diff --git a/tests/2d_broken_test/test-path.h.in b/tests/2d_broken_test/test-path.h.in new file mode 100644 index 0000000..d0b190c --- /dev/null +++ b/tests/2d_broken_test/test-path.h.in @@ -0,0 +1,18 @@ +/** + * ------------------------------------ + * @author: Weipeng Kong + * @date: 2021/12/1 + * @email: yjxkwp@foxmail.com + * @site: https://donot.fit + * @description: + * ------------------------------------ +**/ + +#ifndef OCTREE_SDF_TEST_PATH_H +#define OCTREE_SDF_TEST_PATH_H + +#define TEST_DATA_BASE_PATH "@TEST_DATA_BASE_PATH@" + +#define LOCAL_TEST_DATA_BASE_PATH "@LOCAL_TEST_DATA_BASE_PATH@" + +#endif //OCTREE_SDF_TEST_PATH_H diff --git a/tests/aabb_tree_test/main.cpp b/tests/aabb_tree_test/main.cpp index 977e690..6f9838a 100644 --- a/tests/aabb_tree_test/main.cpp +++ b/tests/aabb_tree_test/main.cpp @@ -1,89 +1 @@ -/** - * ------------------------------------ - * @author: Weipeng Kong - * @date: 2021/11/17 - * @email: yjxkwp@foxmail.com - * @site: https://donot.fit - * @description: - * ------------------------------------ -**/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "test-path.h" - -int main() { - auto mesh_path = boost::filesystem::path(LOCAL_TEST_DATA_BASE_PATH) / "hole_quarter_sphere.obj"; - auto inside_out_point_path = boost::filesystem::path(LOCAL_TEST_DATA_BASE_PATH) / "inside_output_point.vtk"; - auto outside_out_point_path = boost::filesystem::path(LOCAL_TEST_DATA_BASE_PATH) / "outside_output_point.vtk"; - auto mc_out_point_path = boost::filesystem::path(LOCAL_TEST_DATA_BASE_PATH) / "hole_quarter_sphere_mc.obj"; - Eigen::MatrixXd V; - Eigen::MatrixXi F; - igl::read_triangle_mesh(mesh_path.string(), V, F); - -// typedef Eigen::Matrix RowVector3S; -// igl::WindingNumberAABB hier3; -// hier3.set_mesh(V, F); -// hier3.grow(); -// igl::AABB aabb; -// igl::signed_distance_pseudonormal(aabb,) - - - Eigen::MatrixXd GV; - Eigen::RowVector3i res; - const int s = 10; - igl::voxel_grid(V, 0, s, 1, GV, res); - - Eigen::MatrixXd S; - Eigen::MatrixXi I; - Eigen::MatrixXd C; - Eigen::MatrixXd N; - - igl::signed_distance(GV, V, F, igl::SIGNED_DISTANCE_TYPE_PSEUDONORMAL, S, I, C, N); - - pMesh::SurfaceMesh inside_mesh; - pMesh::SurfaceMesh outside_mesh; - - for (int i = 0; i < GV.rows(); ++i) { - auto p = GV.row(i); - if (S(i) < 0) { -// std::cout << hier3.winding_number(p) << std::endl; - auto v = pMesh::Surface::Vertex(inside_mesh.v_size(), GV.row(i)); - auto f = pMesh::Surface::Face({.vertices={pMesh::Surface::VertexHandle(inside_mesh.v_size())}}); - inside_mesh.vertices.emplace_back(v); - inside_mesh.faces.emplace_back(f); - - } else { - auto v = pMesh::Surface::Vertex(outside_mesh.v_size(), GV.row(i)); - auto f = pMesh::Surface::Face({.vertices={pMesh::Surface::VertexHandle(outside_mesh.v_size())}}); - outside_mesh.vertices.emplace_back(v); - outside_mesh.faces.emplace_back(f); - } - } - pMesh::io::VTKWriter(1, inside_out_point_path.string()) << pMesh::io::DefaultSurfaceWriteAdapter(inside_mesh)(); - pMesh::io::VTKWriter(1, outside_out_point_path.string()) << pMesh::io::DefaultSurfaceWriteAdapter(outside_mesh)(); - - Eigen::MatrixXd SV, BV; - Eigen::MatrixXi SF, BF; - - igl::marching_cubes(S, GV, res(0), res(1), res(2), 0, SV, SF); - - igl::writeOBJ(mc_out_point_path.string(), SV, SF); - - return 0; -} - +/** * ------------------------------------ * @author: Weipeng Kong * @date: 2021/11/17 * @email: yjxkwp@foxmail.com * @site: https://donot.fit * @description: * ------------------------------------ **/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "test-path.h" int main() { auto mesh_path = boost::filesystem::path(LOCAL_TEST_DATA_BASE_PATH) / "dup_quarter_sphere.obj"; auto inside_out_point_path = boost::filesystem::path(LOCAL_TEST_DATA_BASE_PATH) / "inside_output_point.vtk"; auto outside_out_point_path = boost::filesystem::path(LOCAL_TEST_DATA_BASE_PATH) / "outside_output_point.vtk"; auto mc_out_point_path = boost::filesystem::path(LOCAL_TEST_DATA_BASE_PATH) / "dup_quarter_sphere_mc.obj"; Eigen::MatrixXd V; Eigen::MatrixXi F; igl::read_triangle_mesh(mesh_path.string(), V, F); // typedef Eigen::Matrix RowVector3S; // igl::WindingNumberAABB hier3; // hier3.set_mesh(V, F); // hier3.grow(); // igl::AABB aabb; // igl::signed_distance_pseudonormal(aabb,) Eigen::MatrixXd GV; Eigen::RowVector3i res; const int s = 30; igl::voxel_grid(V, 0, s, 0, GV, res); Eigen::MatrixXd S; Eigen::MatrixXi I; Eigen::MatrixXd C; Eigen::MatrixXd N; igl::signed_distance(GV, V, F, igl::SIGNED_DISTANCE_TYPE_PSEUDONORMAL, S, I, C, N); pMesh::SurfaceMesh inside_mesh; pMesh::SurfaceMesh outside_mesh; for (int i = 0; i < GV.rows(); ++i) { auto p = GV.row(i); if (S(i) < 0) { // std::cout << hier3.winding_number(p) << std::endl; auto v = pMesh::Surface::Vertex(inside_mesh.v_size(), GV.row(i)); auto f = pMesh::Surface::Face({.vertices={pMesh::Surface::VertexHandle(inside_mesh.v_size())}}); inside_mesh.vertices.emplace_back(v); inside_mesh.faces.emplace_back(f); } else { auto v = pMesh::Surface::Vertex(outside_mesh.v_size(), GV.row(i)); auto f = pMesh::Surface::Face({.vertices={pMesh::Surface::VertexHandle(outside_mesh.v_size())}}); outside_mesh.vertices.emplace_back(v); outside_mesh.faces.emplace_back(f); } } pMesh::io::VTKWriter(1, inside_out_point_path.string()) << pMesh::io::DefaultSurfaceWriteAdapter(inside_mesh)(); pMesh::io::VTKWriter(1, outside_out_point_path.string()) << pMesh::io::DefaultSurfaceWriteAdapter(outside_mesh)(); Eigen::MatrixXd SV, BV; Eigen::MatrixXi SF, BF; igl::marching_cubes(S, GV, res(0), res(1), res(2), 0, SV, SF); igl::writeOBJ(mc_out_point_path.string(), SV, SF); return 0; } \ No newline at end of file