computePieDataBounds function
Data-space bounds of pie centerlines and offsets.
Visual thickness, borders, corner radii, and markers are intentionally not included, matching the bounds behavior of line and bar charts.
Implementation
Rect computePieDataBounds(List<DataPoint> pies, double offset) {
Rect? bounds;
for (final pie in pies) {
if (pie.x <= 0.0001 || pie.dy <= 0.0001) continue;
final center = toCartesian(pie.pieOffset?.pieOffset ?? offset, pie);
final start = pie.y;
final end = pie.fy;
final angles = <double>[start, end];
if (end - start >= 2 * pi) {
angles.addAll(const [0.0, pi / 2, pi, 3 * pi / 2]);
} else {
final firstQuarter = (start / (pi / 2)).ceil();
final lastQuarter = (end / (pi / 2)).floor();
for (var quarter = firstQuarter; quarter <= lastQuarter; quarter++) {
angles.add(quarter * pi / 2);
}
}
for (final angle in angles) {
final point = center + Offset(pie.x * cos(angle), pie.x * sin(angle));
final pointBounds = Rect.fromLTWH(point.dx, point.dy, 0, 0);
bounds =
bounds == null ? pointBounds : bounds.expandToInclude(pointBounds);
}
}
return bounds ?? const Rect.fromLTRB(0, 0, 1, 1);
}