Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hotfix for Vector2LineAngle(), should probably be reviewed along with… #3394

Merged
merged 1 commit into from
Oct 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 36 additions & 20 deletions examples/others/raymath_vector_angle.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@
*
* raylib [shapes] example - Vector Angle
*
* Example originally created with raylib 1.0, last time updated with raylib 4.2
* Example originally created with raylib 1.0, last time updated with raylib 4.6
*
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
* BSD-like license that allows static linking with closed source software
*
* Copyright (c) 2023 Ramon Santamaria (@raysan5)
*
********************************************************************************************/

#include "raylib.h"

#include "raymath.h"
Expand All @@ -28,7 +28,7 @@ int main(void)
InitWindow(screenWidth, screenHeight, "raylib [math] example - vector angle");

Vector2 v0 = { screenWidth/2, screenHeight/2 };
Vector2 v1 = { 100.0f, 80.0f };
Vector2 v1 = Vector2Add(v0, (Vector2){ 100.0f, 80.0f });
Vector2 v2 = { 0 }; // Updated with mouse position

float angle = 0.0f; // Angle in degrees
Expand All @@ -42,21 +42,29 @@ int main(void)
{
// Update
//----------------------------------------------------------------------------------
float startangle;

if (angleMode == 0) startangle = -Vector2LineAngle(v0, v1)*RAD2DEG;
if (angleMode == 1) startangle = 0.0f;

v2 = GetMousePosition();

if (IsKeyPressed(KEY_SPACE)) angleMode = !angleMode;

if(angleMode == 0 && IsMouseButtonDown(MOUSE_BUTTON_RIGHT)) v1 = GetMousePosition();

if (angleMode == 0)
{
// Calculate angle between two vectors, considering a common origin (v0)
v1 = Vector2Add(v0, (Vector2){ 100.0f, 80.0f });
v2 = GetMousePosition();
angle = Vector2Angle(Vector2Normalize(Vector2Subtract(v1, v0)), Vector2Normalize(Vector2Subtract(v2, v0)))*RAD2DEG;
Vector2 v1Normal = Vector2Normalize(Vector2Subtract(v1, v0));
Vector2 v2Normal = Vector2Normalize(Vector2Subtract(v2, v0));

angle = Vector2Angle(v1Normal, v2Normal)*RAD2DEG;
}
else if (angleMode == 1)
{
// Calculate angle defined by a two vectors line, in reference to horizontal line
v1 = (Vector2){ screenWidth/2, screenHeight/2 };
v2 = GetMousePosition();
angle = Vector2LineAngle(v1, v2)*RAD2DEG;
angle = Vector2LineAngle(v0, v2)*RAD2DEG;
}
//----------------------------------------------------------------------------------

Expand All @@ -66,32 +74,40 @@ int main(void)

ClearBackground(RAYWHITE);

if (angleMode == 0) DrawText("v0", v0.x, v0.y, 10, DARKGRAY);
DrawText("v1", v1.x, v1.y, 10, DARKGRAY);
DrawText("v2", v2.x, v2.y, 10, DARKGRAY);

if (angleMode == 0)
{
DrawText("MODE: Angle between V1 and V2", 10, 10, 20, BLACK);
DrawText("MODE 0: Angle between V1 and V2", 10, 10, 20, BLACK);
DrawText("Right Click to Move V2", 10, 30, 20, DARKGRAY);

DrawLineEx(v0, v1, 2.0f, BLACK);
DrawLineEx(v0, v2, 2.0f, RED);

float startangle = 90 - Vector2LineAngle(v0, v1)*RAD2DEG;
DrawCircleSector(v0, 40.0f, startangle, startangle + angle - 360.0f*(angle > 180.0f), 32, Fade(GREEN, 0.6f));
DrawCircleSector(v0, 40.0f, startangle, startangle - angle, 32, Fade(GREEN, 0.6f));
}
else if (angleMode == 1)
{
DrawText("MODE: Angle formed by line V1 to V2", 10, 10, 20, BLACK);
DrawText("MODE 1: Angle formed by line V1 to V2", 10, 10, 20, BLACK);

DrawLine(0, screenHeight/2, screenWidth, screenHeight/2, LIGHTGRAY);
DrawLineEx(v1, v2, 2.0f, RED);
DrawLineEx(v0, v2, 2.0f, RED);

DrawCircleSector(v1, 40.0f, 90.0f, 180 - angle - 90, 32, Fade(GREEN, 0.6f));
DrawCircleSector(v0, 40.0f, startangle, startangle - angle, 32, Fade(GREEN, 0.6f));
}

DrawText("v0", v0.x, v0.y, 10, DARKGRAY);

// If the line from v0 to v1 would overlap the text, move it's position up 10
if (angleMode == 0 && Vector2Subtract(v0, v1).y > 0.0f) DrawText("v1", v1.x, v1.y-10.0f, 10, DARKGRAY);
if (angleMode == 0 && Vector2Subtract(v0, v1).y < 0.0f) DrawText("v1", v1.x, v1.y, 10, DARKGRAY);

// If angle mode 1, use v1 to emphasize the horizontal line
if (angleMode == 1) DrawText("v1", v0.x + 40.0f, v0.y, 10, DARKGRAY);

// position adjusted by -10 so it isn't hidden by cursor
DrawText("v2", v2.x-10.0f, v2.y-10.0f, 10, DARKGRAY);

DrawText("Press SPACE to change MODE", 460, 10, 20, DARKGRAY);
DrawText(TextFormat("ANGLE: %2.2f", angle), 10, 40, 20, LIME);
DrawText(TextFormat("ANGLE: %2.2f", angle), 10, 70, 20, LIME);

EndDrawing();
//----------------------------------------------------------------------------------
Expand Down
5 changes: 4 additions & 1 deletion src/raymath.h
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,8 @@ RMAPI float Vector2Angle(Vector2 v1, Vector2 v2)

float dot = v1.x*v2.x + v1.y*v2.y;
float det = v1.x*v2.y - v1.y*v2.x;

// TODO(10/9/2023): Currently angles move clockwise, determine if this is wanted behavior
result = -atan2f(det, dot);

return result;
Expand All @@ -335,7 +337,8 @@ RMAPI float Vector2LineAngle(Vector2 start, Vector2 end)
{
float result = 0.0f;

result = atan2f(end.y - start.y, end.x - start.x);
// TODO(10/9/2023): Currently angles move clockwise, determine if this is wanted behavior
result = -atan2f(end.y - start.y, end.x - start.x);

return result;
}
Expand Down