computePies function

List<PieSliceData> computePies(
  1. List<DataPoint> pies,
  2. double offset,
  3. double padAngle,
  4. ThicknessData thickness,
  5. double? radius,
  6. 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;

}