calcAngles method

void calcAngles()

calculates the needed angles for the chart slices

Implementation

void calcAngles() {
  int entryCount = getData()?.getEntryCount() ?? 0;

  if (_drawAngles.length != entryCount) {
    _drawAngles = List.empty(growable: true);
  } else {
    for (int i = 0; i < entryCount; i++) {
      _drawAngles[i] = 0;
    }
  }
  if (_absoluteAngles.length != entryCount) {
    _absoluteAngles = List.empty(growable: true);
  } else {
    for (int i = 0; i < entryCount; i++) {
      _absoluteAngles[i] = 0;
    }
  }

  double yValueSum = (getData() as PieData).getYValueSum();

  List<IPieDataSet>? dataSets = getData()!.dataSets as List<IPieDataSet>?;

  bool hasMinAngle =
      _minAngleForSlices != 0 && entryCount * _minAngleForSlices <= _maxAngle;
  List<double> minAngles = List.empty(growable: true);

  int cnt = 0;
  double offset = 0;
  double diff = 0;

  for (int i = 0; i < getData()!.getDataSetCount(); i++) {
    IPieDataSet set = dataSets![i];

    for (int j = 0; j < set.getEntryCount(); j++) {
      double drawAngle =
          calcAngle2(set.getEntryForIndex(j)!.y.abs(), yValueSum);

      if (hasMinAngle) {
        double temp = drawAngle - _minAngleForSlices;
        if (temp <= 0) {
          minAngles[cnt] = _minAngleForSlices;
          offset += -temp;
        } else {
          minAngles[cnt] = drawAngle;
          diff += temp;
        }
      }
      _drawAngles.insert(cnt, drawAngle);
      // _drawAngles[cnt] = drawAngle;

      if (cnt == 0) {
        _absoluteAngles.insert(cnt, _drawAngles[cnt]);
        // _absoluteAngles[cnt] = _drawAngles[cnt];
      } else {
        _absoluteAngles.insert(
            cnt, _absoluteAngles[cnt - 1]! + _drawAngles[cnt]!);
        // _absoluteAngles[cnt] = _absoluteAngles[cnt - 1]! + _drawAngles[cnt]!;
      }

      cnt++;
    }
  }

  if (hasMinAngle) {
    // Correct bigger slices by relatively reducing their angles based on the total angle needed to subtract
    // This requires that `entryCount * _minAngleForSlices <= _maxAngle` be true to properly work!
    for (int i = 0; i < entryCount; i++) {
      minAngles[i] -= (minAngles[i] - _minAngleForSlices) / diff * offset;
      if (i == 0) {
        _absoluteAngles[0] = minAngles[0];
      } else {
        _absoluteAngles[i] = _absoluteAngles[i - 1]! + minAngles[i];
      }
    }

    _drawAngles = minAngles;
  }
}