private void AddSlice(Graphics g, DataSeries ds, ChartStyle cs, ChartStyle2D cs2d, Axes ax, ViewAngle va, ChartLabels cl) { Pen aPen = new Pen(ds.LineStyle.LineColor, ds.LineStyle.Thickness); aPen.DashStyle = ds.LineStyle.Pattern; SolidBrush aBrush = new SolidBrush(Color.Black); Point4[, ,] pts = ds.Point4Array; PointF[] pta = new PointF[4]; Matrix3 m = Matrix3.AzimuthElevation(va.Elevation, va.Azimuth); // Find the minumum and maximum v values: float vmin = ds.VDataMin(); float vmax = ds.VDataMax(); // Perform transformation on points: for (int i = 0; i < pts.GetLength(0); i++) { for (int j = 0; j < pts.GetLength(1); j++) { for (int k = 0; k < pts.GetLength(2); k++) { pts[i, j, k].point3.Transform(m, chart3d, ax, cs, cl); pts[i, j, k].point3.Z = pts[i, j, k].V; } } } // Select slice: if (XYZSlice == SliceEnum.XSlice) { if (SliceLocation < ax.XMin) SliceLocation = ax.XMin; if (SliceLocation > ax.XMax) SliceLocation = ax.XMax; int nfix = (int)((SliceLocation - ds.XDataMin) / ds.XSpacing) + 1; for (int j = 0; j < pts.GetLength(1) - 1; j++) { for (int k = 0; k < pts.GetLength(2) - 1; k++) { pta[0] = new PointF(pts[nfix, j, k].point3.X, pts[nfix, j, k].point3.Y); pta[1] = new PointF(pts[nfix, j + 1, k].point3.X, pts[nfix, j + 1, k].point3.Y); pta[2] = new PointF(pts[nfix, j + 1, k + 1].point3.X, pts[nfix, j + 1, k + 1].point3.Y); pta[3] = new PointF(pts[nfix, j, k + 1].point3.X, pts[nfix, j, k + 1].point3.Y); Color color = AddColor(cs, pts[nfix, j, k].point3, vmin, vmax, ax, va, cl); aBrush = new SolidBrush(color); g.FillPolygon(aBrush, pta); if (ds.LineStyle.IsVisible) { g.DrawPolygon(aPen, pta); } } } } else if (XYZSlice == SliceEnum.YSlice) { if (SliceLocation < ax.YMin) SliceLocation = ax.YMin; if (SliceLocation > ax.YMax) SliceLocation = ax.YMax; int nfix = (int)((SliceLocation - ds.YDataMin) / ds.YSpacing) + 1; for (int i = 0; i < pts.GetLength(0) - 1; i++) { for (int k = 0; k < pts.GetLength(2) - 1; k++) { pta[0] = new PointF(pts[i, nfix, k].point3.X, pts[i, nfix, k].point3.Y); pta[1] = new PointF(pts[i + 1, nfix, k].point3.X, pts[i + 1, nfix, k].point3.Y); pta[2] = new PointF(pts[i + 1, nfix, k + 1].point3.X, pts[i + 1, nfix, k + 1].point3.Y); pta[3] = new PointF(pts[i, nfix, k + 1].point3.X, pts[i, nfix, k + 1].point3.Y); Color color = AddColor(cs, pts[i, nfix, k].point3, vmin, vmax, ax, va, cl); aBrush = new SolidBrush(color); g.FillPolygon(aBrush, pta); if (ds.LineStyle.IsVisible) { g.DrawPolygon(aPen, pta); } } } } else if (XYZSlice == SliceEnum.ZSlice) { if (SliceLocation < ax.ZMin) SliceLocation = ax.ZMin; if (SliceLocation > ax.ZMax) SliceLocation = ax.ZMax; int nfix = (int)((SliceLocation - ds.ZZDataMin) / ds.ZSpacing) + 1; for (int i = 0; i < pts.GetLength(0) - 1; i++) { for (int j = 0; j < pts.GetLength(1) - 1; j++) { pta[0] = new PointF(pts[i, j, nfix].point3.X, pts[i, j, nfix].point3.Y); pta[1] = new PointF(pts[i + 1, j, nfix].point3.X, pts[i + 1, j, nfix].point3.Y); pta[2] = new PointF(pts[i + 1, j + 1, nfix].point3.X, pts[i + 1, j + 1, nfix].point3.Y); pta[3] = new PointF(pts[i, j + 1, nfix].point3.X, pts[i, j + 1, nfix].point3.Y); Color color = AddColor(cs, pts[i, j, nfix].point3, vmin, vmax, ax, va, cl); aBrush = new SolidBrush(color); g.FillPolygon(aBrush, pta); if (ds.LineStyle.IsVisible) { g.DrawPolygon(aPen, pta); } } } } aPen.Dispose(); aBrush.Dispose(); }
public void AddColorBar(Graphics g, DataSeries ds, ChartStyle cs, ChartStyle2D cs2d, Axes ax, ViewAngle va, ChartLabels cl) { if (cs.IsColorBar && IsColorMap) { Pen aPen = new Pen(Color.Black, 1); SolidBrush aBrush = new SolidBrush(cl.TickFontColor); StringFormat sFormat = new StringFormat(); sFormat.Alignment = StringAlignment.Near; SizeF size = g.MeasureString("A", cl.TickFont); int x, y, width, height; Point3[] pts = new Point3[64]; PointF[] pta = new PointF[4]; float zmin, zmax; if (ChartType == ChartTypeEnum.Slice) { zmin = ds.VDataMin(); zmax = ds.VDataMax(); } else { zmin = ds.ZDataMin(); zmax = ds.ZDataMax(); } float dz = (zmax - zmin) / 63; if (ChartType == ChartTypeEnum.Contour || ChartType == ChartTypeEnum.FillContour || ChartType == ChartTypeEnum.XYColor) { x = 5 * cs2d.ChartArea.Width / 6; y = cs2d.PlotArea.Y; width = cs2d.ChartArea.Width / 25; height = cs2d.PlotArea.Height; // Add color bar: for (int i = 0; i < 64; i++) { pts[i] = new Point3(x, y, zmin + i * dz, 1); } for (int i = 0; i < 63; i++) { Color color = AddColor(cs, pts[i], zmin, zmax, ax, va, cl); aBrush = new SolidBrush(color); float y1 = y + height - (pts[i].Z - zmin) * height / (zmax - zmin); float y2 = y + height - (pts[i + 1].Z - zmin) * height / (zmax - zmin); pta[0] = new PointF(x, y2); pta[1] = new PointF(x + width, y2); pta[2] = new PointF(x + width, y1); pta[3] = new PointF(x, y1); g.FillPolygon(aBrush, pta); } g.DrawRectangle(aPen, x, y, width, height); // Add ticks and labels to the color bar: float ticklength = 0.1f * width; for (float z = zmin; z <= zmax; z = z + (zmax - zmin) / 6) { float yy = y + height - (z - zmin) * height / (zmax - zmin); g.DrawLine(aPen, x, yy, x + ticklength, yy); g.DrawLine(aPen, x + width, yy, x + width - ticklength, yy); g.DrawString((Math.Round(z, 2)).ToString(), cl.TickFont, Brushes.Black, new PointF(x + width + 5, yy - size.Height / 2), sFormat); } } else { x = 5 * cs2d.ChartArea.Width / 6; y = cs2d.ChartArea.Height / 10; width = cs2d.ChartArea.Width / 25; height = 8 * cs2d.ChartArea.Height / 10; // Add color bar: for (int i = 0; i < 64; i++) { pts[i] = new Point3(x, y, zmin + i * dz, 1); } for (int i = 0; i < 63; i++) { Color color = AddColor(cs, pts[i], zmin, zmax, ax, va, cl); aBrush = new SolidBrush(color); float y1 = y + height - (pts[i].Z - zmin) * height / (zmax - zmin); float y2 = y + height - (pts[i + 1].Z - zmin) * height / (zmax - zmin); pta[0] = new PointF(x, y2); pta[1] = new PointF(x + width, y2); pta[2] = new PointF(x + width, y1); pta[3] = new PointF(x, y1); g.FillPolygon(aBrush, pta); } g.DrawRectangle(aPen, x, y, width, height); // Add ticks and labels to the color bar: float ticklength = 0.1f * width; for (float z = zmin; z <= zmax; z = z + (zmax - zmin) / 6) { float yy = y + height - (z - zmin) * height / (zmax - zmin); g.DrawLine(aPen, x, yy, x + ticklength, yy); g.DrawLine(aPen, x + width, yy, x + width - ticklength, yy); g.DrawString((Math.Round(z, 2)).ToString(), cl.TickFont, Brushes.Black, new PointF(x + width + 5, yy - size.Height / 2), sFormat); } } } }