public void AddBars(Graphics g, ChartStyle cs, int numberOfDataSeries, int numberOfPoints)
{
// Draw bars:
ArrayList temp = new ArrayList();
float[] tempy = new float[numberOfPoints];
PointF temppt = new PointF();
int n = 0;
foreach (DataSeries ds in DataSeriesList)
{
Pen aPen = new Pen(ds.BarStyle.BorderColor, ds.BarStyle.BorderThickness);
SolidBrush aBrush = new SolidBrush(ds.BarStyle.FillColor);
aPen.DashStyle = ds.BarStyle.BorderPattern;
PointF[] pts = new PointF[4];
PointF pt;
float width;
if (cs.BarType == ChartStyle.BarTypeEnum.Vertical)
{
if (numberOfDataSeries == 1)
{
// Find the minumum and maximum y values:
float ymin = 0;
float ymax = 0;
for (int i = 0; i < ds.PointList.Count; i++)
{
pt = (PointF)ds.PointList[i];
ymin = Math.Min(ymin, pt.Y);
ymax = Math.Max(ymax, pt.Y);
}
width = cs.XTick * ds.BarStyle.BarWidth;
for (int i = 0; i < ds.PointList.Count; i++)
{
pt = (PointF)ds.PointList[i];
float x = pt.X - cs.XTick / 2;
pts[0] = cs.Point2D(new PointF(x - width / 2, 0));
pts[1] = cs.Point2D(new PointF(x + width / 2, 0));
pts[2] = cs.Point2D(new PointF(x + width / 2, pt.Y));
pts[3] = cs.Point2D(new PointF(x - width / 2, pt.Y));
if (ds.IsSingleColorMap)
{
DrawColorMap(g, pts, ds.CMap, ymin, ymax, pt.Y);
}
else if (ds.IsColorMap)
{
float dy = (ymax - ymin) / 100;
PointF[] points = new PointF[4];
for (int j = 0; j <= (int)Math.Round(100 * (pt.Y - ymin) /
(ymax - ymin)); j++)
{
points[0] = cs.Point2D(new PointF(x - width / 2, (j - 1) * dy));
points[1] = cs.Point2D(new PointF(x + width / 2, (j - 1) * dy));
points[2] = cs.Point2D(new PointF(x + width / 2, j * dy));
points[3] = cs.Point2D(new PointF(x - width / 2, j * dy));
DrawColorMap(g, points, ds.CMap, ymin, ymax, j * dy);
}
}
else
{
g.FillPolygon(aBrush, pts);
}
g.DrawPolygon(aPen, pts);
}
}
else if (numberOfDataSeries > 1)
{
width = 0.7f * cs.XTick;
for (int i = 0; i < ds.PointList.Count; i++)
{
pt = (PointF)ds.PointList[i];
float w1 = width / numberOfDataSeries;
float w = ds.BarStyle.BarWidth * w1;
float space = (w1 - w) / 2;
float x = pt.X - cs.XTick / 2;
pts[0] = cs.Point2D(new PointF(
x - width / 2 + space + n * w1, 0));
pts[1] = cs.Point2D(new PointF(
x - width / 2 + space + n * w1 + w, 0));
pts[2] = cs.Point2D(new PointF(
x - width / 2 + space + n * w1 + w, pt.Y));
pts[3] = cs.Point2D(new PointF(
x - width / 2 + space + n * w1, pt.Y));
g.FillPolygon(aBrush, pts);
g.DrawPolygon(aPen, pts);
}
}
}
else if (cs.BarType == ChartStyle.BarTypeEnum.VerticalOverlay
&& numberOfDataSeries >1)
{
width = cs.XTick * ds.BarStyle.BarWidth;
width = width / (float)Math.Pow(2,n);
for (int i = 0; i < ds.PointList.Count; i++)
{
pt = (PointF)ds.PointList[i];
float x = pt.X - cs.XTick / 2;
pts[0] = cs.Point2D(new PointF(x - width / 2, 0));
pts[1] = cs.Point2D(new PointF(x + width / 2, 0));
pts[2] = cs.Point2D(new PointF(x + width / 2, pt.Y));
pts[3] = cs.Point2D(new PointF(x - width / 2, pt.Y));
g.FillPolygon(aBrush, pts);
g.DrawPolygon(aPen, pts);
}
}
else if (cs.BarType == ChartStyle.BarTypeEnum.VerticalStack
&& numberOfDataSeries > 1)
{
width = cs.XTick * ds.BarStyle.BarWidth;
for (int i = 0; i < ds.PointList.Count; i++)
{
pt = (PointF)ds.PointList[i];
if (temp.Count > 0)
{
tempy[i] = tempy[i] + ((PointF)temp[i]).Y;
}
float x = pt.X - cs.XTick / 2;
pts[0] = cs.Point2D(new PointF(x - width / 2, 0 + tempy[i]));
pts[1] = cs.Point2D(new PointF(x + width / 2, 0 + tempy[i]));
pts[2] = cs.Point2D(new PointF(x + width / 2, pt.Y + tempy[i]));
pts[3] = cs.Point2D(new PointF(x - width / 2, pt.Y + tempy[i]));
g.FillPolygon(aBrush, pts);
g.DrawPolygon(aPen, pts);
}
temp = ds.PointList;
}
else if (cs.BarType == ChartStyle.BarTypeEnum.Horizontal)
{
if (numberOfDataSeries == 1)
{
width = cs.YTick * ds.BarStyle.BarWidth;
for (int i = 0; i < ds.PointList.Count; i++)
{
temppt = (PointF)ds.PointList[i];
pt = new PointF(temppt.Y, temppt.X);
float y = pt.Y - cs.YTick / 2;
pts[0] = cs.Point2D(new PointF(0, y - width / 2));
pts[1] = cs.Point2D(new PointF(0, y + width / 2));
pts[2] = cs.Point2D(new PointF(pt.X, y + width / 2));
pts[3] = cs.Point2D(new PointF(pt.X, y - width / 2));
g.FillPolygon(aBrush, pts);
g.DrawPolygon(aPen, pts);
}
}
else if (numberOfDataSeries > 1)
{
width = 0.7f * cs.YTick;
for (int i = 0; i < ds.PointList.Count; i++)
{
temppt = (PointF)ds.PointList[i];
pt = new PointF(temppt.Y, temppt.X);
float w1 = width / numberOfDataSeries;
float w = ds.BarStyle.BarWidth * w1;
float space = (w1 - w) / 2;
float y = pt.Y - cs.YTick / 2;
pts[0] = cs.Point2D(new PointF(0,
y - width / 2 + space + n * w1));
pts[1] = cs.Point2D(new PointF(0,
y - width / 2 + space + n * w1 + w));
pts[2] = cs.Point2D(new PointF(pt.X,
y - width / 2 + space + n * w1 + w));
pts[3] = cs.Point2D(new PointF(pt.X,
y - width / 2 + space + n * w1));
g.FillPolygon(aBrush, pts);
g.DrawPolygon(aPen, pts);
}
}
}
else if (cs.BarType == ChartStyle.BarTypeEnum.HorizontalOverlay &&
numberOfDataSeries > 1)
{
width = cs.YTick * ds.BarStyle.BarWidth;
width = width / (float)Math.Pow(2, n);
for (int i = 0; i < ds.PointList.Count; i++)
{
temppt = (PointF)ds.PointList[i];
pt = new PointF(temppt.Y, temppt.X);
float y = pt.Y - cs.YTick / 2;
pts[0] = cs.Point2D(new PointF(0, y - width / 2));
pts[1] = cs.Point2D(new PointF(0, y + width / 2));
pts[2] = cs.Point2D(new PointF(pt.X, y + width / 2));
pts[3] = cs.Point2D(new PointF(pt.X, y - width / 2));
g.FillPolygon(aBrush, pts);
g.DrawPolygon(aPen, pts);
}
}
else if (cs.BarType == ChartStyle.BarTypeEnum.HorizontalStack &&
numberOfDataSeries > 1)
{
{
width = cs.YTick * ds.BarStyle.BarWidth;
for (int i = 0; i < ds.PointList.Count; i++)
{
temppt = (PointF)ds.PointList[i];
pt = new PointF(temppt.Y, temppt.X);
if (temp.Count > 0)
{
temppt = (PointF)temp[i];
tempy[i] = tempy[i] + temppt.Y;
}
float y = pt.Y - cs.YTick / 2;
pts[0] = cs.Point2D(new PointF(0 + tempy[i], y - width / 2));
pts[1] = cs.Point2D(new PointF(0 + tempy[i], y + width / 2));
pts[2] = cs.Point2D(new PointF(pt.X + tempy[i], y + width / 2));
pts[3] = cs.Point2D(new PointF(pt.X + tempy[i], y - width / 2));
g.FillPolygon(aBrush, pts);
g.DrawPolygon(aPen, pts);
}
temp = ds.PointList;
}
}
n++;
aPen.Dispose();
}
}