arcToCubicBezier function
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;
}