computePies function

List<PieSliceData> computePies(
  1. List<DataPoint> pies,
  2. double offset,
  3. double padAngle,
  4. ThicknessData thickness,
  5. ILengthValue? radius,
  6. ChartTransform transform, {
  7. double eps = 0.0001,
})

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).
  • eps is the minimum radius, thickness, and angular span to include.

Implementation

List<PieSliceData> computePies(
  List<DataPoint> pies,
  double offset,
  double padAngle,
  ThicknessData thickness,
  ILengthValue? radius,
  ChartTransform transform, {
  double eps = 0.0001,
}) {
  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 <= eps || thicknessSize <= eps || pie.dy <= eps) {
      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;
}