From 291cbaa140c5475ed2c5a3d4d8a342c0c9e8094e Mon Sep 17 00:00:00 2001 From: Losy001 <64610343+Losy001@users.noreply.github.com> Date: Wed, 22 May 2024 20:25:12 +0200 Subject: [PATCH] Add `CheckCollisionCircleLine` --- src/rshapes.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/rshapes.c b/src/rshapes.c index 80df64e2d..4f73e3b17 100644 --- a/src/rshapes.c +++ b/src/rshapes.c @@ -2266,6 +2266,27 @@ bool CheckCollisionCircleRec(Vector2 center, float radius, Rectangle rec) return collision; } +// Check collision between line and circle +bool CheckCollisionCircleLine(Vector2 center, float radius, Vector2 startPos, Vector2 endPos) +{ + float dx = endPos.x - startPos.x; + float dy = endPos.y - startPos.y; + + float fx = center.x - startPos.x; + float fy = center.y - startPos.y; + + float t = (fx * dx + fy * dy) / (dx * dx + dy * dy); + + if (t < 0.0f) t = 0.0f; + if (t > 1.0f) t = 1.0f; + + Vector2 closestPoint = { startPos.x + t * dx, startPos.y + t * dy }; + + float distanceSq = ((closestPoint.x - center.x)*(closestPoint.x - center.x) + (closestPoint.y - center.y)*(closestPoint.y - center.y)); + + return distanceSq <= (radius * radius); +} + // Check the collision between two lines defined by two points each, returns collision point by reference bool CheckCollisionLines(Vector2 startPos1, Vector2 endPos1, Vector2 startPos2, Vector2 endPos2, Vector2 *collisionPoint) {