#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "tutorial_shared_path.h" using namespace std; // Input mesh Eigen::MatrixXd V; Eigen::MatrixXi F; std::vector V_border; std::vector > VF, VFi; std::vector > VV; Eigen::MatrixXi TT, TTi; Eigen::MatrixXi E, E2F, F2E; // Per face bases (only needed to generate constraints) Eigen::MatrixXd B1,B2,B3; // "Subdivided" mesh obtained by splitting each triangle into 3 (only needed for display) Eigen::MatrixXd Vbs; Eigen::MatrixXi Fbs; // Scale for visualizing the fields double global_scale; // Scale for visualizing textures double uv_scale; // Data for original PolyVector field Eigen::MatrixXd two_pv_ori; // field Eigen::VectorXi singularities_ori; // singularities Eigen::VectorXd curl_ori; // curl per edge Eigen::MatrixXi cuts_ori; // cut edges Eigen::MatrixXd two_pv_poisson_ori; // field after poisson integration Eigen::VectorXf poisson_error_ori; // poisson integration error Eigen::MatrixXd scalars_ori; Eigen::MatrixXd Vcut_ori; Eigen::MatrixXi Fcut_ori; // Data for curl-free PolyVector field Eigen::MatrixXd two_pv; // field Eigen::VectorXi singularities; // singularities Eigen::VectorXd curl; // curl per edge Eigen::MatrixXi cuts; // cut edges Eigen::MatrixXd two_pv_poisson; // field after poisson integration Eigen::VectorXf poisson_error; // poisson integration error Eigen::MatrixXd scalars; Eigen::MatrixXd Vcut; Eigen::MatrixXi Fcut; // Vector of constrained faces Eigen::VectorXi b; // Matrix of constraints Eigen::MatrixXd bc; // "constraint level" flag (level=2 indicates that both directions are constrained, // level = 1 indicates a partially constrained face, i.e. only the first vector will // be constrained) Eigen::VectorXi blevel; // Face Barycenters (only needed for display) Eigen::MatrixXd B; // percentage of constrained faces double constraint_percentage = 0.002; // Random length factor double rand_factor = 5; // The set of parameters for calculating the curl-free fields igl::integrable_polyvector_fields_parameters params; // Solver data (needed for precomputation) igl::IntegrableFieldSolverData ipfdata; //texture image Eigen::Matrix texture_R, texture_G, texture_B; int display_mode = 1; int iter = 0; // Create a texture that hides the integer translation in the parametrization void line_texture(Eigen::Matrix &texture_R, Eigen::Matrix &texture_G, Eigen::Matrix &texture_B) { unsigned size = 128; unsigned size2 = size/2; unsigned lineWidth = 3; texture_R.setConstant(size, size, 255); for (unsigned i=0; i0) color.row(i)<<0.7,0.7,0.7; // Eigen::RowVector3d color; color<<0.5,0.5,0.5; viewer.data.add_edges(Bc - global_scale*bc.block(0,n*3,bc.rows(),3), Bc + global_scale*bc.block(0,n*3,bc.rows(),3) , color); } } void colorEdgeMeshFaces(const Eigen::VectorXd &values, const double &minimum, const double &maximum, Eigen::MatrixXd &C) { C.setConstant(Fbs.rows(),3,1); Eigen::MatrixXd colors; igl::jet(values, minimum, maximum, colors); for (int ei = 0; ei