Dwarrowdelf.TerrainGen.DiamondSquare.Render C# (CSharp) Method

Render() public static method

public static Render ( ArrayGrid2D grid, CornerData corners, double range, double h, Random random, double &min, double &max ) : void
grid ArrayGrid2D
corners CornerData
range double
h double
random System.Random
min double
max double
return void
        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;
        }

Usage Example

Example #1
0
        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));
                }
            });
        }