main.cpp 3.2 KB

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