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(); }
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); }