main.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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/viewer/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. // Pseudo-color based on solution
  58. MatrixXd C;
  59. igl::jet(Z,true,C);
  60. // Plot the mesh with pseudocolors
  61. igl::viewer::Viewer viewer;
  62. viewer.data.set_mesh(V, F);
  63. viewer.core.show_lines = false;
  64. viewer.data.set_colors(C);
  65. viewer.launch();
  66. }