computePies function
List<PieSliceData>
computePies(
- List<
DataPoint> pies, - double offset,
- double padAngle,
- ThicknessData thickness,
- ILengthValue? 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,
ILengthValue? radius,
ChartTransform transform,
) {
List<PieSliceData> layouts = [];
for (var pie in pies) {
final borderRadius = pie.border?.borderRadius ?? radius;
final cornerRadius = borderRadius == null
? 0.0
: transform.antiScalar(transform.length(borderRadius));
final thicknessAlign = pie.thickness?.align ?? thickness.align;
final thicknessValue = pie.thickness?.size ?? thickness.size;
final thicknessSize =
transform.antiScalar(transform.length(thicknessValue));
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;
}