2
0

get_mesh.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include "get_mesh.h"
  2. #include <igl/copyleft/cgal/CSGTree.h>
  3. void get_mesh(
  4. const Eigen::MatrixXd &VA,
  5. const Eigen::MatrixXi &FA,
  6. const Eigen::MatrixXd &VB,
  7. const Eigen::MatrixXi &FB,
  8. const Eigen::MatrixXd &VC,
  9. const Eigen::MatrixXi &FC,
  10. const Eigen::MatrixXd &VD,
  11. const Eigen::MatrixXi &FD,
  12. const Eigen::MatrixXd &VE,
  13. const Eigen::MatrixXi &FE,
  14. const int view_id,
  15. Eigen::MatrixXd &V,
  16. Eigen::MatrixXi &F,
  17. Eigen::VectorXd &I)
  18. {
  19. using namespace Eigen;
  20. const auto & set_mesh = [&V,&F,&I](const Eigen::MatrixXd &V_, const Eigen::MatrixXi &F_, const int i)
  21. {
  22. V = V_;
  23. F = F_;
  24. I = VectorXd::Constant(F.rows(),1,i);
  25. };
  26. switch(view_id)
  27. {
  28. case 0:
  29. set_mesh(VA,FA,5);
  30. break;
  31. case 1:
  32. set_mesh(VB,FB,4);
  33. break;
  34. case 2:
  35. set_mesh(VC,FC,3);
  36. break;
  37. case 3:
  38. set_mesh(VD,FD,2);
  39. break;
  40. case 4:
  41. set_mesh(VE,FE,1);
  42. break;
  43. default:
  44. {
  45. igl::copyleft::cgal::CSGTree M;
  46. VectorXi J;
  47. switch(view_id)
  48. {
  49. case 5:
  50. // Compute result of (A ∩ B)
  51. M = {{VA,FA},{VB,FB},"i"};
  52. J = M.J().array()+0;
  53. break;
  54. case 6:
  55. // Compute result of (C ∪ D)
  56. M = {{VC,FC},{VD,FD},"u"};
  57. J = M.J().array()+FA.rows()+FB.rows();
  58. break;
  59. case 7:
  60. // Compute result of (C ∪ D) ∪ E
  61. M = {{{VC,FC},{VD,FD},"u"},{VE,FE},"u"};
  62. J = M.J().array()+FA.rows()+FB.rows();
  63. break;
  64. case 8:
  65. // Compute result of (A ∩ B) \ ((C ∪ D) ∪ E)
  66. M = {{{VA,FA},{VB,FB},"i"},{{{VC,FC},{VD,FD},"u"},{VE,FE},"u"},"m"};
  67. J = M.J().array()+0;
  68. break;
  69. default:
  70. assert(false && "unknown view id");
  71. }
  72. V = M.cast_V<MatrixXd>();
  73. F = M.F();
  74. I.resize(M.F().rows(),1);
  75. // Compute colors based on original facets
  76. for(int f = 0;f<M.F().rows();f++)
  77. {
  78. const int j = J(f);
  79. I(f) =
  80. (int)(j<FA.rows())+
  81. (int)(j<FA.rows()+FB.rows())+
  82. (int)(j<FA.rows()+FB.rows()+FC.rows())+
  83. (int)(j<FA.rows()+FB.rows()+FC.rows()+FD.rows())+
  84. (int)(j<FA.rows()+FB.rows()+FC.rows()+FD.rows()+FE.rows());
  85. }
  86. }
  87. }
  88. }