main.cpp 3.3 KB

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