diff --git a/include/rive/math/vec2d.hpp b/include/rive/math/vec2d.hpp
index 21dcdd4..f2e7ec3 100644
--- a/include/rive/math/vec2d.hpp
+++ b/include/rive/math/vec2d.hpp
@@ -46,6 +46,7 @@
         static Vec2D transformDir(const Vec2D& a, const Mat2D& m);
 
         static float dot(Vec2D a, Vec2D b) { return a.x * b.x + a.y * b.y; }
+        static float cross(Vec2D a, Vec2D b) { return a.x * b.y - a.y * b.x; }
         static Vec2D scaleAndAdd(Vec2D a, Vec2D b, float scale) {
             return {
                 a.x + b.x * scale,
diff --git a/src/shapes/path.cpp b/src/shapes/path.cpp
index f6090fd..af2b688 100644
--- a/src/shapes/path.cpp
+++ b/src/shapes/path.cpp
@@ -1,15 +1,26 @@
 #include "rive/shapes/path.hpp"
-#include "rive/math/circle_constant.hpp"
 #include "rive/renderer.hpp"
 #include "rive/shapes/cubic_vertex.hpp"
 #include "rive/shapes/cubic_detached_vertex.hpp"
 #include "rive/shapes/path_vertex.hpp"
 #include "rive/shapes/shape.hpp"
 #include "rive/shapes/straight_vertex.hpp"
+#include "rive/math/math_types.hpp"
 #include <cassert>
 
 using namespace rive;
 
+/// Compute an ideal control point distance to create a curve of the given
+/// radius.
+static float
+computeIdealControlPointDistance(const Vec2D& toPrev, const Vec2D& toNext, float radius) {
+    // Get the angle between next and prev
+    float angle = fabs(atan2(Vec2D::cross(toPrev, toNext), Vec2D::dot(toPrev, toNext)));
+
+    return (4.0f / 3.0f) * tan(math::PI / (2.0f * ((2.0f * math::PI) / angle))) * radius *
+           (angle < math::PI / 2 ? 1 + cos(angle) : 2.0f - sin(angle));
+}
+
 StatusCode Path::onAddedClean(CoreContext* context) {
     StatusCode code = Super::onAddedClean(context);
     if (code != StatusCode::Ok) {
@@ -89,13 +100,15 @@
                            pos;
             auto toNextLength = toNext.normalizeLength();
 
-            float renderRadius = std::min(toPrevLength, std::min(toNextLength, radius));
+            float renderRadius =
+                std::min(toPrevLength / 2.0f, std::min(toNextLength / 2.0f, radius));
+            float idealDistance = computeIdealControlPointDistance(toPrev, toNext, renderRadius);
 
             startIn = start = Vec2D::scaleAndAdd(pos, toPrev, renderRadius);
             commandPath.move(startIn);
 
-            Vec2D outPoint = Vec2D::scaleAndAdd(pos, toPrev, icircleConstant * renderRadius);
-            Vec2D inPoint = Vec2D::scaleAndAdd(pos, toNext, icircleConstant * renderRadius);
+            Vec2D outPoint = Vec2D::scaleAndAdd(pos, toPrev, renderRadius - idealDistance);
+            Vec2D inPoint = Vec2D::scaleAndAdd(pos, toNext, renderRadius - idealDistance);
             out = Vec2D::scaleAndAdd(pos, toNext, renderRadius);
             commandPath.cubic(outPoint, inPoint, out);
             prevIsCubic = false;
@@ -122,7 +135,10 @@
             Vec2D pos = point.renderTranslation();
             auto radius = point.radius();
             if (radius > 0.0f) {
-                Vec2D toPrev = out - pos;
+                auto prev = vertices[i - 1];
+                Vec2D toPrev = (prev->is<CubicVertex>() ? prev->as<CubicVertex>()->renderOut()
+                                                        : prev->renderTranslation()) -
+                               pos;
                 auto toPrevLength = toPrev.normalizeLength();
 
                 auto next = vertices[(i + 1) % length];
@@ -132,7 +148,10 @@
                                pos;
                 auto toNextLength = toNext.normalizeLength();
 
-                float renderRadius = std::min(toPrevLength, std::min(toNextLength, radius));
+                float renderRadius =
+                    std::min(toPrevLength / 2.0f, std::min(toNextLength / 2.0f, radius));
+                float idealDistance =
+                    computeIdealControlPointDistance(toPrev, toNext, renderRadius);
 
                 Vec2D translation = Vec2D::scaleAndAdd(pos, toPrev, renderRadius);
                 if (prevIsCubic) {
@@ -141,8 +160,8 @@
                     commandPath.line(translation);
                 }
 
-                Vec2D outPoint = Vec2D::scaleAndAdd(pos, toPrev, icircleConstant * renderRadius);
-                Vec2D inPoint = Vec2D::scaleAndAdd(pos, toNext, icircleConstant * renderRadius);
+                Vec2D outPoint = Vec2D::scaleAndAdd(pos, toPrev, renderRadius - idealDistance);
+                Vec2D inPoint = Vec2D::scaleAndAdd(pos, toNext, renderRadius - idealDistance);
                 out = Vec2D::scaleAndAdd(pos, toNext, renderRadius);
                 commandPath.cubic(outPoint, inPoint, out);
                 prevIsCubic = false;
@@ -260,11 +279,13 @@
                     Vec2D toNext = nextPoint - pos;
                     auto toNextLength = toNext.normalizeLength();
 
-                    auto renderRadius =
-                        std::min(toPrevLength, std::min(toNextLength, point.radius()));
+                    auto renderRadius = std::min(toPrevLength / 2.0f,
+                                                 std::min(toNextLength / 2.0f, point.radius()));
+                    float idealDistance =
+                        computeIdealControlPointDistance(toPrev, toNext, renderRadius);
                     Vec2D translation = Vec2D::scaleAndAdd(pos, toPrev, renderRadius);
 
-                    Vec2D out = Vec2D::scaleAndAdd(pos, toPrev, icircleConstant * renderRadius);
+                    Vec2D out = Vec2D::scaleAndAdd(pos, toPrev, renderRadius - idealDistance);
                     {
                         auto v1 = new DisplayCubicVertex(translation, out, translation);
                         flat->addVertex(v1, transform);
@@ -273,7 +294,7 @@
 
                     translation = Vec2D::scaleAndAdd(pos, toNext, renderRadius);
 
-                    Vec2D in = Vec2D::scaleAndAdd(pos, toNext, icircleConstant * renderRadius);
+                    Vec2D in = Vec2D::scaleAndAdd(pos, toNext, renderRadius - idealDistance);
                     auto v2 = new DisplayCubicVertex(in, translation, translation);
 
                     flat->addVertex(v2, transform);
@@ -330,4 +351,4 @@
     }
 }
 
-#endif
+#endif
\ No newline at end of file
