main.cpp 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include <igl/boundary_facets.h>
  2. #include <igl/colon.h>
  3. #include <igl/cotmatrix.h>
  4. #include <igl/jet.h>
  5. #include <igl/min_quad_with_fixed.h>
  6. #include <igl/readOFF.h>
  7. #include <igl/setdiff.h>
  8. #include <igl/slice.h>
  9. #include <igl/unique.h>
  10. #include <igl/opengl/glfw/Viewer.h>
  11. #include <Eigen/Sparse>
  12. #include <iostream>
  13. int main(int argc, char *argv[])
  14. {
  15. using namespace Eigen;
  16. using namespace std;
  17. MatrixXd V;
  18. MatrixXi F;
  19. igl::readOFF(TUTORIAL_SHARED_PATH "/camelhead.off",V,F);
  20. // Find boundary edges
  21. MatrixXi E;
  22. igl::boundary_facets(F,E);
  23. // Find boundary vertices
  24. VectorXi b,IA,IC;
  25. igl::unique(E,b,IA,IC);
  26. // List of all vertex indices
  27. VectorXi all,in;
  28. igl::colon<int>(0,V.rows()-1,all);
  29. // List of interior indices
  30. igl::setdiff(all,b,in,IA);
  31. // Construct and slice up Laplacian
  32. SparseMatrix<double> L,L_in_in,L_in_b;
  33. igl::cotmatrix(V,F,L);
  34. igl::slice(L,in,in,L_in_in);
  35. igl::slice(L,in,b,L_in_b);
  36. // Dirichlet boundary conditions from z-coordinate
  37. VectorXd Z = V.col(2);
  38. VectorXd bc = Z(b);
  39. // Solve PDE
  40. SimplicialLLT<SparseMatrix<double > > solver(-L_in_in);
  41. // slice into solution
  42. Z(in) = solver.solve(L_in_b*bc).eval();
  43. // Alternative, short hand
  44. igl::min_quad_with_fixed_data<double> mqwf;
  45. // Linear term is 0
  46. VectorXd B = VectorXd::Zero(V.rows(),1);
  47. // Empty constraints
  48. VectorXd Beq;
  49. SparseMatrix<double> Aeq;
  50. // Our cotmatrix is _negative_ definite, so flip sign
  51. igl::min_quad_with_fixed_precompute((-L).eval(),b,Aeq,true,mqwf);
  52. igl::min_quad_with_fixed_solve(mqwf,B,bc,Beq,Z);
  53. // Plot the mesh with pseudocolors
  54. igl::opengl::glfw::Viewer viewer;
  55. viewer.data().set_mesh(V, F);
  56. viewer.data().show_lines = false;
  57. viewer.data().set_data(Z);
  58. viewer.launch();
  59. }