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