main.cpp 1.9 KB

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