param_2d_demo_iter.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include "param_2d_demo_iter.h"
  2. #include "check_mesh_for_issues.h"
  3. #include <igl/read_triangle_mesh.h>
  4. #include <igl/opengl/glfw/Viewer.h>
  5. #include <igl/flipped_triangles.h>
  6. #include <igl/MappingEnergyType.h>
  7. #include <igl/harmonic.h>
  8. #include <igl/map_vertices_to_circle.h>
  9. #include <igl/boundary_loop.h>
  10. #include <igl/slim.h>
  11. #include <igl/Timer.h>
  12. void param_2d_demo_iter(
  13. Eigen::MatrixXd & V,
  14. Eigen::MatrixXi & F,
  15. double & uv_scale_param,
  16. bool & first_iter,
  17. igl::SLIMData& sData,
  18. igl::Timer & timer,
  19. igl::opengl::glfw::Viewer& viewer)
  20. {
  21. using namespace std;
  22. if (first_iter) {
  23. timer.start();
  24. igl::read_triangle_mesh(TUTORIAL_SHARED_PATH "/face.obj", V, F);
  25. check_mesh_for_issues(V,F);
  26. cout << "\tMesh is valid!" << endl;
  27. Eigen::MatrixXd uv_init;
  28. Eigen::VectorXi bnd; Eigen::MatrixXd bnd_uv;
  29. igl::boundary_loop(F,bnd);
  30. igl::map_vertices_to_circle(V,bnd,bnd_uv);
  31. igl::harmonic(V,F,bnd,bnd_uv,1,uv_init);
  32. if (igl::flipped_triangles(uv_init,F).size() != 0) {
  33. igl::harmonic(F,bnd,bnd_uv,1,uv_init); // use uniform laplacian
  34. }
  35. cout << "initialized parametrization" << endl;
  36. sData.slim_energy = igl::MappingEnergyType::SYMMETRIC_DIRICHLET;
  37. Eigen::VectorXi b; Eigen::MatrixXd bc;
  38. slim_precompute(V,F,uv_init,sData, igl::MappingEnergyType::SYMMETRIC_DIRICHLET, b,bc,0);
  39. uv_scale_param = 15 * (1./sqrt(sData.mesh_area));
  40. viewer.data().set_mesh(V, F);
  41. viewer.core().align_camera_center(V,F);
  42. viewer.data().set_uv(sData.V_o*uv_scale_param);
  43. viewer.data().compute_normals();
  44. viewer.data().show_texture = true;
  45. first_iter = false;
  46. } else {
  47. timer.start();
  48. slim_solve(sData,1); // 1 iter
  49. viewer.data().set_uv(sData.V_o*uv_scale_param);
  50. }
  51. cout << "time = " << timer.getElapsedTime() << endl;
  52. cout << "energy = " << sData.energy << endl;
  53. }