public void LoadPoints(string[] data)
        {
            for (int i = 3; i < (numberOfPositions * 2) + 3; i += 2)
            {
                PositionRowColumn rowAndColumn = PositionRowColumn.FromString(data[i], nrOfColumns);

                FlowPoint point = new FlowPoint
                {
                    row          = rowAndColumn.row,
                    column       = rowAndColumn.column,
                    matrixRow    = rowAndColumn.row - 1,
                    matrixColumn = rowAndColumn.column - 1,
                    color        = Int32.Parse(data[i + 1])
                };
                FlowPoint parent = pointPairs.Keys.FirstOrDefault(it => it.color == point.color);

                if (parent != null)
                {
                    pointPairs[parent] = point;
                    parent.ComputeManhatan(point);
                    point.manhattanDistance = parent.manhattanDistance;

                    parent.destination = point;
                    point.destination  = parent;
                }
                else
                {
                    pointPairs.Add(point, null);
                }

                flowMatrix[point.matrixRow][point.matrixColumn] = point;
                flowMatrixClone.SetPixel(point.matrixColumn, point.matrixRow, Color.Red);
            }
        }
        public void CheckPaths(string[] data, string path)
        {
            List <int> pathOutputs = new List <int>();

            int startI        = (numberOfPositions * 2) + 3;
            int numberOfPaths = Int32.Parse(data[startI]);

            startI++;

            int i            = startI;
            int pathsCounter = 0;

            while (pathsCounter < numberOfPaths)
            {
                int color = Int32.Parse(data[i]);
                PositionRowColumn rowAndColumn = PositionRowColumn.FromString(data[i + 1], nrOfColumns);
                int pathLength = Int32.Parse(data[i + 2]);

                FlowPoint        currentPoint = flowMatrix[rowAndColumn.matrixRow][rowAndColumn.matrixColumn];
                FlowPoint        destination  = currentPoint.destination;
                List <FlowPoint> tailOfpoints = new List <FlowPoint>();

                int  index       = 1;
                int  j           = i + 3;
                int  pathEnd     = i + pathLength + 3;
                bool pathIsValid = true;

                while (j < pathEnd && pathIsValid)
                {
                    int nextRow    = currentPoint.matrixRow;
                    int nextColumn = currentPoint.matrixColumn;
                    switch (data[j][0].ToString().ToLower())
                    {
                    case "n":
                        nextRow = nextRow - 1;
                        break;

                    case "e":
                        nextColumn = nextColumn + 1;
                        break;

                    case "s":
                        nextRow = nextRow + 1;
                        break;

                    case "w":
                        nextColumn = nextColumn - 1;
                        break;
                    }

                    if (IsMoveValid(nextRow, nextColumn, currentPoint.color, j + 1 == pathEnd, destination))
                    {
                        flowMatrix[nextRow][nextColumn].color = currentPoint.color;
                        tailOfpoints.Add(currentPoint);
                        currentPoint = flowMatrix[nextRow][nextColumn];
                        index++;
                        j++;
                    }
                    else
                    {
                        pathIsValid = false;
                    }
                }

                pathOutputs.Add(pathIsValid ? 1 : -1);
                pathOutputs.Add(pathIsValid ? index - 1 : index);
                if (pathIsValid)
                {
                    foreach (FlowPoint item in tailOfpoints)
                    {
                        flowMatrixClone.SetPixel(item.matrixColumn, item.matrixRow, Color.Red);
                        flowMatrixClone.Save(Program.PROJECT_ROOT + path + "-" + pathsCounter + ".png", ImageFormat.Png);
                    }
                }

                i = pathEnd;
                pathsCounter++;
            }

            int   width  = 2048;
            int   height = 2048;
            float scale  = Math.Min(width / nrOfColumns, height / nrOfRows);
            var   bmp    = new Bitmap(width, height);
            var   graph  = Graphics.FromImage(bmp);
            var   brush  = new SolidBrush(Color.White);

            var scaleWidth  = (int)(nrOfColumns * scale);
            var scaleHeight = (int)(nrOfRows * scale);

            graph.FillRectangle(brush, new RectangleF(0, 0, width, height));
            graph.DrawImage(flowMatrixClone, ((int)width - scaleWidth) / 2, ((int)height - scaleHeight) / 2, scaleWidth, scaleHeight);

            bmp.Save(Program.PROJECT_ROOT + path + ".png", ImageFormat.Png);
            Console.WriteLine(string.Join(" ", pathOutputs.Select(it => it.ToString()).ToList()));
            Console.WriteLine();
        }
Esempio n. 3
0
        public void CheckPaths(string[] data)
        {
            List <int> pathOutputs = new List <int>();

            int startI        = (numberOfPositions * 2) + 3;
            int numberOfPaths = Int32.Parse(data[startI]);

            startI++;

            //MatrixModel<FlowPoint> mat = new MatrixModel<FlowPoint>();
            //mat.height = nrOfRows;
            //mat.width = nrOfColumns;
            //mat.matrixData = flowMatrix;
            //MatrixModel<FlowPoint>.LogOnScreen(mat);

            int i            = startI;
            int pathsCounter = 0;

            while (pathsCounter < numberOfPaths)
            {
                int color = Int32.Parse(data[i]);
                PositionRowColumn rowAndColumn = PositionRowColumn.FromString(data[i + 1], nrOfColumns);
                int pathLength = Int32.Parse(data[i + 2]);

                FlowPoint currentPoint = flowMatrix[rowAndColumn.matrixRow][rowAndColumn.matrixColumn];
                FlowPoint destination  = currentPoint.destination;

                int  index       = 1;
                int  j           = i + 3;
                int  pathEnd     = i + pathLength + 3;
                bool pathIsValid = true;

                while (j < pathEnd && pathIsValid)
                {
                    int nextRow    = currentPoint.matrixRow;
                    int nextColumn = currentPoint.matrixColumn;
                    switch (data[j][0].ToString().ToLower())
                    {
                    case "n":
                        nextRow = nextRow - 1;
                        break;

                    case "e":
                        nextColumn = nextColumn + 1;
                        break;

                    case "s":
                        nextRow = nextRow + 1;
                        break;

                    case "w":
                        nextColumn = nextColumn - 1;
                        break;
                    }

                    if (IsMoveValid(nextRow, nextColumn, currentPoint.color, j + 1 == pathEnd, destination))
                    {
                        flowMatrix[nextRow][nextColumn].color = currentPoint.color;
                        currentPoint = flowMatrix[nextRow][nextColumn];
                        index++;
                        j++;
                    }
                    else
                    {
                        pathIsValid = false;
                    }
                }

                pathOutputs.Add(pathIsValid ? 1 : -1);
                pathOutputs.Add(pathIsValid ? index - 1 : index);
                i += pathEnd;
                pathsCounter++;
            }

            Console.WriteLine(string.Join(' ', pathOutputs));
            Console.WriteLine();



            //MatrixModel<FlowPoint>.LogOnScreen(mat);
        }