arcToCubicBezier function

List<Offset> arcToCubicBezier(
  1. Rect rect,
  2. double startAngle,
  3. double sweepAngle, {
  4. double limit = pi / 4,
  5. int? splitTimes,
})

recursively split an arc into multiple cubic Bezier

Implementation

List<Offset> arcToCubicBezier(Rect rect, double startAngle, double sweepAngle,
    {double limit = pi / 4, int? splitTimes}) {
  if (splitTimes != null) {
    limit = sweepAngle.abs() / pow(2, splitTimes);
  }
  if (sweepAngle.abs() > limit) {
    List<Offset> rst =
        arcToCubicBezier(rect, startAngle, sweepAngle / 2.0, limit: limit);
    rst
      ..addAll(arcToCubicBezier(
          rect, startAngle + sweepAngle / 2.0, sweepAngle / 2.0,
          limit: limit));
    return rst;
  }

  double alpha = sin(sweepAngle) *
      (sqrt(4.0 + 3.0 * tan(sweepAngle / 2.0) * tan(sweepAngle / 2.0)) - 1.0) /
      3.0;

  List<Offset> rst = [];
  Offset p1, p2, p3, p4;
  p1 = getPointOnArc(rect, startAngle);
  p4 = getPointOnArc(rect, startAngle + sweepAngle);
  p2 = p1 + getDerivativeOnArc(rect, startAngle) * alpha;
  p3 = p4 - getDerivativeOnArc(rect, startAngle + sweepAngle) * alpha;
  rst.add(p1);
  rst.add(p2);
  rst.add(p3);
  rst.add(p4);

  return rst;
}