public void Init(ref DataP3[] _dataPoints)
        {
            this.dataPoints = _dataPoints;
            this.numDataPoints = dataPoints.Length;

            double minX = 0; double maxX = 0;
            double minY = 0; double maxY = 0;
            DataP3.FindMinMaxCoordinates(dataPoints,ref minX, ref maxX, ref minY, ref maxY);
            double widthNetX = (maxX - minX);
            double widthNetY = (maxY - minY);
            int cellWidth = 1;
            int kx = (int)(widthNetX / cellWidth) + 1;
            int ky = (int)(widthNetY / cellWidth) + 1;
            int numTargetPoints = kx * ky * 4;
            targetPoints = new DataP3[2 * kx, 2 * ky];

            int index = 0;
            for (double i = 0; i < kx; i += 0.5)
            {
                double x = minX + i * cellWidth;
                for (double j = 0; j < ky; j += 0.5)
                {
                    double y = minY + j * cellWidth;
                    targetPoints[(int)(2*i),(int)(2*j)] = new DataP3(x, y, 0);
                    index++;
                }
            }
        }
        static void DrawIsoline(DataP3[,] Points, float H, ref PaintEventArgs e)
        {
            List<PointF> crossPoints = new List<PointF>();
            int rows = Points.GetLength(0);
            int cols = Points.GetLength(1);

            for (int i = 0; i < rows-1; i++)
            {
                for (int j = 0; j < cols-1; j++)
                {
                    DataP3 crPoint;
                    //up
                    crPoint = CheckExpression(Points[i, j], Points[i, j + 1], H);
                    if (crPoint.H != -1)
                        crossPoints.Add((PointF)crPoint);
                    //right
                    crPoint = CheckExpression(Points[i, j + 1], Points[i + 1, j + 1], H);
                    if (crPoint.H != -1)
                        crossPoints.Add((PointF)crPoint);
                    //down
                    crPoint = CheckExpression(Points[i + 1, j + 1], Points[i + 1, j], H);
                    if (crPoint.H != -1)
                        crossPoints.Add((PointF)crPoint);
                    //left
                    crPoint = CheckExpression(Points[i + 1, j], Points[i, j], H);
                    if (crPoint.H != -1)
                        crossPoints.Add((PointF)crPoint);

                    if (crossPoints.Count > 1 && crossPoints.Count < 4)
                        DrawCrossLines(crossPoints, ref e);
                    crossPoints.Clear();
                }
            }
        }
 public DataP3[] FindPath(float x1, float y1, float x2, float y2)
 {
     DataP3 start = new DataP3(x1,y1, ObjectiveFunc(x1,y1));
     DataP3 finish = new DataP3(x2,y2, ObjectiveFunc(x2,y2));
     this.pathAlgorithm = new PathAlgorithm(start, finish,ref Algorithm.instance);
     return this.pathAlgorithm.FindPath();
 }
示例#4
0
 public void DrawPath(DataP3[] path)
 {
     Pen pen = new Pen(Color.BlueViolet, 0.05f);
     Pen pen1 = new Pen(Color.Green, 0.0f);
     graphics.DrawLines(pen, DataP3.ToPointFArray(path));
     //e.Graphics.DrawCurve(pen, DataP3.ToPointFArray(path));
 }
        static DataP3 CrossPoint(DataP3 p1, DataP3 p2, float H)
        {
            double deltaH = (H - p1.H) / (p2.H - p1.H);
            double x = 0.0f;
            double y = 0.0f;

            if ((p1.X < p2.X) || (p1.X > p2.X))
            {
                x = Math.Min(p1.X, p2.X) + deltaH;
                y = p1.Y;
            }

            if ((p1.Y < p2.Y) || (p1.Y > p2.Y))
            {
                x = p1.X;
                y = Math.Min(p1.Y, p2.Y) + deltaH;
            }

            //if (p1.X > p2.X)
            //{ x = p2.X + deltaH; y = p2.y; }

            //if (p1.Y > p2.Y)
            //{ x = p2.X; y = p2.y + deltaH; }

            return new DataP3(x,y,H);
        }
 /// <summary>
 /// Запись в файл
 /// </summary>
 /// <param name="dataPoints">Исходные точки</param>
 /// <param name="targetPoints">Точки регулярной сетки</param>
 /// <param name="fileName">Имя файла записи</param>
 public void Write(ref DataP3[] dataPoints, ref DataP3[,] targetPoints, string fileName)
 {
     Init(fileName);
     if (dataPoints.Length != 0)
     {
         _workSheet.Cells[1, 1] = "X";
         _workSheet.Cells[1, 2] = "Y";
         _workSheet.Cells[1, 3] = "H";
         for (int i = 0; i < dataPoints.Length; i++) // по всем строкам
         {
             _workSheet.Cells[i + 2, 1] = dataPoints[i].X;
             _workSheet.Cells[i + 2, 2] = dataPoints[i].Y;
             _workSheet.Cells[i + 2, 3] = dataPoints[i].H;
         }
     }
     if (targetPoints.Length != 0)
     {
         _workSheet = _workSheet.Next;
         _workSheet.Cells[1, 1] = "X";
         _workSheet.Cells[1, 2] = "Y";
         _workSheet.Cells[1, 3] = "H";
         int indexCell = 2;
         for (int i = 0; i < targetPoints.GetLength(0); i++) // по всем строкам
             for (int j = 0; j < targetPoints.GetLength(1); j++)
             {
                 _workSheet.Cells[indexCell, 1] = targetPoints[i,j].X;
                 _workSheet.Cells[indexCell, 2] = targetPoints[i,j].Y;
                 _workSheet.Cells[indexCell, 3] = targetPoints[i,j].H;
                 indexCell++;
             }
     }
     _application.Visible = true;//открываем файл
 }
 public _3DSurfaceForm(DataP3[] _data, string _dataType)
 {
     InitializeComponent();
     control = Controller.getInstance();
     data = _data;
     dataType = _dataType;
     Init();
 }
 static DataP3 CheckExpression(DataP3 p1, DataP3 p2, float H)
 {
     if (
         ((p1.H - H) < 0 && (H - p2.H) < 0) ||
         ((p1.H - H) > 0 && (H - p2.H) > 0)
       )
     { return CrossPoint(p1, p2, H); }
     else return new DataP3(0,0,-1);
 }
示例#9
0
 public void DrawAllIsolines(DataP3[,] Points)
 {
     double minH = 0;
     double maxH=0;
     DataP3.FindMinMaxHeight(Points, ref minH, ref maxH);
     for (float i = (float)minH; i <= maxH; i+=0.5f) {
         DrawIsoline(Points, i);
     }
 }
示例#10
0
 //Генерация сетки тестовой поверхности
 public static void GenerateTestSurface(ref DataP3[] surface, int lenght)
 {
     int num = 0;
     for (double i = 0; i < lenght; i += 0.05)
         for (double j = 0; j < lenght; j += 0.05)
         {
             double z = TestFunc(i, j);
             surface[num] = new DataP3(i, j, z);
             num++;
         }
 }
示例#11
0
 //Генерация исходных тестовых точек
 public static void GenerateTestData(ref DataP3[] data, int lenght, int max)
 {
     Random r = new Random();
     double x; double y; double z;
     for (int i = 0; i < lenght; i++)
     {
         x = r.NextDouble() * max;
         y = r.NextDouble() * max;
         z = TestFunc(x, y);
         data[i] = new DataP3(x, y, z);
     }
 }
        public _3DSurfaceForm(DataP3[,] _data, string _dataType)
        {
            InitializeComponent();
            control = Controller.getInstance();

            data = new DataP3[_data.Length];
            int indexArr = 0;
            for (int i = 0; i < _data.GetLength(0); i++)
            {
                for (int j = 0; j < _data.GetLength(0); j++)
                {
                    data[indexArr] = _data[i, j];
                    indexArr++;
                }
            }

            dataType = _dataType;
            Init();
        }
示例#13
0
 public static Algorithm getInstance(ref DataP3[] _dataPoints)
 {
     if (instance == null) instance = new Algorithm(ref _dataPoints);
     return instance;
 }
示例#14
0
        private int type; //Тип весовой ф-ии

        #endregion Fields

        #region Constructors

        private Algorithm(ref DataP3[] _dataPoints)
        {
            Init(ref _dataPoints);
        }
示例#15
0
 public static void DrawAllIsolines(DataP3[,] Points, ref PaintEventArgs e)
 {
     DrawIsoline(Points, 0.5f, ref e);
 }
示例#16
0
        static DataP3 CrossPoint(DataP3 p1, DataP3 p2, float H)
        {
            //double deltaH = (H - p1.H) / (p2.H - p1.H);
            double x = 0.0f;
            double y = 0.0f;

            /*
            if ((p1.X < p2.X) || (p1.X > p2.X))
            {
                y = p1.Y;
                //x = (Math.Abs(H - p1.H) < Math.Abs(H - p2.H)) ? p1.X : p2.X;
                x = p1.X;
                x += deltaH;
            }

            if ((p1.Y < p2.Y) || (p1.Y > p2.Y))
            {
                x = p1.X;
                //y = (Math.Abs(H - p1.H) < Math.Abs(H - p2.H)) ? p1.Y : p2.Y;
                y = p1.Y;
                y += deltaH;
            }
            */

            if ((p1.X < p2.X) || (p1.X > p2.X))
            {
                if (Math.Abs(H - p1.H) < Math.Abs(H - p2.H))
                {
                    double deltaH = (H - p1.H) / (p2.H - p1.H);
                    x = p1.X;
                    if (p1.X < p2.X)
                        x += deltaH;
                    else
                        x -= deltaH;
                }
                else
                {
                    double deltaH = (H - p2.H) / (p1.H - p2.H);
                    x = p2.X;
                    if (p1.X > p2.X)
                        x += deltaH;
                    else
                        x -= deltaH;
                }
                y = p1.Y;
            }

            if ((p1.Y < p2.Y) || (p1.Y > p2.Y))
            {
                if (Math.Abs(H - p1.H) < Math.Abs(H - p2.H))
                {
                    double deltaH = (H - p1.H) / (p2.H - p1.H);
                    y = p1.Y;
                    if (p1.Y < p2.Y)
                        y += deltaH;
                    else
                        y -= deltaH;
                }
                else
                {
                    double deltaH = (H - p2.H) / (p1.H - p2.H);
                    y = p2.Y;
                    if (p1.Y > p2.Y)
                        y += deltaH;
                    else
                        y -= deltaH;
                }
                x = p1.X;
            }

            return new DataP3(x, y, H);
        }