main.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #include <igl/read_triangle_mesh.h>
  2. #include <igl/copyleft/cgal/CSGTree.h>
  3. #include <igl/viewer/Viewer.h>
  4. #include <igl/jet.h>
  5. #include <Eigen/Core>
  6. #include "tutorial_shared_path.h"
  7. int main(int argc, char * argv[])
  8. {
  9. using namespace Eigen;
  10. using namespace igl::copyleft::cgal;
  11. using namespace std;
  12. using namespace igl;
  13. cout<<R"(
  14. [,] Toggle between boolean sub-tree operations
  15. )";
  16. MatrixXi FA,FB,FC,FD,FE;
  17. MatrixXd VA,VB,VC,VD,VE;
  18. // Read in inputs as double precision floating point meshes
  19. read_triangle_mesh(TUTORIAL_SHARED_PATH "/cube.obj" ,VA,FA);
  20. read_triangle_mesh(TUTORIAL_SHARED_PATH "/sphere.obj" ,VB,FB);
  21. read_triangle_mesh(TUTORIAL_SHARED_PATH "/xcylinder.obj",VC,FC);
  22. read_triangle_mesh(TUTORIAL_SHARED_PATH "/ycylinder.obj",VD,FD);
  23. read_triangle_mesh(TUTORIAL_SHARED_PATH "/zcylinder.obj",VE,FE);
  24. igl::viewer::Viewer viewer;
  25. int num_views = 5+4;
  26. int view_id = num_views-1;
  27. const auto & update = [&]()
  28. {
  29. viewer.data.clear();
  30. // CSGTree templated on type of F
  31. VectorXd I;
  32. const auto & set_mesh =
  33. [&](const MatrixXd & V, const MatrixXi & F, const int i)
  34. {
  35. viewer.data.set_mesh(V,F);
  36. I = VectorXd::Constant(F.rows(),1,i);
  37. };
  38. switch(view_id)
  39. {
  40. case 0:
  41. set_mesh(VA,FA,5);
  42. break;
  43. case 1:
  44. set_mesh(VB,FB,4);
  45. break;
  46. case 2:
  47. set_mesh(VC,FC,3);
  48. break;
  49. case 3:
  50. set_mesh(VD,FD,2);
  51. break;
  52. case 4:
  53. set_mesh(VE,FE,1);
  54. break;
  55. default:
  56. {
  57. CSGTree M;
  58. Matrix<MatrixXi::Index,Dynamic,1> J;
  59. switch(view_id)
  60. {
  61. case 5:
  62. // Compute result of (A ∩ B)
  63. M = {{VA,FA},{VB,FB},"i"};
  64. J = M.J().array()+0;
  65. break;
  66. case 6:
  67. // Compute result of (C ∪ D)
  68. M = {{VC,FC},{VD,FD},"u"};
  69. J = M.J().array()+FA.rows()+FB.rows();
  70. break;
  71. case 7:
  72. // Compute result of (C ∪ D) ∪ E
  73. M = {{{VC,FC},{VD,FD},"u"},{VE,FE},"u"};
  74. J = M.J().array()+FA.rows()+FB.rows();
  75. break;
  76. case 8:
  77. // Compute result of (A ∩ B) \ ((C ∪ D) ∪ E)
  78. M = {{{VA,FA},{VB,FB},"i"},{{{VC,FC},{VD,FD},"u"},{VE,FE},"u"},"m"};
  79. J = M.J().array()+0;
  80. break;
  81. default:
  82. assert(false && "unknown view id");
  83. }
  84. viewer.data.set_mesh(M.cast_V<MatrixXd>(),M.F());
  85. I.resize(M.F().rows(),1);
  86. // Compute colors based on original facets
  87. for(int f = 0;f<M.F().rows();f++)
  88. {
  89. const int j = J(f);
  90. I(f) =
  91. (int)(j<FA.rows())+
  92. (int)(j<FA.rows()+FB.rows())+
  93. (int)(j<FA.rows()+FB.rows()+FC.rows())+
  94. (int)(j<FA.rows()+FB.rows()+FC.rows()+FD.rows())+
  95. (int)(j<FA.rows()+FB.rows()+FC.rows()+FD.rows()+FE.rows());
  96. }
  97. }
  98. }
  99. MatrixXd C;
  100. jet(I,1,5,C);
  101. viewer.data.set_colors(C);
  102. };
  103. update();
  104. viewer.callback_key_down =
  105. [&](igl::viewer::Viewer &viewer, unsigned char key, int mods)->bool
  106. {
  107. switch(key)
  108. {
  109. case ']':
  110. view_id = (view_id+1)%num_views;
  111. break;
  112. case '[':
  113. view_id = (view_id+num_views-1)%num_views;
  114. break;
  115. default:
  116. return false;
  117. }
  118. update();
  119. return true;
  120. };
  121. viewer.launch();
  122. }