#include #include #include #include #include #include double z_max = 1.0; double z_dir = -0.03; int k = 2; bool resolve = true; Eigen::MatrixXd V,U; Eigen::VectorXd Z; Eigen::MatrixXi F; Eigen::VectorXi b; Eigen::VectorXd bc; bool pre_draw(igl::opengl::glfw::Viewer & viewer) { using namespace Eigen; if(resolve) { igl::harmonic(V,F,b,bc,k,Z); resolve = false; } U.col(2) = z_max*Z; viewer.data().set_vertices(U); viewer.data().compute_normals(); if(viewer.core().is_animating) { z_max += z_dir; z_dir *= (z_max>=1.0 || z_max<=0.0?-1.0:1.0); } return false; } bool key_down(igl::opengl::glfw::Viewer &viewer, unsigned char key, int mods) { switch(key) { case ' ': viewer.core().is_animating = !viewer.core().is_animating; break; case '.': k++; k = (k>4?4:k); resolve = true; break; case ',': k--; k = (k<1?1:k); resolve = true; break; } return true; } int main(int argc, char *argv[]) { using namespace Eigen; using namespace std; igl::readOBJ(TUTORIAL_SHARED_PATH "/bump-domain.obj",V,F); U=V; // Find boundary vertices outside annulus typedef Matrix VectorXb; VectorXb is_outer = (V.rowwise().norm().array()-1.0)>-1e-15; VectorXb is_inner = (V.rowwise().norm().array()-0.15)<1e-15; VectorXb in_b = is_outer.array() || is_inner.array(); igl::colon(0,V.rows()-1,b); b.conservativeResize(stable_partition( b.data(), b.data()+b.size(), [&in_b](int i)->bool{return in_b(i);})-b.data()); bc.resize(b.size(),1); for(int bi = 0;bi