miq.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #include <test_common.h>
  2. #include <igl/avg_edge_length.h>
  3. #include <igl/barycenter.h>
  4. #include <igl/comb_cross_field.h>
  5. #include <igl/comb_frame_field.h>
  6. #include <igl/compute_frame_field_bisectors.h>
  7. #include <igl/cross_field_mismatch.h>
  8. #include <igl/cut_mesh_from_singularities.h>
  9. #include <igl/find_cross_field_singularities.h>
  10. #include <igl/local_basis.h>
  11. #include <igl/readOFF.h>
  12. #include <igl/rotate_vectors.h>
  13. #include <igl/copyleft/comiso/miq.h>
  14. #include <igl/copyleft/comiso/nrosy.h>
  15. #include <igl/PI.h>
  16. #include <igl/serialize.h>
  17. #include <sstream>
  18. #include <igl/writeDMAT.h>
  19. TEST_CASE("miq: 3_holes", "[igl/copyleft/comiso]")
  20. {
  21. using namespace Eigen;
  22. // Input mesh
  23. Eigen::MatrixXd V;
  24. Eigen::MatrixXi F;
  25. // Face barycenters
  26. Eigen::MatrixXd B;
  27. // Cross field
  28. Eigen::MatrixXd X1,X2;
  29. // Bisector field
  30. Eigen::MatrixXd BIS1, BIS2;
  31. // Combed bisector
  32. Eigen::MatrixXd BIS1_combed, BIS2_combed;
  33. // Per-corner, integer mismatches
  34. Eigen::Matrix<int, Eigen::Dynamic, 3> MMatch;
  35. // Field singularities
  36. Eigen::Matrix<int, Eigen::Dynamic, 1> isSingularity, singularityIndex;
  37. // Per corner seams
  38. Eigen::Matrix<int, Eigen::Dynamic, 3> Seams;
  39. // Combed field
  40. Eigen::MatrixXd X1_combed, X2_combed;
  41. // Global parametrization
  42. Eigen::MatrixXd UV;
  43. Eigen::MatrixXi FUV;
  44. // Global parametrization (reference)
  45. Eigen::MatrixXd UV_ref;
  46. Eigen::MatrixXi FUV_ref;
  47. // Load a mesh in OFF format
  48. igl::readOFF(test_common::data_path("3holes.off"), V, F);
  49. double gradient_size = 50;
  50. double iter = 0;
  51. double stiffness = 5.0;
  52. bool direct_round = 0;
  53. // Compute face barycenters
  54. igl::barycenter(V, F, B);
  55. // Contrain one face
  56. VectorXi b(1);
  57. b << 0;
  58. MatrixXd bc(1, 3);
  59. bc << 1, 0, 0;
  60. // Create a smooth 4-RoSy field
  61. VectorXd S;
  62. igl::copyleft::comiso::nrosy(V, F, b, bc, VectorXi(), VectorXd(), MatrixXd(), 4, 0.5, X1, S);
  63. // Find the orthogonal vector
  64. MatrixXd B1, B2, B3;
  65. igl::local_basis(V, F, B1, B2, B3);
  66. X2 = igl::rotate_vectors(X1, VectorXd::Constant(1, igl::PI / 2), B1, B2);
  67. // Always work on the bisectors, it is more general
  68. igl::compute_frame_field_bisectors(V, F, X1, X2, BIS1, BIS2);
  69. // Comb the field, implicitly defining the seams
  70. igl::comb_cross_field(V, F, BIS1, BIS2, BIS1_combed, BIS2_combed);
  71. // Find the integer mismatches
  72. igl::cross_field_mismatch(V, F, BIS1_combed, BIS2_combed, true, MMatch);
  73. // Find the singularities
  74. igl::find_cross_field_singularities(V, F, MMatch, isSingularity, singularityIndex);
  75. // Cut the mesh, duplicating all vertices on the seams
  76. igl::cut_mesh_from_singularities(V, F, MMatch, Seams);
  77. // Comb the frame-field accordingly
  78. igl::comb_frame_field(V, F, X1, X2, BIS1_combed, BIS2_combed, X1_combed, X2_combed);
  79. // Global parametrization
  80. igl::copyleft::comiso::miq(V,
  81. F,
  82. X1_combed,
  83. X2_combed,
  84. MMatch,
  85. isSingularity,
  86. Seams,
  87. UV,
  88. FUV,
  89. gradient_size,
  90. stiffness,
  91. direct_round,
  92. iter,
  93. 5,
  94. true);
  95. // Refresh the test data
  96. // igl::writeDMAT(test_common::data_path("3holes-miq-UV.dmat"),UV);
  97. // igl::writeDMAT(test_common::data_path("3holes-miq-FUV.dmat"),FUV);
  98. igl::readDMAT(test_common::data_path("3holes-miq-UV.dmat"),UV_ref);
  99. igl::readDMAT(test_common::data_path("3holes-miq-FUV.dmat"),FUV_ref);
  100. REQUIRE (1e-6 > (UV-UV_ref).array().abs().maxCoeff());
  101. REQUIRE (1e-6 > (FUV-FUV_ref).array().abs().maxCoeff());
  102. }