From ddf3bc9d2aca338c64e2aa679d23b402e994bd3a Mon Sep 17 00:00:00 2001 From: Amy Wilder Date: Sun, 3 Aug 2025 12:46:41 -0400 Subject: [PATCH] Add inverse point functions --- src/raylib.h | 4 ++++ src/rshapes.c | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/raylib.h b/src/raylib.h index 8473fd5fe..d588084cb 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -1310,6 +1310,10 @@ RLAPI Vector2 GetSplinePointCatmullRom(Vector2 p1, Vector2 p2, Vector2 p3, Vecto RLAPI Vector2 GetSplinePointBezierQuad(Vector2 p1, Vector2 c2, Vector2 p3, float t); // Get (evaluate) spline point: Quadratic Bezier RLAPI Vector2 GetSplinePointBezierCubic(Vector2 p1, Vector2 c2, Vector2 c3, Vector2 p4, float t); // Get (evaluate) spline point: Cubic Bezier +// Spline inverse point functions, for evenly-spaced points on the curve +RLAPI void GetSplineControlBezierQuad(Vector2 startPos, Vector2 midPos, Vector2 endPos, Vector2 *controlPos); // Get (evaluate) spline control point: Quadratic Bezier +RLAPI void GetSplineControlBezierCubic(Vector2 startPos, Vector2 oneThirdsPos, Vector2 twoThirdsPos, Vector2 endPos, Vector2 *startControlPos, Vector2 *endControlPos); // Get (evaluate) spline control points: Cubic Bezier + // Spline segment slope evaluation functions, for a given t [0.0f .. 1.0f] RLAPI Vector2 GetSplineVelocityLinear(Vector2 startPos, Vector2 endPos); // Get (evaluate) spline velocity: Linear RLAPI Vector2 GetSplineVelocityBezierQuad(Vector2 startPos, Vector2 controlPos, Vector2 endPos, float t); // Get (evaluate) spline velocity: Quadratic Bezier diff --git a/src/rshapes.c b/src/rshapes.c index 8674917df..976a2c69a 100644 --- a/src/rshapes.c +++ b/src/rshapes.c @@ -2358,6 +2358,14 @@ Vector2 GetSplinePointBezierQuad(Vector2 startPos, Vector2 controlPos, Vector2 e return point; } +// Get spline control point given evenly-spaced points on that curve, Quadratic Bezier +// NOTE: Assumes startPos has 0 entry velocity and endPos has 0 exit velocity +void GetSplineControlBezierQuad(Vector2 startPos, Vector2 midPos, Vector2 endPos, Vector2 *controlPos) +{ + controlPos->y = 2.0f*midPos.y - 0.5f*(startPos.y + endPos.y); + controlPos->x = 2.0f*midPos.x - 0.5f*(startPos.x + endPos.x); +} + // Get spline point for a given t [0.0f .. 1.0f], Cubic Bezier Vector2 GetSplinePointBezierCubic(Vector2 startPos, Vector2 startControlPos, Vector2 endControlPos, Vector2 endPos, float t) { @@ -2374,6 +2382,22 @@ Vector2 GetSplinePointBezierCubic(Vector2 startPos, Vector2 startControlPos, Vec return point; } +// Get spline control points given evenly-spaced points on that curve, Cubic Bezier +// NOTE: Assumes startPos has 0 entry velocity and endPos has 0 exit velocity +void GetSplineControlBezierCubic(Vector2 startPos, Vector2 oneThirdsPos, Vector2 twoThirdsPos, Vector2 endPos, Vector2 *startControlPos, Vector2 *endControlPos) +{ + const float a = -5.0f/6.0f; + const float b = 3.0f; + const float c = -3.0f/2.0f; + const float d = 1.0f/3.0f; + + startControlPos->x = a*startPos.x + b*oneThirdsPos.x + c*twoThirdsPos.x + d*endPos.x; + startControlPos->y = a*startPos.y + b*oneThirdsPos.y + c*twoThirdsPos.y + d*endPos.y; + + endControlPos->x = a*endPos.x + b*twoThirdsPos.x + c*oneThirdsPos.x + d*startPos.x; + endControlPos->y = a*endPos.y + b*twoThirdsPos.y + c*oneThirdsPos.y + d*startPos.y; +} + // Get spline direction and speed, Linear Bezier // // Normalize to get the "forward" direction of the curve