summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorAndrea Fontana <[email protected]>2021-12-09 22:30:52 +0100
committerGitHub <[email protected]>2021-12-09 22:30:52 +0100
commitc0715c122517c0fffa97a8f99252302d1df4f0f8 (patch)
treef5f7c229cbf8f1716afa17f5f3e4118dbef58d36 /src
parentfd0e3a4fdd534a4afaa54fff3fb51622701948cc (diff)
downloadraylib-c0715c122517c0fffa97a8f99252302d1df4f0f8.tar.gz
raylib-c0715c122517c0fffa97a8f99252302d1df4f0f8.zip
Fixed functions Vector2Angle and Vector3Angle (#2203)
* Fixed functions Vector2Angle and Vector3Angle * typo * Unrolled everything.
Diffstat (limited to 'src')
-rw-r--r--src/raymath.h27
1 files 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;
}