77
88using namespace ipc ;
99
10- TEST_CASE (" Face- Vertex collision stencil coeffs." , " [fv ][stencil][coeffs]" )
10+ TEST_CASE (" Vertex-vertex collision stencil coeffs." , " [vv ][stencil][coeffs]" )
1111{
12- Eigen::MatrixXd V (4 , 3 );
13- V << 0 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 1 ;
12+ Eigen::MatrixXd V (2 , 3 );
13+ V << - 1 , 0 , 0 , /* */ 1 , 0 , 0 ;
1414
15- SECTION (" default" ) { }
16- SECTION (" random" ) { V.row (3 ).setRandom (); }
17- SECTION (" off triangle 0" ) { V.row (3 ) << 2 , 0.5 , 1 ; }
18- SECTION (" off triangle 1" ) { V.row (3 ) << 2 , 2 , 1 ; }
19- SECTION (" off triangle 2" ) { V.row (3 ) << 0.5 , 2 , 1 ; }
20- SECTION (" off triangle 3" ) { V.row (3 ) << -1 , 2 , 1 ; }
21- SECTION (" off triangle 4" ) { V.row (3 ) << -1 , 0.5 , 1 ; }
22- SECTION (" off triangle 5" ) { V.row (3 ) << -1 , -1 , 1 ; }
23- SECTION (" off triangle 6" ) { V.row (3 ) << 0.5 , -1 , 1 ; }
24- SECTION (" off triangle 7" ) { V.row (3 ) << 2 , -0.5 , 1 ; }
25- SECTION (" failure case 1" ) { V.row (3 ) << 0.680375 , -0.211234 , 0.566198 ; }
26- SECTION (" failure case 1" ) { V.row (3 ) << -0.997497 , 0.127171 , -0.613392 ; }
15+ Eigen::MatrixXi E, F;
2716
28- Eigen::MatrixXi F (1 , 3 );
29- F << 0 , 1 , 2 ;
17+ VertexVertexCandidate vv (0 , 1 );
3018
31- Eigen::MatrixXi E;
32- igl::edges (F, E);
19+ VectorMax4d coeffs = vv.compute_coefficients (V, E, F);
3320
34- FaceVertexCandidate fv (0 , 3 );
21+ std::array<VectorMax3d, 4 > vertices = vv.vertices (V, E, F);
22+ Eigen::Vector3d n = Eigen::Vector3d::Zero ();
23+ for (int i = 0 ; i < vv.num_vertices (); i++) {
24+ n += coeffs[i] * vertices[i];
25+ }
3526
36- VectorMax4d coeffs = fv. compute_coefficients (V, E, F);
37- CAPTURE (
38- point_triangle_distance_type (V. row ( 3 ), V. row ( 0 ), V. row ( 1 ), V. row ( 2 )) );
39- CAPTURE (V. row ( 3 ), coeffs. transpose ());
27+ CHECK (n. squaredNorm () == Catch::Approx (vv. compute_distance (V, E, F)) );
28+ CHECK (coeffs[ 0 ] == 1 );
29+ CHECK (coeffs[ 1 ] == - 1 );
30+ }
4031
41- CHECK (-coeffs[1 ] == Catch::Approx (1 + coeffs[2 ] + coeffs[3 ]));
32+ TEST_CASE (" Edge-vertex collision stencil coeffs." , " [ev][stencil][coeffs]" )
33+ {
34+ Eigen::MatrixXd V (3 , 3 );
35+ V << -1 , 0 , 0 , /* */ 1 , 0 , 0 , /* */ 0 , 1 , 0 ;
4236
43- std::array<VectorMax3d, 4 > vertices = fv.vertices (V, E, F);
37+ SECTION (" default" ) { }
38+ SECTION (" random" ) { V.row (2 ).setRandom (); }
39+ SECTION (" e0" ) { V (0 , 2 ) = -2 ; }
40+ SECTION (" e1" ) { V (0 , 2 ) = 2 ; }
41+
42+ Eigen::MatrixXi E (1 , 2 ), F;
43+ E << 0 , 1 ;
44+
45+ EdgeVertexCandidate ev (0 , 2 );
46+
47+ VectorMax4d coeffs = ev.compute_coefficients (V, E, F);
48+
49+ std::array<VectorMax3d, 4 > vertices = ev.vertices (V, E, F);
4450 Eigen::Vector3d n = Eigen::Vector3d::Zero ();
45- for (int i = 0 ; i < fv .num_vertices (); i++) {
51+ for (int i = 0 ; i < ev .num_vertices (); i++) {
4652 n += coeffs[i] * vertices[i];
4753 }
48- CAPTURE (n.transpose ());
4954
50- CHECK (n.squaredNorm () == Catch::Approx (fv .compute_distance (V, E, F)));
55+ CHECK (n.squaredNorm () == Catch::Approx (ev .compute_distance (V, E, F)));
5156}
5257
5358TEST_CASE (" Edge-edge collision stencil coeffs." , " [ee][stencil][coeffs]" )
@@ -85,4 +90,47 @@ TEST_CASE("Edge-edge collision stencil coeffs.", "[ee][stencil][coeffs]")
8590 }
8691
8792 CHECK (n.squaredNorm () == Catch::Approx (ee.compute_distance (V, E, F)));
88- }
93+ }
94+
95+ TEST_CASE (" Face-Vertex collision stencil coeffs." , " [fv][stencil][coeffs]" )
96+ {
97+ Eigen::MatrixXd V (4 , 3 );
98+ V << 0 , 0 , 0 , /* */ 1 , 0 , 0 , /* */ 0 , 1 , 0 , /* */ 0.333 , 0.333 , 1 ;
99+
100+ SECTION (" default" ) { }
101+ SECTION (" random" ) { V.row (3 ).setRandom (); }
102+ SECTION (" off triangle 0" ) { V.row (3 ) << 2 , 0.5 , 1 ; }
103+ SECTION (" off triangle 1" ) { V.row (3 ) << 2 , 2 , 1 ; }
104+ SECTION (" off triangle 2" ) { V.row (3 ) << 0.5 , 2 , 1 ; }
105+ SECTION (" off triangle 3" ) { V.row (3 ) << -1 , 2 , 1 ; }
106+ SECTION (" off triangle 4" ) { V.row (3 ) << -1 , 0.5 , 1 ; }
107+ SECTION (" off triangle 5" ) { V.row (3 ) << -1 , -1 , 1 ; }
108+ SECTION (" off triangle 6" ) { V.row (3 ) << 0.5 , -1 , 1 ; }
109+ SECTION (" off triangle 7" ) { V.row (3 ) << 2 , -0.5 , 1 ; }
110+ SECTION (" failure case 1" ) { V.row (3 ) << 0.680375 , -0.211234 , 0.566198 ; }
111+ SECTION (" failure case 1" ) { V.row (3 ) << -0.997497 , 0.127171 , -0.613392 ; }
112+
113+ Eigen::MatrixXi F (1 , 3 );
114+ F << 0 , 1 , 2 ;
115+
116+ Eigen::MatrixXi E;
117+ igl::edges (F, E);
118+
119+ FaceVertexCandidate fv (0 , 3 );
120+
121+ VectorMax4d coeffs = fv.compute_coefficients (V, E, F);
122+ CAPTURE (
123+ point_triangle_distance_type (V.row (3 ), V.row (0 ), V.row (1 ), V.row (2 )));
124+ CAPTURE (V.row (3 ), coeffs.transpose ());
125+
126+ CHECK (-coeffs[1 ] == Catch::Approx (1 + coeffs[2 ] + coeffs[3 ]));
127+
128+ std::array<VectorMax3d, 4 > vertices = fv.vertices (V, E, F);
129+ Eigen::Vector3d n = Eigen::Vector3d::Zero ();
130+ for (int i = 0 ; i < fv.num_vertices (); i++) {
131+ n += coeffs[i] * vertices[i];
132+ }
133+ CAPTURE (n.transpose ());
134+
135+ CHECK (n.squaredNorm () == Catch::Approx (fv.compute_distance (V, E, F)));
136+ }
0 commit comments