main.cpp 1.9 KB

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