         return split(0.5)
     }
     if let mid = QuadBezierFitting(start, end, _q0, _q1) {
-        return limit > 0 && BezierOffsetCurvature(start, mid, end) ? split(0.5) : [[start, mid, end]]
+        if BezierOffsetCurvature(start, mid, end) {
+            if limit > 0 {
+                return split(0.5)
+            } else {
+                let m = Bezier(0.5, q0, q1 + q1, q2)
+                let _s = 1 / m.magnitude
+                let _mid = Bezier(0.5, p0, p1, p2, p3) + Point(x: a * m.y * _s, y: -a * m.x * _s)
+                return [[start, (_mid - 0.25 * (start + end)) / 0.5, end]]
+            }
+        }
+        return [[start, mid, end]]
     }
     
     return BezierOffset(p0, p3, a).map { [[$0, $1]] } ?? []


public func BezierOffset(_ p0: Point, _ p1: Point, _ p2: Point, _ a: Double) -> [[Point]] {
    
    return BezierOffset(p0, p1, p2, a, 5)
}
public func BezierOffset(_ p0: Point, _ p1: Point, _ p2: Point, _ p3: Point, _ a: Double) -> [[Point]] {
    
    return BezierOffset(p0, p1, p2, p3, a, 5, true)
}
private func BezierOffset(_ p0: Point, _ p1: Point, _ p2: Point, _ a: Double, _ limit: Int) -> [[Point]] {
    

    let end = Point(x: p2.x + a * q1.y * t, y: p2.y - a * q1.x * t)
    
    if let mid = QuadBezierFitting(start, end, q0, q1) {
        if BezierOffsetCurvature(start, mid, end) {
            if limit > 0 {
                return split(0.5)
            } else {
                let m = Bezier(0.5, q0, q1)
                let _s = 1 / m.magnitude
                let _mid = Bezier(0.5, p0, p1, p2) + Point(x: a * m.y * _s, y: -a * m.x * _s)
                return [[start, (_mid - 0.25 * (start + end)) / 0.5, end]]
            }
        }
        return [[start, mid, end]]
    }
    
    return BezierOffset(p0, p2, a).map { [[$0, $1]] } ?? []
