From 75961e68950c06cbc9e30838e38e5ed0c3f3a379 Mon Sep 17 00:00:00 2001 From: Fraser Waters Date: Sat, 21 Feb 2015 10:55:39 +0000 Subject: [PATCH] [Math] Fix NaN issue in CalculateAngle Clamp dot product between -1 and 1 so acos always has a valid input. --- Source/OpenTK/Math/Vector3.cs | 6 ++++-- Source/OpenTK/Math/Vector3d.cs | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Source/OpenTK/Math/Vector3.cs b/Source/OpenTK/Math/Vector3.cs index 8a096653..80459fa8 100644 --- a/Source/OpenTK/Math/Vector3.cs +++ b/Source/OpenTK/Math/Vector3.cs @@ -1205,7 +1205,9 @@ namespace OpenTK /// Note that the returned angle is never bigger than the constant Pi. public static float CalculateAngle(Vector3 first, Vector3 second) { - return (float)System.Math.Acos((Vector3.Dot(first, second)) / (first.Length * second.Length)); + float result; + CalculateAngle(ref first, ref second, out result); + return result; } /// Calculates the angle (in radians) between two vectors. @@ -1217,7 +1219,7 @@ namespace OpenTK { float temp; Vector3.Dot(ref first, ref second, out temp); - result = (float)System.Math.Acos(temp / (first.Length * second.Length)); + result = (float)System.Math.Acos(MathHelper.Clamp(temp / (first.Length * second.Length), -1.0, 1.0)); } #endregion diff --git a/Source/OpenTK/Math/Vector3d.cs b/Source/OpenTK/Math/Vector3d.cs index 0b281625..fa3dd95b 100644 --- a/Source/OpenTK/Math/Vector3d.cs +++ b/Source/OpenTK/Math/Vector3d.cs @@ -1203,7 +1203,9 @@ namespace OpenTK /// Note that the returned angle is never bigger than the constant Pi. public static double CalculateAngle(Vector3d first, Vector3d second) { - return System.Math.Acos((Vector3d.Dot(first, second)) / (first.Length * second.Length)); + double result; + CalculateAngle(ref first, ref second, out result); + return result; } /// Calculates the angle (in radians) between two vectors. @@ -1215,7 +1217,7 @@ namespace OpenTK { double temp; Vector3d.Dot(ref first, ref second, out temp); - result = System.Math.Acos(temp / (first.Length * second.Length)); + result = System.Math.Acos(MathHelper.Clamp(temp / (first.Length * second.Length), -1.0, 1.0)); } #endregion