#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { const auto time = [](std::function func)->double { const double t_before = igl::get_seconds(); func(); const double t_after = igl::get_seconds(); return t_after-t_before; }; Eigen::MatrixXd V; Eigen::MatrixXi F; igl::read_triangle_mesh(argc>1?argv[1]:TUTORIAL_SHARED_PATH "/bunny.off",V,F); // Sample mesh for point cloud Eigen::MatrixXd P,N; { Eigen::VectorXi I; Eigen::MatrixXd B; igl::random_points_on_mesh(10000,V,F,B,I,P); Eigen::MatrixXd FN; igl::per_face_normals(V,F,FN); N.resize(P.rows(),3); for(int p = 0;p > O_PI; Eigen::MatrixXi O_CH; Eigen::MatrixXd O_CN; Eigen::VectorXd O_W; igl::octree(P,O_PI,O_CH,O_CN,O_W); Eigen::VectorXd A; { Eigen::MatrixXi I; igl::knn(P,20,O_PI,O_CH,O_CN,O_W,I); // CGAL is only used to help get point areas igl::copyleft::cgal::point_areas(P,I,N,A); } if(argc<=1) { // corrupt mesh Eigen::MatrixXd BC; igl::barycenter(V,F,BC); Eigen::MatrixXd OV = V; V.resize(F.rows()*3,3); for(int f = 0;f (rand()) / static_cast (RAND_MAX), Eigen::Vector3d::Random(3,1)); V.row(v) = (OV.row(F(f,c))-BC.row(f))*R.matrix()+BC.row(f); F(f,c) = v; } } } // Generate a list of random query points in the bounding box Eigen::MatrixXd Q = Eigen::MatrixXd::Random(1000000,3); const Eigen::RowVector3d Vmin = V.colwise().minCoeff(); const Eigen::RowVector3d Vmax = V.colwise().maxCoeff(); const Eigen::RowVector3d Vdiag = Vmax-Vmin; for(int q = 0;q0.5).eval(),1,QiP); } // Positions of points inside of triangle soup (V,F) Eigen::MatrixXd QiV; { igl::FastWindingNumberBVH fwn_bvh; printf("triangle soup precomputation (% 8ld triangles): %g secs\n", F.rows(), time([&](){igl::fast_winding_number(V.cast().eval(),F,2,fwn_bvh);})); Eigen::VectorXf WiV; printf(" triangle soup evaluation (% 8ld queries): %g secs\n", Q.rows(), time([&](){igl::fast_winding_number(fwn_bvh,2,Q.cast().eval(),WiV);})); igl::slice_mask(Q,WiV.array()>0.5,1,QiV); } // Visualization igl::opengl::glfw::Viewer viewer; // For dislpaying normals as little line segments Eigen::MatrixXd PN(2*P.rows(),3); Eigen::MatrixXi E(P.rows(),2); const double bbd = igl::bounding_box_diagonal(V); for(int p = 0;p