computePies function

List<PieSliceData> computePies(
  1. List<DataPoint> points,
  2. double dx,
  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> points,
  double dx,
  double padAngle,
  ThicknessData thickness,
  double radius,
  ChartTransform? transform
) {

  final cornerRadius = transform != null ? transform.scalar(radius) : radius;

  List<PieSliceData> layouts = [];

  for (var point in points) {

    final thicknessAlign = point.thickness?.align ?? thickness.align;
    double thicknessSize = point.thickness?.size ?? thickness.size;

    if (transform != null) {
      thicknessSize = transform.scalar(thicknessSize);
    }

    if (point.x <= 0.0001 || thicknessSize <= 0.0001 || point.dy <= 0.0001) continue;

    final halfInnerThickness = thicknessSize * (1 - thicknessAlign) / 2;
    final halfOuterThickness = thicknessSize * (1 + thicknessAlign) / 2;

    final innerRadius = max(0.0, point.x - halfInnerThickness);
    final outerRadius = point.x + halfOuterThickness;

    final pointDx = point.dx ?? dx;
    final spaceOffset = toCartesian(pointDx, point);

    layouts.add(PieSliceData(
      startAngle: point.y,
      endAngle: point.fy,
      innerRadius: innerRadius,
      outerRadius: outerRadius,
      offset: spaceOffset,
      point: point,
      cornerRadius: min(cornerRadius, (outerRadius - innerRadius)/2),
      padAngle: padAngle
    ));

  }

  return layouts;

}