From c0715c122517c0fffa97a8f99252302d1df4f0f8 Mon Sep 17 00:00:00 2001 From: Andrea Fontana Date: Thu, 9 Dec 2021 22:30:52 +0100 Subject: [PATCH] Fixed functions Vector2Angle and Vector3Angle (#2203) * Fixed functions Vector2Angle and Vector3Angle * typo * Unrolled everything. --- src/raymath.h | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/src/raymath.h b/src/raymath.h index 401b16f4..352c29e5 100644 --- a/src/raymath.h +++ b/src/raymath.h @@ -99,7 +99,8 @@ // Types and Structures Definition //---------------------------------------------------------------------------------- #if !defined(RL_VECTOR2_TYPE) -// Vector2 type +// +type typedef struct Vector2 { float x; float y; @@ -278,13 +279,11 @@ RMAPI float Vector2Distance(Vector2 v1, Vector2 v2) return result; } -// Calculate angle from two vectors in X-axis +// Calculate angle from two vectors RMAPI float Vector2Angle(Vector2 v1, Vector2 v2) { float result = atan2f(v2.y, v2.x) - atan2f(v1.y, v1.x); - - if (result < 0) result += 2 * PI; - + return result; } @@ -532,18 +531,14 @@ RMAPI float Vector3Distance(Vector3 v1, Vector3 v2) return result; } -// Calculate angle between two vectors in XY and XZ -RMAPI Vector2 Vector3Angle(Vector3 v1, Vector3 v2) +// Calculate angle between two vectors +RMAPI float Vector3Angle(Vector3 v1, Vector3 v2) { - Vector2 result = { 0 }; - - float dx = v2.x - v1.x; - float dy = v2.y - v1.y; - float dz = v2.z - v1.z; - - result.x = atan2f(dx, dz); // Angle in XZ - result.y = atan2f(dy, sqrtf(dx*dx + dz*dz)); // Angle in XY - + Vector3 cross = { v1.y*v2.z - v1.z*v2.y, v1.z*v2.x - v1.x*v2.z, v1.x*v2.y - v1.y*v2.x }; + float len = sqrtf(cross.x*cross.x + cross.y*cross.y + cross.z*cross.z); + float dot = (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z); + float result = atan2f(len, dot); + return result; }