//public static TerrainOutputImage getVectorFieldImage(Vector[][] vectorField) //{ // int width = CELL_SIZE * vectorField.Length; // int height = CELL_SIZE * vectorField[0].Length; // Pen linePen = new Pen(Color.Black, 1); // Pen directionPen = new Pen(Color.Red, 1); // Bitmap bitmap = new Bitmap(width, height); // Graphics g = Graphics.FromImage(bitmap); // g.SmoothingMode = SmoothingMode.HighQuality; // g.Clear(Color.White); // for(int x = 0; x < vectorField.Length; x++) // { // for (int y = 0; y < vectorField[x].Length; y++) // { // drawVector(x * CELL_SIZE + CELL_SIZE/2, y * CELL_SIZE + CELL_SIZE/2, vectorField[x][y], g, linePen, directionPen); // } // } // TerrainOutputImage vectorFieldOutputImage = new TerrainOutputImage(); // vectorFieldOutputImage.Title = "Vector field"; // vectorFieldOutputImage.Key = "vectorField"; // vectorFieldOutputImage.ImageData = new int[bitmap.Width][]; // for (int i = 0; i < bitmap.Width; i++) // { // vectorFieldOutputImage.ImageData[i] = new int[bitmap.Height]; // for (int j = 0; j < bitmap.Height; j++) // { // Color color = bitmap.GetPixel(i, j); // vectorFieldOutputImage.ImageData[i][j] = (color.R << 24) | (color.G << 16) | (color.B << 8) | 0xff; // } // } // return vectorFieldOutputImage; //} //private static void drawVector(int posX, int posY, Vector vector, Graphics g, Pen linePen, Pen directionPen) //{ // float amplification = (CELL_SIZE/2)-1; // GraphicsState state = g.Save(); // g.TranslateTransform(posX, posY); // g.DrawLine(directionPen, 0, 0, vector.Vx * amplification, vector.Vy * amplification); // g.DrawLine(linePen, 0, 0, vector.Vx * -amplification, vector.Vy * -amplification); // g.Restore(state); //} private static void getLowestNeighbour(float?[][] heightMap, int x, int y, out int finalX, out int finalY) { float?currentHeight = 9999; int nX; int nY; finalX = x; finalY = y; float?neighbourHeight = TerrainHelpers.getLeft(heightMap, x, y, out nX, out nY); if (neighbourHeight != null && neighbourHeight < currentHeight) { currentHeight = neighbourHeight; finalX = nX; finalY = nY; } neighbourHeight = TerrainHelpers.getLeftLeftTop(heightMap, x, y, out nX, out nY); if (neighbourHeight != null && neighbourHeight < currentHeight) { currentHeight = neighbourHeight; finalX = nX; finalY = nY; } neighbourHeight = TerrainHelpers.getTopLeft(heightMap, x, y, out nX, out nY); if (neighbourHeight != null && neighbourHeight < currentHeight) { currentHeight = neighbourHeight; finalX = nX; finalY = nY; } neighbourHeight = TerrainHelpers.getTopTopLeft(heightMap, x, y, out nX, out nY); if (neighbourHeight != null && neighbourHeight < currentHeight) { currentHeight = neighbourHeight; finalX = nX; finalY = nY; } neighbourHeight = TerrainHelpers.getTop(heightMap, x, y, out nX, out nY); if (neighbourHeight != null && neighbourHeight < currentHeight) { currentHeight = neighbourHeight; finalX = nX; finalY = nY; } neighbourHeight = TerrainHelpers.getTopTopRight(heightMap, x, y, out nX, out nY); if (neighbourHeight != null && neighbourHeight < currentHeight) { currentHeight = neighbourHeight; finalX = nX; finalY = nY; } neighbourHeight = TerrainHelpers.getTopRight(heightMap, x, y, out nX, out nY); if (neighbourHeight != null && neighbourHeight < currentHeight) { currentHeight = neighbourHeight; finalX = nX; finalY = nY; } neighbourHeight = TerrainHelpers.getRightRightTop(heightMap, x, y, out nX, out nY); if (neighbourHeight != null && neighbourHeight < currentHeight) { currentHeight = neighbourHeight; finalX = nX; finalY = nY; } neighbourHeight = TerrainHelpers.getRight(heightMap, x, y, out nX, out nY); if (neighbourHeight != null && neighbourHeight < currentHeight) { currentHeight = neighbourHeight; finalX = nX; finalY = nY; } neighbourHeight = TerrainHelpers.getRightRightBottom(heightMap, x, y, out nX, out nY); if (neighbourHeight != null && neighbourHeight < currentHeight) { currentHeight = neighbourHeight; finalX = nX; finalY = nY; } neighbourHeight = TerrainHelpers.getBottomRight(heightMap, x, y, out nX, out nY); if (neighbourHeight != null && neighbourHeight < currentHeight) { currentHeight = neighbourHeight; finalX = nX; finalY = nY; } neighbourHeight = TerrainHelpers.getBottomBottomRight(heightMap, x, y, out nX, out nY); if (neighbourHeight != null && neighbourHeight < currentHeight) { currentHeight = neighbourHeight; finalX = nX; finalY = nY; } neighbourHeight = TerrainHelpers.getBottom(heightMap, x, y, out nX, out nY); if (neighbourHeight != null && neighbourHeight < currentHeight) { currentHeight = neighbourHeight; finalX = nX; finalY = nY; } neighbourHeight = TerrainHelpers.getBottomBottomLeft(heightMap, x, y, out nX, out nY); if (neighbourHeight != null && neighbourHeight < currentHeight) { currentHeight = neighbourHeight; finalX = nX; finalY = nY; } neighbourHeight = TerrainHelpers.getBottomLeft(heightMap, x, y, out nX, out nY); if (neighbourHeight != null && neighbourHeight < currentHeight) { currentHeight = neighbourHeight; finalX = nX; finalY = nY; } neighbourHeight = TerrainHelpers.getLeftLeftBottom(heightMap, x, y, out nX, out nY); if (neighbourHeight != null && neighbourHeight < currentHeight) { currentHeight = neighbourHeight; finalX = nX; finalY = nY; } }
private static Vector getCellVector(float?[][] heightMap, int x, int y) { float currentVx = 0; float currentVy = 0; int nX; int nY; List <Vector> vectors = new List <Vector>(); float?currentValue = TerrainHelpers.getTopLeft(heightMap, x, y, out nX, out nY); if (currentValue != null && currentValue < heightMap[x][y]) { currentValue = heightMap[x][y] - currentValue; currentValue = (float)Math.Cos(Math.PI / 4) * currentValue; currentVx = -(float)currentValue; currentVy = -(float)currentValue; vectors.Add(new Vector(currentVx, currentVy)); } currentValue = TerrainHelpers.getLeft(heightMap, x, y, out nX, out nY); if (currentValue != null && currentValue < heightMap[x][y]) { currentValue = heightMap[x][y] - currentValue; currentVx = -(float)currentValue; currentVy = 0; vectors.Add(new Vector(currentVx, currentVy)); } currentValue = TerrainHelpers.getBottomLeft(heightMap, x, y, out nX, out nY); if (currentValue != null && currentValue < heightMap[x][y]) { currentValue = heightMap[x][y] - currentValue; currentValue = (float)Math.Cos(Math.PI / 4) * currentValue; currentVx = -(float)currentValue; currentVy = (float)currentValue; vectors.Add(new Vector(currentVx, currentVy)); } currentValue = TerrainHelpers.getTop(heightMap, x, y, out nX, out nY); if (currentValue != null && currentValue < heightMap[x][y]) { currentValue = heightMap[x][y] - currentValue; currentVx = 0; currentVy = -(float)currentValue; vectors.Add(new Vector(currentVx, currentVy)); } currentValue = TerrainHelpers.getBottom(heightMap, x, y, out nX, out nY); if (currentValue != null && currentValue < heightMap[x][y]) { currentValue = heightMap[x][y] - currentValue; currentVx = 0; currentVy = (float)currentValue; vectors.Add(new Vector(currentVx, currentVy)); } currentValue = TerrainHelpers.getTopRight(heightMap, x, y, out nX, out nY); if (currentValue != null && currentValue < heightMap[x][y]) { currentValue = heightMap[x][y] - currentValue; currentValue = (float)Math.Cos(Math.PI / 4) * currentValue; currentVx = (float)currentValue; currentVy = -(float)currentValue; vectors.Add(new Vector(currentVx, currentVy)); } currentValue = TerrainHelpers.getRight(heightMap, x, y, out nX, out nY); if (currentValue != null && currentValue < heightMap[x][y]) { currentValue = heightMap[x][y] - currentValue; currentVx = (float)currentValue; currentVy = 0; vectors.Add(new Vector(currentVx, currentVy)); } currentValue = TerrainHelpers.getBottomRight(heightMap, x, y, out nX, out nY); if (currentValue != null && currentValue < heightMap[x][y]) { currentValue = heightMap[x][y] - currentValue; currentValue = (float)Math.Cos(Math.PI / 4) * currentValue; currentVx = (float)currentValue; currentVy = (float)currentValue; vectors.Add(new Vector(currentVx, currentVy)); } currentValue = TerrainHelpers.getTopTopLeft(heightMap, x, y, out nX, out nY); if (currentValue != null && currentValue < heightMap[x][y]) { currentValue = heightMap[x][y] - currentValue; float larger = (float)(Math.Cos(Math.Atan(0.5)) * currentValue); float smaller = (float)(Math.Sin(Math.Atan(0.5)) * currentValue); currentVx = -smaller; currentVy = -larger; vectors.Add(new Vector(currentVx, currentVy)); } currentValue = TerrainHelpers.getLeftLeftTop(heightMap, x, y, out nX, out nY); if (currentValue != null && currentValue < heightMap[x][y]) { currentValue = heightMap[x][y] - currentValue; float larger = (float)(Math.Cos(Math.Atan(0.5)) * currentValue); float smaller = (float)(Math.Sin(Math.Atan(0.5)) * currentValue); currentVx = -larger; currentVy = -smaller; vectors.Add(new Vector(currentVx, currentVy)); } currentValue = TerrainHelpers.getTopTopRight(heightMap, x, y, out nX, out nY); if (currentValue != null && currentValue < heightMap[x][y]) { currentValue = heightMap[x][y] - currentValue; float larger = (float)(Math.Cos(Math.Atan(0.5)) * currentValue); float smaller = (float)(Math.Sin(Math.Atan(0.5)) * currentValue); currentVx = smaller; currentVy = -larger; vectors.Add(new Vector(currentVx, currentVy)); } currentValue = TerrainHelpers.getRightRightTop(heightMap, x, y, out nX, out nY); if (currentValue != null && currentValue < heightMap[x][y]) { currentValue = heightMap[x][y] - currentValue; float larger = (float)(Math.Cos(Math.Atan(0.5)) * currentValue); float smaller = (float)(Math.Sin(Math.Atan(0.5)) * currentValue); currentVx = larger; currentVy = -smaller; vectors.Add(new Vector(currentVx, currentVy)); } currentValue = TerrainHelpers.getRightRightBottom(heightMap, x, y, out nX, out nY); if (currentValue != null && currentValue < heightMap[x][y]) { currentValue = heightMap[x][y] - currentValue; float larger = (float)(Math.Cos(Math.Atan(0.5)) * currentValue); float smaller = (float)(Math.Sin(Math.Atan(0.5)) * currentValue); currentVx = larger; currentVy = smaller; vectors.Add(new Vector(currentVx, currentVy)); } currentValue = TerrainHelpers.getBottomBottomRight(heightMap, x, y, out nX, out nY); if (currentValue != null && currentValue < heightMap[x][y]) { currentValue = heightMap[x][y] - currentValue; float larger = (float)(Math.Cos(Math.Atan(0.5)) * currentValue); float smaller = (float)(Math.Sin(Math.Atan(0.5)) * currentValue); currentVx = smaller; currentVy = larger; vectors.Add(new Vector(currentVx, currentVy)); } currentValue = TerrainHelpers.getBottomBottomLeft(heightMap, x, y, out nX, out nY); if (currentValue != null && currentValue < heightMap[x][y]) { currentValue = heightMap[x][y] - currentValue; float larger = (float)(Math.Cos(Math.Atan(0.5)) * currentValue); float smaller = (float)(Math.Sin(Math.Atan(0.5)) * currentValue); currentVx = -smaller; currentVy = larger; vectors.Add(new Vector(currentVx, currentVy)); } currentValue = TerrainHelpers.getLeftLeftBottom(heightMap, x, y, out nX, out nY); if (currentValue != null && currentValue < heightMap[x][y]) { currentValue = heightMap[x][y] - currentValue; float larger = (float)(Math.Cos(Math.Atan(0.5)) * currentValue); float smaller = (float)(Math.Sin(Math.Atan(0.5)) * currentValue); currentVx = -larger; currentVy = smaller; vectors.Add(new Vector(currentVx, currentVy)); } Vector finalVector = new Vector(0, 0); foreach (Vector vector in vectors) { finalVector.Vx += vector.Vx; finalVector.Vy += vector.Vy; } finalVector.normalize(); return(finalVector); }