public void DownhillFlowIsCorrect() { Tile[,] tileArray = world.getTileArray(); for (int x = 0; x < WORLDX; x++) { for (int z = 0; z < WORLDZ; z++) { Direction.CardinalDirections direction = tileArray[x, z].rivers.flowDirection; Coordinates myPosition = new Coordinates(x, z); if (!direction.Equals(Direction.CardinalDirections.none)) { Coordinates downhill = myPosition.findCoordinatesInCardinalDirection(direction); Assert.Less(tileArray[downhill.x, downhill.z].terrain.elevation, tileArray[x, z].terrain.elevation, "Cell: " + myPosition + " - downhill: " + downhill); } else { List <Direction.CardinalDirections> around = myPosition.getCardinalDirectionsAround(); foreach (Direction.CardinalDirections dir in around) { Coordinates coor = myPosition.findCoordinatesInCardinalDirection(dir); Assert.LessOrEqual(tileArray[x, z].terrain.elevation, tileArray[coor.x, coor.z].terrain.elevation, "Cell: " + myPosition + " - downhill: " + dir); } } } } }
private Direction.CardinalDirections[,] calculateDownStreams(double[,] elevations, out double[,] flowRates) { Direction.CardinalDirections[,] downstreams = new Direction.CardinalDirections[this.x, this.z]; flowRates = new double[this.x, this.z]; for (int x = 0; x < this.x; x++) { for (int z = 0; z < this.z; z++) { Coordinates myPosition = new Coordinates(x, z); List <Direction.CardinalDirections> directionsAround = myPosition.getCardinalDirectionsAround(); double lowest = elevations[x, z]; Direction.CardinalDirections flowTo = Direction.CardinalDirections.none; foreach (Direction.CardinalDirections direction in directionsAround) { Coordinates coor = myPosition.findCoordinatesInCardinalDirection(direction); if (elevations[coor.x, coor.z] < lowest) { lowest = elevations[coor.x, coor.z]; flowTo = direction; } } downstreams[x, z] = flowTo; flowRates[x, z] = Math.Round((elevations[x, z] - lowest) * FLOW_RATE_MULT, ROUND_TO); } } return(downstreams); }
public Coordinates findCoordinatesInCardinalDirection(Direction.CardinalDirections direction) { switch (direction) { case Direction.CardinalDirections.up: return(new Coordinates(x, z - 1)); case Direction.CardinalDirections.down: return(new Coordinates(x, z + 1)); case Direction.CardinalDirections.left: return(new Coordinates(x - 1, z)); case Direction.CardinalDirections.right: return(new Coordinates(x + 1, z)); } throw new Exception("Invalid Direction supplied!"); }
public Rivers(Direction.CardinalDirections flowDirection, List <Direction.CardinalDirections> upstreamDirections, double flowRate) { this.flowDirection = flowDirection; this.upstreamDirections = upstreamDirections; this.flowRate = flowRate; }