#include "tutorial_shared_path.h" #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { // Create the peak height field Eigen::MatrixXi F; Eigen::MatrixXd V; igl::read_triangle_mesh( argc>1?argv[1]: TUTORIAL_SHARED_PATH "/beetle.off",V,F); // Precomputation igl::HeatGeodesicsData data; double t = std::pow(igl::avg_edge_length(V,F),2); const auto precompute = [&]() { if(!igl::heat_geodesics_precompute(V,F,t,data)) { std::cerr<<"Error: heat_geodesics_precompute failed."<bool { int fid; Eigen::Vector3f bc; // Cast a ray in the view direction starting from the mouse position double x = viewer.current_mouse_x; double y = viewer.core().viewport(3) - viewer.current_mouse_y; if(igl::unproject_onto_mesh(Eigen::Vector2f(x,y), viewer.core().view, viewer.core().proj, viewer.core().viewport, V, F, fid, bc)) { // 3d position of hit const Eigen::RowVector3d m3 = V.row(F(fid,0))*bc(0) + V.row(F(fid,1))*bc(1) + V.row(F(fid,2))*bc(2); int cid = 0; Eigen::Vector3d( (V.row(F(fid,0))-m3).squaredNorm(), (V.row(F(fid,1))-m3).squaredNorm(), (V.row(F(fid,2))-m3).squaredNorm()).minCoeff(&cid); const int vid = F(fid,cid); C.row(vid)<<1,0,0; Eigen::VectorXd D = Eigen::VectorXd::Zero(data.Grad.cols()); D(vid) = 1; igl::heat_geodesics_solve(data,(Eigen::VectorXi(1,1)<bool { if(update()) { down_on_mesh = true; return true; } return false; }; viewer.callback_mouse_move = [&](igl::opengl::glfw::Viewer& viewer, int, int)->bool { if(down_on_mesh) { update(); return true; } return false; }; viewer.callback_mouse_up = [&down_on_mesh](igl::opengl::glfw::Viewer& viewer, int, int)->bool { down_on_mesh = false; return false; }; std::cout<bool { switch(key) { default: return false; case 'D': case 'd': data.use_intrinsic_delaunay = !data.use_intrinsic_delaunay; std::cout<<(data.use_intrinsic_delaunay?"":"not ")<< "using intrinsic delaunay..."<