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;
}
}