Beispiel #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));
                }
            });
        }
Beispiel #2
0
        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;
        }
Beispiel #3
0
        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;
        }
Beispiel #4
0
        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);
            });
        }
Beispiel #5
0
        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;
            }
        }
Beispiel #6
0
        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;
            });
        }
Beispiel #7
0
        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);
            });
        }
Beispiel #8
0
        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;
            });
        }
Beispiel #9
0
        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;
                }
            }
        }
Beispiel #10
0
        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);
                    }
                });
        }
Beispiel #11
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));
                    }
                });
        }