From e199bb51284da7a576862253a48793e0919543cc Mon Sep 17 00:00:00 2001 From: GNSS-Stylist Date: Tue, 19 Nov 2024 20:01:34 +0200 Subject: [PATCH] ConvexHull unit tests: Add a test for tetrahedron Added this due to a tiny (0 bytes alloc) memory leak in convhull_3d, just to test if the generated hulls are ok (they are). See: https://github.com/leomccormack/convhull_3d/issues/20 https://github.com/leomccormack/convhull_3d/pull/21 Will commit a fix to the memory leak in a separate commit soon. --- UnitTests/tst_convexhull.cpp | 53 ++++++++++++++++++++++++++++++++++++ UnitTests/tst_convexhull.h | 1 + 2 files changed, 54 insertions(+) diff --git a/UnitTests/tst_convexhull.cpp b/UnitTests/tst_convexhull.cpp index 1e0b41c..83d711c 100644 --- a/UnitTests/tst_convexhull.cpp +++ b/UnitTests/tst_convexhull.cpp @@ -261,6 +261,59 @@ void TestConvexHull::cubeInTheOrigin() } } + +void TestConvexHull::tetrahedron() +{ + ConvexHull hull; + ConvexHull::Filter filter; + + Eigen::Vector3d vertices[4] = + { + { 0, 0, -1 }, + {-1, -1, 1 }, + {-1, 1, 1 }, + { 1, 0, 1 } + }; + + for (int i = 0; i < 4; i++) + { + hull.addPoint(vertices[i]); + } + + QVERIFY((hull.getFilter(filter))); + QVERIFY((filter.isValid())); + QCOMPARE(hull.getNumOfUniquePoints(), 4U); + + // Test some points that should definitely be inside the hull + + QVERIFY(filter.isInside(Eigen::Vector3d(0, 0, 0))); + QVERIFY(filter.isInside(Eigen::Vector3d(0, 0, -0.5))); + QVERIFY(filter.isInside(Eigen::Vector3d(0, 0, 0.5))); + + // Test some points that should definitely be outside the hull + + QVERIFY(!filter.isInside(Eigen::Vector3d(0, 0, -2))); + QVERIFY(!filter.isInside(Eigen::Vector3d(0, 0, -20))); + QVERIFY(!filter.isInside(Eigen::Vector3d(0, 0, 2))); + QVERIFY(!filter.isInside(Eigen::Vector3d(-2, 0, 0))); + QVERIFY(!filter.isInside(Eigen::Vector3d(2, 0, 0))); + QVERIFY(!filter.isInside(Eigen::Vector3d(0, 2, 0))); + QVERIFY(!filter.isInside(Eigen::Vector3d(0, -2, 0))); + + // Close to vertices themselves ("close calls"): + + QVERIFY(filter.isInside(0.999999 * vertices[0])); + QVERIFY(filter.isInside(0.999999 * vertices[1])); + QVERIFY(filter.isInside(0.999999 * vertices[2])); + QVERIFY(filter.isInside(0.999999 * vertices[3])); + + QVERIFY(!filter.isInside(1.000001 * vertices[0])); + QVERIFY(!filter.isInside(1.000001 * vertices[1])); + QVERIFY(!filter.isInside(1.000001 * vertices[2])); + QVERIFY(!filter.isInside(1.000001 * vertices[3])); +} + + void TestConvexHull::randomCubes() { const double lowLimit_Hull = -10; diff --git a/UnitTests/tst_convexhull.h b/UnitTests/tst_convexhull.h index baa92ee..87abf5e 100644 --- a/UnitTests/tst_convexhull.h +++ b/UnitTests/tst_convexhull.h @@ -39,6 +39,7 @@ private slots: void cleanupTestCase(); void uninitialized(); void pointCountCheck(); + void tetrahedron(); void cubeInTheOrigin(); void randomCubes(); void randomSpheres();