Browse Source

Added DrawLineBezierCubic() (#2021)

Co-authored-by: SAOMDVN <[email protected]>
SAOMDVN 4 years ago
parent
commit
3fc4a4c974
2 changed files with 27 additions and 0 deletions
  1. 1 0
      src/raylib.h
  2. 26 0
      src/rshapes.c

+ 1 - 0
src/raylib.h

@@ -1148,6 +1148,7 @@ RLAPI void DrawLineV(Vector2 startPos, Vector2 endPos, Color color);
 RLAPI void DrawLineEx(Vector2 startPos, Vector2 endPos, float thick, Color color);                       // Draw a line defining thickness
 RLAPI void DrawLineBezier(Vector2 startPos, Vector2 endPos, float thick, Color color);                   // Draw a line using cubic-bezier curves in-out
 RLAPI void DrawLineBezierQuad(Vector2 startPos, Vector2 endPos, Vector2 controlPos, float thick, Color color); //Draw line using quadratic bezier curves with a control point
+RLAPI void DrawLineBezierCubic(Vector2 startPos, Vector2 endPos, Vector2 startControlPos, Vector2 endControlPos, float thick, Color color) //Draw line using cubic bezier curves with 2 control points
 RLAPI void DrawLineStrip(Vector2 *points, int pointCount, Color color);                                  // Draw lines sequence
 RLAPI void DrawCircle(int centerX, int centerY, float radius, Color color);                              // Draw a color-filled circle
 RLAPI void DrawCircleSector(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color);      // Draw a piece of a circle

+ 26 - 0
src/rshapes.c

@@ -189,6 +189,32 @@ void DrawLineBezierQuad(Vector2 startPos, Vector2 endPos, Vector2 controlPos, fl
     }
 }
 
+//Draw line using cubic bezier curves with 2 control points
+void DrawLineBezierCubic(Vector2 startPos, Vector2 endPos, Vector2 startControlPos, Vector2 endControlPos, float thick, Color color)
+{
+    const float step = 1.0f/BEZIER_LINE_DIVISIONS;
+
+    Vector2 previous = startPos;
+    Vector2 current = { 0 };
+    float t = 0.0f;
+
+    for (int i = 0; i <= BEZIER_LINE_DIVISIONS; i++)
+    {
+        t = step*i;
+        float a = powf(1 - t, 3);
+        float b = 3*powf(1 - t, 2)*t;
+        float c = 3*(1-t)*powf(t, 2);
+        float d = powf(t, 3);
+
+        current.y = a*startPos.y + b*startControlPos.y + c*endControlPos.y + d*endPos.y;
+        current.x = a*startPos.x + b*startControlPos.x + c*endControlPos.x + d*endPos.x;
+
+        DrawLineEx(previous, current, thick, color);
+
+        previous = current;
+    }
+}
+
 // Draw lines sequence
 void DrawLineStrip(Vector2 *points, int pointCount, Color color)
 {