computePies function
List<PieSliceData>
computePies(
- List<
DataPoint> pies, - double offset,
- double padAngle,
- ThicknessData thickness,
- double? radius,
- ChartTransform? transform,
Computes slice layout for pie chart.
- Each point (x, y) defines an arc: r = x, startAngle = y, endAngle = y + dy.
- innerRadius = x - thicknessAlignedLeft, outerRadius = x + thicknessAlignedRight based on thicknessAlign.
- space = uniform linear gap between slices, set as spaceOffset (aligned with arc midpoint angle).
Implementation
List<PieSliceData> computePies(
List<DataPoint> pies,
double offset,
double padAngle,
ThicknessData thickness,
double? radius,
ChartTransform? transform
) {
List<PieSliceData> layouts = [];
for (var pie in pies) {
final borderRadius = pie.border?.borderRadius ?? radius ?? 0.0;
final cornerRadius = transform != null ? transform.scalar(transform.antiScalar(borderRadius)) : borderRadius;
final thicknessAlign = pie.thickness?.align ?? thickness.align;
double thicknessSize = pie.thickness?.size ?? thickness.size;
if (transform != null) {
thicknessSize = transform.scalar(transform.antiScalar(thicknessSize));
}
if (pie.x <= 0.0001 || thicknessSize <= 0.0001 || pie.dy <= 0.0001) continue;
final halfInnerThickness = thicknessSize * (1 - thicknessAlign) / 2;
final halfOuterThickness = thicknessSize * (1 + thicknessAlign) / 2;
final innerRadius = max(0.0, pie.x - halfInnerThickness);
final outerRadius = pie.x + halfOuterThickness;
final pointDx = pie.pieOffset?.pieOffset ?? offset;
final spaceOffset = toCartesian(pointDx, pie);
layouts.add(PieSliceData(
startAngle: pie.y,
endAngle: pie.fy,
innerRadius: innerRadius,
outerRadius: outerRadius,
offset: spaceOffset,
point: pie,
cornerRadius: min(cornerRadius, (outerRadius - innerRadius)/2),
padAngle: padAngle
));
}
return layouts;
}