7
7
8
8
using namespace ipc ;
9
9
10
- TEST_CASE (" Face- Vertex collision stencil coeffs." , " [fv ][stencil][coeffs]" )
10
+ TEST_CASE (" Vertex-vertex collision stencil coeffs." , " [vv ][stencil][coeffs]" )
11
11
{
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 ;
14
14
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;
27
16
28
- Eigen::MatrixXi F (1 , 3 );
29
- F << 0 , 1 , 2 ;
17
+ VertexVertexCandidate vv (0 , 1 );
30
18
31
- Eigen::MatrixXi E;
32
- igl::edges (F, E);
19
+ VectorMax4d coeffs = vv.compute_coefficients (V, E, F);
33
20
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
+ }
35
26
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
+ }
40
31
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 ;
42
36
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);
44
50
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++) {
46
52
n += coeffs[i] * vertices[i];
47
53
}
48
- CAPTURE (n.transpose ());
49
54
50
- CHECK (n.squaredNorm () == Catch::Approx (fv .compute_distance (V, E, F)));
55
+ CHECK (n.squaredNorm () == Catch::Approx (ev .compute_distance (V, E, F)));
51
56
}
52
57
53
58
TEST_CASE (" Edge-edge collision stencil coeffs." , " [ee][stencil][coeffs]" )
@@ -85,4 +90,47 @@ TEST_CASE("Edge-edge collision stencil coeffs.", "[ee][stencil][coeffs]")
85
90
}
86
91
87
92
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