find_intersections.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include "test_common.h"
  2. #include <igl/predicates/find_intersections.h>
  3. #include <igl/combine.h>
  4. #include <igl/triangle_triangle_intersect.h>
  5. #include <igl/unique.h>
  6. #include <igl/sortrows.h>
  7. #include <igl/matlab_format.h>
  8. #include <iostream>
  9. TEST_CASE("find_intersections: cube-triangle", "[igl/predicates]")
  10. {
  11. Eigen::MatrixXd V;
  12. Eigen::MatrixXi F;
  13. igl::read_triangle_mesh(test_common::data_path("cube.obj"), V, F);
  14. auto dims=(V.colwise().maxCoeff()-V.colwise().minCoeff())*2;
  15. auto cz=(V.col(2).minCoeff()+V.col(2).maxCoeff())/2;
  16. // add a triangle intersecting cube
  17. Eigen::MatrixXd Vp(3,3);
  18. Vp << V.col(0).minCoeff()-dims(0), V.col(1).minCoeff()-dims(1), cz,
  19. V.col(0).minCoeff()-dims(0), V.col(1).maxCoeff()+dims(1)*3, cz,
  20. V.col(0).maxCoeff()+dims(0)*3, V.col(1).maxCoeff()-dims(1), cz;
  21. Eigen::MatrixXi Fp(1,3);
  22. Fp << 0,1,2;
  23. Eigen::MatrixXi IF;
  24. Eigen::Array<bool,Eigen::Dynamic,1> CP;
  25. igl::predicates::find_intersections(V,F,Vp,Fp,false,IF,CP);
  26. {
  27. Eigen::VectorXi I;
  28. igl::unique(IF,I);
  29. // should have 8 triangles that are intersecting plane (so 9 unique)
  30. REQUIRE( I.size()== 9 );
  31. }
  32. // all triangles from the cube intersect the same plane
  33. REQUIRE( (IF.col(1).array()==0).all() );
  34. }
  35. TEST_CASE("find_intersections: extract", "[igl/predicates]")
  36. {
  37. Eigen::MatrixXd V1(4,3);
  38. V1 << 0,0,0,
  39. 1,0,0,
  40. 1,1,0,
  41. 0,1,0;
  42. Eigen::MatrixXi F1(2,3);
  43. F1 << 0,1,2,
  44. 0,2,3;
  45. Eigen::MatrixXd V2(3,3);
  46. V2 << 1,0,1,
  47. 0,1,1,
  48. 0.5,0.5,-1;
  49. Eigen::MatrixXi F2(1,3);
  50. F2 << 0,1,2;
  51. Eigen::MatrixXi IF,EE; Eigen::MatrixXd EV;
  52. Eigen::Array<bool,Eigen::Dynamic,1> CP;
  53. bool found = igl::predicates::find_intersections(V1,F1,V2,F2,false,IF,CP);
  54. REQUIRE( (CP==false).all() );
  55. REQUIRE( found );
  56. REQUIRE( IF.rows() == 2);
  57. Eigen::MatrixXi IF_gt(2,2);
  58. IF_gt <<
  59. 0,0,
  60. 1,0;
  61. test_common::assert_near_rows(IF,IF_gt,0);
  62. igl::triangle_triangle_intersect(V1,F1,V2,F2,IF,EV,EE);
  63. Eigen::MatrixXd EV_gt(3,3);
  64. EV_gt<<
  65. 0.5 ,0.5,0,
  66. 0.25,0.75,0,
  67. 0.75,0.25,0;
  68. test_common::assert_near_rows(EV,EV_gt,0);
  69. REQUIRE( EE.rows() == 2);
  70. }