You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

130 lines
3.1 KiB

#include "test_common.h"
#include <igl/fast_find_self_intersections.h>
#include <igl/combine.h>
#include <igl/sortrows.h>
#include <igl/unique.h>
#include <igl/matlab_format.h>
#include <igl/PI.h>
#include <iostream>
#include <iomanip>
TEST_CASE("fast_find_self_intersections: cube", "[igl]")
{
Eigen::MatrixXd V;
Eigen::MatrixXi F;
igl::read_triangle_mesh(test_common::data_path("cube.obj"), V, F);
Eigen::MatrixXi IF,EE;
Eigen::MatrixXd EV;
Eigen::VectorXi EI;
REQUIRE( !igl::fast_find_self_intersections(V,F,true,true,IF,EV,EE,EI) );
REQUIRE(IF.rows()==0);
REQUIRE(EV.rows()==0);
REQUIRE(EE.rows()==0);
REQUIRE(EI.size()==0);
}
TEST_CASE("fast_find_self_intersections: cube-triangle", "[igl]")
{
Eigen::MatrixXd V;
Eigen::MatrixXi F;
igl::read_triangle_mesh(test_common::data_path("cube.obj"), V, F);
auto dims=(V.colwise().maxCoeff()-V.colwise().minCoeff())*2;
auto cz=(V.col(2).minCoeff()+V.col(2).maxCoeff())/2;
// add a triangle intersecting cube
Eigen::MatrixXd Vp(3,3);
Vp << V.col(0).minCoeff()-dims(0), V.col(1).minCoeff()-dims(1), cz,
V.col(0).minCoeff()-dims(0), V.col(1).maxCoeff()+dims(1)*3, cz,
V.col(0).maxCoeff()+dims(0)*3, V.col(1).maxCoeff()-dims(1), cz;
Eigen::MatrixXi Fp(1,3);
Fp << 0,1,2;
Eigen::MatrixXd V_;
Eigen::MatrixXi F_;
igl::combine<Eigen::MatrixXd,Eigen::MatrixXi>({V,Vp},{F,Fp}, V_,F_);
Eigen::MatrixXi IF,EE;
Eigen::MatrixXd EV;
Eigen::VectorXi EI;
REQUIRE( igl::fast_find_self_intersections(V_,F_,false,false,IF,EV,EE,EI) );
{
Eigen::VectorXi I;
igl::unique(IF,I);
// should have 9 triangles that are intersecting each other
REQUIRE( I.size()==9 );
// plane that we added intersects other triangles
REQUIRE((IF.col(1).array()==(F_.rows()-1)).all() );
}
// and 8 edges
REQUIRE( EE.rows()==8 );
REQUIRE( EV.rows()==2*8 );
REQUIRE( EI.size()==8 );
}
TEST_CASE("fast_find_self_intersections: rose", "[igl]")
{
Eigen::MatrixXd V(10,3);
Eigen::MatrixXi F(9,3);
for(int i=0;i<9;i++)
{
const double theta_i = 4.0*igl::PI*double(i)/9.0;
V.row(i) << std::cos(theta_i), std::sin(theta_i), 1;
F.row(i)<<9,i,(i+1)%9;
}
V.row(9) << 0,0,0;
Eigen::MatrixXi IF,EE;
Eigen::MatrixXd EV;
Eigen::VectorXi EI;
REQUIRE( igl::fast_find_self_intersections(V,F,false,false,IF,EV,EE,EI) );
Eigen::MatrixXi IF_gt(9,2);
IF_gt<<
0,4,
0,5,
1,5,
1,6,
2,6,
2,7,
3,7,
3,8,
4,8;
{
Eigen::MatrixXi sIF;
Eigen::VectorXi _;
igl::sortrows(Eigen::MatrixXi(IF),true,sIF,_);
test_common::assert_eq(IF_gt,sIF);
}
}
TEST_CASE("fast_find_self_intersections: shared-edge", "[igl]")
{
Eigen::MatrixXd V(4,3);
V<<
0,0,0,
1,0,0,
0,1,0,
-1,0,0;
Eigen::MatrixXi F(2,3);
F <<
0,1,2,
0,2,3;
Eigen::MatrixXi IF,EE;
Eigen::MatrixXd EV;
Eigen::VectorXi EI;
REQUIRE(!igl::fast_find_self_intersections(V,F,false,false,IF,EV,EE,EI));
V.row(3) << 2.0,0,0;
REQUIRE( igl::fast_find_self_intersections(V,F,false,false,IF,EV,EE,EI));
REQUIRE( IF.rows()==1 );
REQUIRE( EE.rows()==0 );
REQUIRE( EV.rows()==0 );
REQUIRE( EI.rows()==0 );
}