void GenerateHeightMap(DiamondSquare.CornerData corners, double range, double h, double amplify) { // +1 for diamond square var heightMap = new ArrayGrid2D <double>(m_size.Width + 1, m_size.Height + 1); double min, max; DiamondSquare.Render(heightMap, corners, range, h, m_random, out min, out max); Parallel.For(0, m_size.Height, y => { double d = max - min; for (int x = 0; x < m_size.Width; ++x) { var v = heightMap[x, y]; // normalize to 0.0 - 1.0 v = (v - min) / d; // amplify v = Math.Pow(v, amplify); // adjust v *= m_size.Depth / 2; v += m_size.Depth / 2 - 1; m_data.SetSurfaceLevel(x, y, MyMath.Round(v)); } }); }
public static void Render(ArrayGrid2D <double> grid, CornerData corners, double range, double h, Random random, out double min, out double max) { if (grid.Width != grid.Height) { throw new Exception(); } var ctx = new Context() { Random = random, Grid = grid, Corners = corners, Range = range, H = h, Min = Math.Min(Math.Min(Math.Min(corners.SW, corners.SE), corners.NE), corners.NW), Max = Math.Max(Math.Max(Math.Max(corners.SW, corners.SE), corners.NE), corners.NW), }; grid[0, 0] = corners.SW; grid[grid.Width - 1, 0] = corners.SE; grid[grid.Width - 1, grid.Height - 1] = corners.NE; grid[0, grid.Height - 1] = corners.NW; HeightMap(ctx); min = ctx.Min; max = ctx.Max; }
public static void Render(ArrayGrid2D<double> grid, CornerData corners, double range, double h, int randomSeed, out double min, out double max) { if (grid.Width != grid.Height) throw new Exception(); var ctx = new Context() { Random = new Random(randomSeed), Grid = grid, Corners = corners, Range = range, H = h, Min = Math.Min(Math.Min(Math.Min(corners.SW, corners.SE), corners.NE), corners.NW), Max = Math.Max(Math.Max(Math.Max(corners.SW, corners.SE), corners.NE), corners.NW), }; grid[0, 0] = corners.SW; grid[grid.Width - 1, 0] = corners.SE; grid[grid.Width - 1, grid.Height - 1] = corners.NE; grid[0, grid.Height - 1] = corners.NW; HeightMap(ctx); min = ctx.Min; max = ctx.Max; }
public static void Clamp(ArrayGrid2D <double> grid, double average) { grid.ForEach(v => { if (v < average) { double d = average - v; v = average - Math.Pow(d, 1.0 / 20); } return(v); }); }
public static void MinMax(ArrayGrid2D<double> grid, out double min, out double max) { max = Double.MinValue; min = Double.MaxValue; foreach (var v in grid) { if (v < min) min = v; if (v > max) max = v; } }
public static void Clamp(ArrayGrid2D<double> grid, double average) { grid.ForEach(v => { if (v < average) { double d = average - v; v = average - Math.Pow(d, 1.0 / 20); } return v; }); }
public static void Normalize(ArrayGrid2D <double> grid) { double min, max; MinMax(grid, out min, out max); double d = max - min; grid.ForEach(v => { v -= min; v /= d; return(v); }); }
public static void Normalize(ArrayGrid2D<double> grid) { double min, max; MinMax(grid, out min, out max); double d = max - min; grid.ForEach(v => { v -= min; v /= d; return v; }); }
public static void MinMax(ArrayGrid2D <double> grid, out double min, out double max) { max = Double.MinValue; min = Double.MaxValue; foreach (var v in grid) { if (v < min) { min = v; } if (v > max) { max = v; } } }
void GenerateTerrain(DiamondSquare.CornerData corners, double range, double h, int seed, double amplify) { // +1 for diamond square var doubleHeightMap = new ArrayGrid2D<double>(m_size.Width + 1, m_size.Height + 1); double min, max; DiamondSquare.Render(doubleHeightMap, corners, range, h, seed, out min, out max); var heightMap = m_data.HeightMap; Parallel.For(0, m_size.Height, y => { double d = max - min; for (int x = 0; x < m_size.Width; ++x) { var v = doubleHeightMap[x, y]; // normalize to 0.0 - 1.0 v = (v - min) / d; // amplify v = Math.Pow(v, amplify); // adjust v *= m_size.Depth / 2; v += m_size.Depth / 2 - 1; heightMap[y, x] = (byte)Math.Round(v); } }); }
void GenerateHeightMap(DiamondSquare.CornerData corners, double range, double h, double amplify) { // +1 for diamond square var heightMap = new ArrayGrid2D<double>(m_size.Width + 1, m_size.Height + 1); double min, max; DiamondSquare.Render(heightMap, corners, range, h, m_random, out min, out max); Parallel.For(0, m_size.Height, y => { double d = max - min; for (int x = 0; x < m_size.Width; ++x) { var v = heightMap[x, y]; // normalize to 0.0 - 1.0 v = (v - min) / d; // amplify v = Math.Pow(v, amplify); // adjust v *= m_size.Depth / 2; v += m_size.Depth / 2 - 1; m_data.SetSurfaceLevel(x, y, MyMath.Round(v)); } }); }