Пример #1
0
        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();
        }
Пример #2
0
        /// <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);
        }