#undef IGL_STATIC_LIBRARY #include #include #include #include #include #include #include #include #include #include #include #include #include #include // Input mesh Eigen::MatrixXd V; Eigen::MatrixXi F; // Face barycenters Eigen::MatrixXd B; // Quad mesh generated from smooth field Eigen::MatrixXd VQS; Eigen::MatrixXi FQS; Eigen::MatrixXi FQStri; Eigen::MatrixXd PQS0, PQS1, PQS2, PQS3; // Quad mesh generated from conjugate field Eigen::MatrixXd VQC; Eigen::MatrixXi FQC; Eigen::MatrixXi FQCtri; Eigen::MatrixXd VQCplan; Eigen::MatrixXd PQC0, PQC1, PQC2, PQC3; Eigen::MatrixXd PQCp0, PQCp1, PQCp2, PQCp3; // Scale for visualizing the fields double global_scale; // Input constraints Eigen::VectorXi b; Eigen::MatrixXd bc; Eigen::MatrixXd smooth_pvf; Eigen::MatrixXd conjugate_pvf; igl::ConjugateFFSolverData *csdata; bool key_down(igl::Viewer& viewer, unsigned char key, int modifier) { using namespace std; using namespace Eigen; if (key <'1' || key >'3') return false; viewer.data.lines.resize(0,9); // Highlight in red the constrained faces MatrixXd C = MatrixXd::Constant(F.rows(),3,1); for (unsigned i=0; i(V,F); conjugate_pvf = smooth_pvf; // Optimize the field int conjIter = 20; double lambdaOrtho = .1; double lambdaInit = 100; double lambdaMultFactor = 1.01; bool doHardConstraints = true; double lambdaOut; VectorXi isConstrained = VectorXi::Constant(F.rows(),0); for (unsigned i=0; i