protected virtual void InitializePieSlices()
{
// calculates the sum of values required to evaluate sweep angles
// for individual pies
double sum = 0;
foreach (decimal itemValue in m_values)
sum += (double)itemValue;
// some values and indices that will be used in the loop
SizeF topEllipeSize = TopEllipseSize;
SizeF largestDisplacementEllipseSize = LargestDisplacementEllipseSize;
int maxDisplacementIndex = m_sliceRelativeDisplacements.Length - 1;
float largestDisplacement = LargestDisplacement;
ArrayList listPieSlices = new ArrayList();
m_pieSlicesMapping.Clear();
int colorIndex = 0;
int backPieIndex = -1;
int displacementIndex = 0;
double startAngle = (double)m_initialAngle;
for (int i = 0; i < m_values.Length; ++i) {
decimal itemValue = m_values[i];
double sweepAngle = (double)itemValue / sum * 360;
// displacement from the center of the ellipse
float xDisplacement = m_sliceRelativeDisplacements[displacementIndex];
float yDisplacement = m_sliceRelativeDisplacements[displacementIndex];
if (xDisplacement > 0F) {
Debug.Assert(largestDisplacement > 0F);
SizeF pieDisplacement = GetSliceDisplacement((float)(startAngle + sweepAngle / 2), m_sliceRelativeDisplacements[displacementIndex]);
xDisplacement = pieDisplacement.Width;
yDisplacement = pieDisplacement.Height;
}
PieSlice slice = null;
if (i == m_highlightedIndex)
slice = CreatePieSliceHighlighted(m_xBoundingRect + largestDisplacementEllipseSize.Width / 2 + xDisplacement, m_yBoundingRect + largestDisplacementEllipseSize.Height / 2 + yDisplacement, topEllipeSize.Width, topEllipeSize.Height, PieHeight, (float)(startAngle % 360), (float)(sweepAngle), m_sliceColors[colorIndex], m_shadowStyle, m_edgeColorType, m_edgeLineWidth);
else
slice = CreatePieSlice(m_xBoundingRect + largestDisplacementEllipseSize.Width / 2 + xDisplacement, m_yBoundingRect + largestDisplacementEllipseSize.Height / 2 + yDisplacement, topEllipeSize.Width, topEllipeSize.Height, PieHeight, (float)(startAngle % 360), (float)(sweepAngle), m_sliceColors[colorIndex], m_shadowStyle, m_edgeColorType, m_edgeLineWidth);
slice.Text = m_texts[i];
// the backmost pie is inserted to the front of the list for correct drawing
if (backPieIndex > -1 || ((startAngle <= 270) && (startAngle + sweepAngle > 270)) || ((startAngle >= 270) && (startAngle + sweepAngle > 630))) {
++backPieIndex;
listPieSlices.Insert(backPieIndex, slice);
m_pieSlicesMapping.Insert(backPieIndex, i);
}
else {
listPieSlices.Add(slice);
m_pieSlicesMapping.Add(i);
}
// increment displacementIndex only if there are more displacements available
if (displacementIndex < maxDisplacementIndex)
++displacementIndex;
++colorIndex;
// if all colors have been exhausted, reset color index
if (colorIndex >= m_sliceColors.Length)
colorIndex = 0;
// prepare for the next pie slice
startAngle += sweepAngle;
if (startAngle > 360)
startAngle -= 360;
}
m_pieSlices = (PieSlice[])listPieSlices.ToArray(typeof(PieSlice));
}