fast_find_self_intersections.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include "test_common.h"
  2. #include <igl/fast_find_self_intersections.h>
  3. #include <igl/combine.h>
  4. #include <igl/sortrows.h>
  5. #include <igl/unique.h>
  6. #include <igl/matlab_format.h>
  7. #include <igl/PI.h>
  8. #include <iostream>
  9. #include <iomanip>
  10. TEST_CASE("fast_find_self_intersections: cube", "[igl]")
  11. {
  12. Eigen::MatrixXd V;
  13. Eigen::MatrixXi F;
  14. igl::read_triangle_mesh(test_common::data_path("cube.obj"), V, F);
  15. Eigen::MatrixXi IF,EE;
  16. Eigen::MatrixXd EV;
  17. Eigen::VectorXi EI;
  18. REQUIRE( !igl::fast_find_self_intersections(V,F,true,true,IF,EV,EE,EI) );
  19. REQUIRE(IF.rows()==0);
  20. REQUIRE(EV.rows()==0);
  21. REQUIRE(EE.rows()==0);
  22. REQUIRE(EI.size()==0);
  23. }
  24. TEST_CASE("fast_find_self_intersections: cube-triangle", "[igl]")
  25. {
  26. Eigen::MatrixXd V;
  27. Eigen::MatrixXi F;
  28. igl::read_triangle_mesh(test_common::data_path("cube.obj"), V, F);
  29. auto dims=(V.colwise().maxCoeff()-V.colwise().minCoeff())*2;
  30. auto cz=(V.col(2).minCoeff()+V.col(2).maxCoeff())/2;
  31. // add a triangle intersecting cube
  32. Eigen::MatrixXd Vp(3,3);
  33. Vp << V.col(0).minCoeff()-dims(0), V.col(1).minCoeff()-dims(1), cz,
  34. V.col(0).minCoeff()-dims(0), V.col(1).maxCoeff()+dims(1)*3, cz,
  35. V.col(0).maxCoeff()+dims(0)*3, V.col(1).maxCoeff()-dims(1), cz;
  36. Eigen::MatrixXi Fp(1,3);
  37. Fp << 0,1,2;
  38. Eigen::MatrixXd V_;
  39. Eigen::MatrixXi F_;
  40. igl::combine<Eigen::MatrixXd,Eigen::MatrixXi>({V,Vp},{F,Fp}, V_,F_);
  41. Eigen::MatrixXi IF,EE;
  42. Eigen::MatrixXd EV;
  43. Eigen::VectorXi EI;
  44. REQUIRE( igl::fast_find_self_intersections(V_,F_,false,false,IF,EV,EE,EI) );
  45. {
  46. Eigen::VectorXi I;
  47. igl::unique(IF,I);
  48. // should have 9 triangles that are intersecting each other
  49. REQUIRE( I.size()==9 );
  50. // plane that we added intersects other triangles
  51. REQUIRE((IF.col(1).array()==(F_.rows()-1)).all() );
  52. }
  53. // and 8 edges
  54. REQUIRE( EE.rows()==8 );
  55. REQUIRE( EV.rows()==2*8 );
  56. REQUIRE( EI.size()==8 );
  57. }
  58. TEST_CASE("fast_find_self_intersections: rose", "[igl]")
  59. {
  60. Eigen::MatrixXd V(10,3);
  61. Eigen::MatrixXi F(9,3);
  62. for(int i=0;i<9;i++)
  63. {
  64. const double theta_i = 4.0*igl::PI*double(i)/9.0;
  65. V.row(i) << std::cos(theta_i), std::sin(theta_i), 1;
  66. F.row(i)<<9,i,(i+1)%9;
  67. }
  68. V.row(9) << 0,0,0;
  69. Eigen::MatrixXi IF,EE;
  70. Eigen::MatrixXd EV;
  71. Eigen::VectorXi EI;
  72. REQUIRE( igl::fast_find_self_intersections(V,F,false,false,IF,EV,EE,EI) );
  73. Eigen::MatrixXi IF_gt(9,2);
  74. IF_gt<<
  75. 0,4,
  76. 0,5,
  77. 1,5,
  78. 1,6,
  79. 2,6,
  80. 2,7,
  81. 3,7,
  82. 3,8,
  83. 4,8;
  84. {
  85. Eigen::MatrixXi sIF;
  86. Eigen::VectorXi _;
  87. igl::sortrows(Eigen::MatrixXi(IF),true,sIF,_);
  88. test_common::assert_eq(IF_gt,sIF);
  89. }
  90. }
  91. TEST_CASE("fast_find_self_intersections: shared-edge", "[igl]")
  92. {
  93. Eigen::MatrixXd V(4,3);
  94. V<<
  95. 0,0,0,
  96. 1,0,0,
  97. 0,1,0,
  98. -1,0,0;
  99. Eigen::MatrixXi F(2,3);
  100. F <<
  101. 0,1,2,
  102. 0,2,3;
  103. Eigen::MatrixXi IF,EE;
  104. Eigen::MatrixXd EV;
  105. Eigen::VectorXi EI;
  106. REQUIRE(!igl::fast_find_self_intersections(V,F,false,false,IF,EV,EE,EI));
  107. V.row(3) << 2.0,0,0;
  108. REQUIRE( igl::fast_find_self_intersections(V,F,false,false,IF,EV,EE,EI));
  109. REQUIRE( IF.rows()==1 );
  110. REQUIRE( EE.rows()==0 );
  111. REQUIRE( EV.rows()==0 );
  112. REQUIRE( EI.rows()==0 );
  113. }