private void AddMeshZ(Graphics g, DataSeries ds, ChartStyle cs) { Pen aPen = new Pen(ds.LineStyle.LineColor, ds.LineStyle.Thickness); aPen.DashStyle = ds.LineStyle.Pattern; SolidBrush aBrush = new SolidBrush(Color.White); Matrix3 m = Matrix3.AzimuthElevation(cs.Elevation, cs.Azimuth); PointF[] pta = new PointF[4]; Point3[,] pts = ds.PointArray; Point3[,] pts1 = new Point3[pts.GetLength(0), pts.GetLength(1)]; Color color; // Find the minumum and maximum z values: float zmin = ds.ZDataMin(); float zmax = ds.ZDataMax(); for (int i = 0; i < pts.GetLength(0); i++) { for (int j = 0; j < pts.GetLength(1); j++) { // Make a deep copy the points array: pts1[i, j] = new Point3(pts[i, j].X, pts[i, j].Y, pts[i, j].Z, 1); // Perform transformations on points: pts[i, j].Transform(m, form1, cs); } } //Draw mesh using Z-order method: for (int i = 0; i < pts.GetLength(0) - 1; i++) { for (int j = 0; j < pts.GetLength(1) - 1; j++) { int ii = i; if (cs.Azimuth >= -180 && cs.Azimuth < 0) { ii = pts.GetLength(0) - 2 - i; } pta[0] = new PointF(pts[ii, j].X, pts[ii, j].Y); pta[1] = new PointF(pts[ii, j + 1].X, pts[ii, j + 1].Y); pta[2] = new PointF(pts[ii + 1, j + 1].X, pts[ii + 1, j + 1].Y); pta[3] = new PointF(pts[ii + 1, j].X, pts[ii + 1, j].Y); g.FillPolygon(aBrush, pta); if (IsColorMap) { color = AddColor(cs, pts[ii, j], zmin, zmax); aPen = new Pen(color, ds.LineStyle.Thickness); aPen.DashStyle = ds.LineStyle.Pattern; } g.DrawPolygon(aPen, pta); } } //Draw cyrtain lines Point3[] pt3 = new Point3[4]; for (int i = 0; i < pts1.GetLength(0); i++) { int jj = pts1.GetLength(0) - 1; if (cs.Elevation >= 0) { if (cs.Azimuth >= -90 && cs.Azimuth <= 90) { jj = 0; } } else if (cs.Elevation < 0) { jj = 0; if (cs.Azimuth >= -90 && cs.Azimuth <= 90) { jj = pts1.GetLength(0) - 1; } } if (i < pts1.GetLength(0) - 1) { pt3[0] = new Point3(pts1[i, jj].X, pts1[i, jj].Y, pts1[i, jj].Z, 1); pt3[1] = new Point3(pts1[i + 1, jj].X, pts1[i + 1, jj].Y, pts1[i + 1, jj].Z, 1); pt3[2] = new Point3(pts1[i + 1, jj].X, pts1[i + 1, jj].Y, cs.ZMin, 1); pt3[3] = new Point3(pts1[i, jj].X, pts1[i, jj].Y, cs.ZMin, 1); for (int k = 0; k < 4; k++) { pt3[k].Transform(m, form1, cs); } pta[0] = new PointF(pt3[0].X, pt3[0].Y); pta[1] = new PointF(pt3[1].X, pt3[1].Y); pta[2] = new PointF(pt3[2].X, pt3[2].Y); pta[3] = new PointF(pt3[3].X, pt3[3].Y); g.FillPolygon(aBrush, pta); if (IsColorMap) { color = AddColor(cs, pt3[0], zmin, zmax); aPen = new Pen(color, ds.LineStyle.Thickness); aPen.DashStyle = ds.LineStyle.Pattern; } g.DrawPolygon(aPen, pta); } } for (int j = 0; j < pts1.GetLength(1); j++) { int ii = 0; if (cs.Elevation >= 0) { if (cs.Azimuth >= 0 && cs.Azimuth <= 180) { ii = pts1.GetLength(1) - 1; } } else if (cs.Elevation < 0) { if (cs.Azimuth >= -180 && cs.Azimuth <= 0) { ii = pts1.GetLength(1) - 1; } } if (j < pts1.GetLength(1) - 1) { pt3[0] = new Point3(pts1[ii, j].X, pts1[ii, j].Y, pts1[ii, j].Z, 1); pt3[1] = new Point3(pts1[ii, j + 1].X, pts1[ii, j + 1].Y, pts1[ii, j + 1].Z, 1); pt3[2] = new Point3(pts1[ii, j + 1].X, pts1[ii, j + 1].Y, cs.ZMin, 1); pt3[3] = new Point3(pts1[ii, j].X, pts1[ii, j].Y, cs.ZMin, 1); for (int k = 0; k < 4; k++) { pt3[k].Transform(m, form1, cs); } pta[0] = new PointF(pt3[0].X, pt3[0].Y); pta[1] = new PointF(pt3[1].X, pt3[1].Y); pta[2] = new PointF(pt3[2].X, pt3[2].Y); pta[3] = new PointF(pt3[3].X, pt3[3].Y); g.FillPolygon(aBrush, pta); if (IsColorMap) { color = AddColor(cs, pt3[0], zmin, zmax); aPen = new Pen(color, ds.LineStyle.Thickness); aPen.DashStyle = ds.LineStyle.Pattern; } g.DrawPolygon(aPen, pta); } } aPen.Dispose(); aBrush.Dispose(); }
/// <summary> /// 读取外部文件数据 /// </summary> /// <param name="ds"></param> /// <param name="cs"></param> public void ReadDataFromFile(DataSeries ds, ChartStyle cs) { string inputdata = ""; int count = 0; int n = 0; string[] readArray = new string[2]; float[] xvalue = new float[2], yvalue = new float[2], zvalue = new float[2]; cs.XMin = -3; cs.XMax = 3; cs.YMin = -3; cs.YMax = 3; cs.ZMin = -8; cs.ZMax = 8; cs.XTick = 1; cs.YTick = 1; cs.ZTick = 4; //Read data from file string filename = System.AppDomain.CurrentDomain.BaseDirectory + "testingdata.txt"; StreamReader sr = new StreamReader(filename); char[] cSplitter = { ' ', ',', ':', '\t' }; inputdata = sr.ReadLine(); readArray = inputdata.Split(cSplitter); xvalue = new float[readArray.Length - 1]; yvalue = new float[readArray.Length - 1]; zvalue = new float[xvalue.Length * yvalue.Length]; for (int i = 0; i < xvalue.Length; i++) { xvalue[i] = float.Parse(readArray[i + 1]); } while (inputdata != null) { inputdata = sr.ReadLine(); if (inputdata == null) { break; } readArray = inputdata.Split(cSplitter); yvalue[n] = float.Parse(readArray[0]); for (int i = 0; i < yvalue.Length; i++) { zvalue[count] = float.Parse(readArray[i + 1]); count++; } n++; } Point3[,] pts = new Point3[xvalue.Length, yvalue.Length]; float x, y, z; for (int i = 0; i < xvalue.Length; i++) { x = xvalue[i]; for (int j = 0; j < yvalue.Length; j++) { y = yvalue[j]; z = zvalue[j + i * yvalue.Length]; //pts[i - 1, j - 1] = new Point3(x, y, z, 1); pts[i, j] = new Point3(x, y, z, 1); } } ds.PointArray = pts;//取出文件里的数据——显示 ds.XDataMin = pts[0, 0].X; ds.YDataMin = pts[0, 0].Y; ds.XSpacing = pts[1, 0].X - pts[0, 0].X; ds.YSpacing = pts[0, 1].Y - pts[0, 0].Y; ds.XNumber = pts.GetLength(0); ds.YNumber = pts.GetLength(1); }