From c846e3da3ff852f719c9eede3e61cf4e13df56c3 Mon Sep 17 00:00:00 2001 From: Christian Godenschwager <christian.godenschwager@fau.de> Date: Wed, 31 Jan 2018 13:25:06 +0100 Subject: [PATCH] Fixes PlaneTest in single precision - Avoid that defining points are aligned on a Plane - Improve numerical stability of cross product --- tests/core/math/PlaneTest.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/tests/core/math/PlaneTest.cpp b/tests/core/math/PlaneTest.cpp index b8f2d49b7..73e7d56c7 100644 --- a/tests/core/math/PlaneTest.cpp +++ b/tests/core/math/PlaneTest.cpp @@ -135,20 +135,22 @@ int main(int argc, char * argv[]) Vec3Real p1 = rpg(); Vec3Real p2 = rpg(); - if( (p0 - p1).sqrLength() < 1e-6 || (p0 - p2).sqrLength() < 1e-6 || (p2 - p1).sqrLength() < 1e-6 ) + real_t angle = std::acos( (p1-p0) * (p2-p0) / std::sqrt( (p1-p0).sqrLength() * (p2-p0).sqrLength() ) ); + + if( (p0 - p1).sqrLength() < 1e-6 || (p0 - p2).sqrLength() < 1e-6 || (p2 - p1).sqrLength() < 1e-6 || angle < math::PI / real_t(180) ) { --i; continue; } - Plane plane( p0, (p0 - p1) % (p0 - p2) ); + Plane plane( p0, (p0 - p1).getNormalized() % (p0 - p2).getNormalized() ); - WALBERLA_CHECK ( realIsEqual( plane.signedDistance( p0 ), real_t(0) ) ); - WALBERLA_CHECK ( realIsEqual( plane.distance ( p0 ), real_t(0) ) ); - WALBERLA_CHECK ( realIsEqual( plane.signedDistance( p1 ), real_t(0) ) ); - WALBERLA_CHECK ( realIsEqual( plane.distance ( p1 ), real_t(0) ) ); - WALBERLA_CHECK ( realIsEqual( plane.signedDistance( p2 ), real_t(0) ) ); - WALBERLA_CHECK ( realIsEqual( plane.distance ( p2 ), real_t(0) ) ); + WALBERLA_CHECK_FLOAT_EQUAL( plane.signedDistance( p0 ), real_t(0) ); + WALBERLA_CHECK_FLOAT_EQUAL( plane.distance ( p0 ), real_t(0) ); + WALBERLA_CHECK_FLOAT_EQUAL( plane.signedDistance( p1 ), real_t(0) ); + WALBERLA_CHECK_FLOAT_EQUAL( plane.distance ( p1 ), real_t(0) ); + WALBERLA_CHECK_FLOAT_EQUAL( plane.signedDistance( p2 ), real_t(0) ); + WALBERLA_CHECK_FLOAT_EQUAL( plane.distance ( p2 ), real_t(0) ); WALBERLA_CHECK_GREATER_EQUAL( plane.distance( p0 ), real_t(0) ); WALBERLA_CHECK_GREATER_EQUAL( plane.distance( p1 ), real_t(0) ); WALBERLA_CHECK_GREATER_EQUAL( plane.distance( p2 ), real_t(0) ); -- GitLab