From d7f7c94c4d44df89f6104dcda93eb330fc8534f3 Mon Sep 17 00:00:00 2001 From: Ray Date: Sun, 18 Dec 2022 18:00:14 +0100 Subject: [PATCH] REVIEWED: `Vector2Angle()` --- src/raymath.h | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/raymath.h b/src/raymath.h index d3130750c..ea3085a54 100644 --- a/src/raymath.h +++ b/src/raymath.h @@ -307,15 +307,23 @@ RMAPI float Vector2DistanceSqr(Vector2 v1, Vector2 v2) } // Calculate angle from two vectors -// Parameters need to be normalized +// NOTE: Parameters need to be normalized +// Current implementation should be aligned with glm::angle RMAPI float Vector2Angle(Vector2 v1, Vector2 v2) { - float dotProduct = v1.x*v2.x + v1.y*v2.y; // Dot product - - float t = dotProduct < -1 ? -1 : dotProduct; // Clamp - if (t > 1) t = 1; - - float result = acosf(t); + float result = 0.0f; + + float dot = v1.x*v2.x + v1.y*v2.y; // Dot product + + float dotClamp = (dot < -1.0f)? -1.0f : dot; // Clamp + if (dotClamp > 1.0f) dotClamp = 1.0f; + + result = acosf(dotClamp); + + // Alternative implementation, more costly + //float v1Length = sqrtf((v1.x*v1.x) + (v1.y*v1.y)); + //float v2Length = sqrtf((v2.x*v2.x) + (v2.y*v2.y)); + //float result = -acosf((v1.x*v2.x + v1.y*v2.y)/(v1Length*v2Length)); return result; }