generate method
Generates pie arcs from the given data.
Implementation
List<PieArc<T>> generate(List<T> data) {
if (data.isEmpty) return [];
// Sort data if needed
final sortedData = List<T>.from(data);
if (sort != null) {
sortedData.sort(sort);
} else if (sortByValueDescending) {
sortedData.sort((a, b) => value(b).compareTo(value(a)));
}
// Calculate total value
double total = 0;
for (final item in sortedData) {
final v = value(item);
if (v > 0) total += v;
}
if (total <= 0) return [];
// Calculate angles
final angleRange = endAngle - startAngle;
final totalPadding = padAngle * sortedData.length;
final availableAngle = angleRange - totalPadding;
final arcs = <PieArc<T>>[];
double currentAngle = startAngle;
for (int i = 0; i < sortedData.length; i++) {
final item = sortedData[i];
final v = value(item);
if (v <= 0) continue;
final arcAngle = (v / total) * availableAngle;
final arcStartAngle = currentAngle;
final arcEndAngle = currentAngle + arcAngle;
arcs.add(PieArc<T>(
data: item,
value: v,
index: i,
startAngle: arcStartAngle,
endAngle: arcEndAngle,
padAngle: padAngle,
));
currentAngle = arcEndAngle + padAngle;
}
return arcs;
}