Skip to content

Commit ce54d5e

Browse files
committed
Test all coeffs cases
1 parent 509fcac commit ce54d5e

File tree

1 file changed

+78
-30
lines changed

1 file changed

+78
-30
lines changed

tests/src/tests/candidates/test_coefficients.cpp

+78-30
Original file line numberDiff line numberDiff line change
@@ -7,47 +7,52 @@
77

88
using 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

5358
TEST_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

Comments
 (0)