예제 #1
0
        private static void CreateImage(NoiseConfig config, HeightmapLayer layer, WaterLayer waterLayer)
        {
            var bmp       = new Bitmap(config.Size, config.Size);
            var maxDepth  = waterLayer.Waterline - layer.MinHeight;
            var maxHeight = layer.MaxHeight - waterLayer.Waterline;

            for (var x = 0; x < config.Size; x++)
            {
                for (var y = 0; y < config.Size; y++)
                {
                    if (waterLayer.GetCell(x, y))
                    {
                        var depth = waterLayer.Waterline - layer.GetCell(x, y);
                        var g     = 255 - (byte)(255 * (depth / maxDepth));
                        var b     = 255 - (byte)(100 * (depth / maxDepth));
                        bmp.SetPixel(x, y, Color.FromArgb(0, g, b));
                    }
                    else
                    {
                        var height = layer.GetCell(x, y) - waterLayer.Waterline;
                        var b      = (byte)(50 * height / maxHeight);
                        var r      = (byte)(255 * height / maxHeight);
                        var g      = 175 - (byte)(50 * height / maxHeight);
                        bmp.SetPixel(x, y, Color.FromArgb(r, g, b));
                    }
                }
            }

            var codec    = GetEncoder(ImageFormat.Jpeg);
            var filename = "test.jpg";

            bmp.Save(filename, codec, GetEncoderParameters());
        }
    public HeightmapLayer generateLayer(int weight)
    {
        Random.InitState(seed);
        float[,] matrix = new float[xSize, ySize];
        float x0 = Random.value * 1000;
        float y0 = Random.value * 1000;

        for (int y = 0; y < ySize; y += frequency)
        {
            for (int x = 0; x < xSize; x += frequency)
            {
                float noise = Mathf.PerlinNoise(
                    (x0 + x * samplingScale),
                    (y0 + y * samplingScale)
                    );
                for (int yy = 0; yy < frequency; yy++)
                {
                    for (int xx = 0; xx < frequency; xx++)
                    {
                        matrix [x + xx, y + yy] = noise;
                    }
                }
            }
        }
        HeightmapLayer l = new HeightmapLayer(xSize, ySize, matrix, weight);

        return(l);
    }
예제 #3
0
        static void Main(string[] args)
        {
            //var dsConfig = new DiamondSquareConfig(12, 0.67f);
            var pnConfig1  = new NoiseConfig(2000, 0.7);
            var generator1 = new Noise(pnConfig1);
            var h1         = generator1.GenerateAsync();

            var pnConfig2  = new NoiseConfig(2000, 0.25);
            var generator2 = new Noise(pnConfig2);
            var h2         = generator2.GenerateAsync();

            var hlayer1     = new HeightmapLayer(h1.Result);
            var hlayer2     = new HeightmapLayer(h2.Result);
            var hlayerCells = HeightmapLayer.Overlay(hlayer1, hlayer2, new OverlayFloatSum());
            var hlayer      = new HeightmapLayer(
                HeightmapLayer.NormalizeHeights(
                    new HeightmapLayer(hlayerCells)));

            var stopWatch = new Stopwatch();

            stopWatch.Start();

            var m = new Map();

            m.AddLayer <HeightmapLayer, float>(hlayer);
            var waterLine  = WaterLayer.GetWaterlineFromPercentage(hlayer, 0.35f);
            var waterLayer = new WaterLayer(hlayer, waterLine);

            m.AddLayer <WaterLayer, bool>(waterLayer);

            CreateImage(pnConfig1, hlayer, waterLayer);

            stopWatch.Stop();
            Debug.WriteLine(stopWatch.Elapsed);
        }
예제 #4
0
        public void TestGetCell()
        {
            var heights = _heightsTask.GetAwaiter().GetResult();
            var layer   = new HeightmapLayer(heights);

            Assert.Equal(heights[0, 1], layer.GetCell(0, 1));
        }
예제 #5
0
    public void addLayer(HeightmapLayer newLayer, float lowerLimit, float upperLimit)
    {
        float newWeightRatio;
        float oldWeight;
        float newValue;

        if (totalWeight == 0)
        {
            oldWeight      = 0;
            newWeightRatio = newLayer.weight;
        }
        else
        {
            oldWeight      = 1;
            newWeightRatio = (float)newLayer.weight / (float)totalWeight;
        }
        for (int y = 0; y < ySize; y++)
        {
            for (int x = 0; x < xSize; x++)
            {
                newValue = (grid [x, y] + newLayer.layer[x, y] * newWeightRatio) / (oldWeight + newWeightRatio);
                if (newValue >= lowerLimit & newValue <= upperLimit)
                {
                    grid [x, y] = newValue;
                }
            }
        }
        totalWeight += newLayer.weight;
    }
예제 #6
0
        public void TestMaxHeight()
        {
            var heights = _heightsTask.GetAwaiter().GetResult();
            var layer   = new HeightmapLayer(heights);

            var maxHeight = layer.Select(h => h.Data).Concat(new[] { float.MinValue }).Max();

            Assert.Equal(maxHeight, layer.MaxHeight);
        }
예제 #7
0
    public HeightmapLayer generateLayer(int weight)
    {
        Random.InitState(seed);
        float x0 = Random.value * 10000;
        float y0 = Random.value * 10000;

        float[,] matrix = new float[xSize, ySize];
        Vector2[] points = new Vector2[numPoints];
        float[]   values = new float[numPoints];
        for (int i = 0; i < numPoints; i++)
        {
            points [i] = new Vector2(Random.Range(0, xSize - 1), Random.Range(0, ySize - 1));
            float v = Mathf.PerlinNoise(x0 + points [i].x / 128f * samplingScale, y0 + points [i].y / 128f * samplingScale);
            v          = Mathf.Min(v, 1f);
            v          = Mathf.Max(v, 0f);
            values [i] = v;
        }
        bool checkAcross;

        for (int y = 0; y < ySize; y++)
        {
            for (int x = 0; x < xSize; x++)
            {
                checkAcross = true;
                float minD         = xSize * ySize;
                float edgeDistance = Mathf.Min(x, xSize - x);
                int   closest      = -1;
                for (int i = 0; i < numPoints; i++)
                {
                    float d = wraparoundDistance(points [i], new Vector2(x, y), xSize, checkAcross);
                    if (d <= minD)
                    {
                        closest = i;
                        minD    = d;
                    }
                    if (d < edgeDistance)
                    {
                        checkAcross = false;
                    }
                }
                matrix [x, y] = values [closest];
            }
        }
        HeightmapLayer l = new HeightmapLayer(xSize, ySize, matrix, weight);

        return(l);
    }
예제 #8
0
        public void TestOverlay()
        {
            var pnConfig1  = new NoiseConfig(100, 0.7);
            var generator1 = new Noise(pnConfig1);
            var h1         = generator1.GenerateAsync();

            var pnConfig2  = new NoiseConfig(100, 0.25);
            var generator2 = new Noise(pnConfig2);
            var h2         = generator2.GenerateAsync();

            var hlayer1 = new HeightmapLayer(h1.Result);
            var hlayer2 = new HeightmapLayer(h2.Result);

            var hlayerCells = HeightmapLayer.Overlay(hlayer1, hlayer2, new OverlayFloatSum());
            var hlayer      = new HeightmapLayer(hlayerCells);

            Assert.Equal(h1.Result[50, 50] + hlayer2.GetCell(50, 50), hlayer.GetCell(50, 50));
        }
예제 #9
0
    public HeightmapLayer generateLayer(int weight)
    {
        float[,] matrix = new float[xSize, ySize];
        Random.InitState(seed);
        for (int y = 0; y < ySize; y += frequency)
        {
            for (int x = 0; x < xSize; x += frequency)
            {
                float noise = Random.value;
                for (int yy = 0; yy < frequency; yy++)
                {
                    for (int xx = 0; xx < frequency; xx++)
                    {
                        matrix [x + xx, y + yy] = noise;
                    }
                }
            }
        }
        HeightmapLayer l = new HeightmapLayer(xSize, ySize, matrix, weight);

        return(l);
    }
예제 #10
0
    public void addLayer(HeightmapLayer newLayer)
    {
        float newWeightRatio;
        float oldWeight;

        if (totalWeight == 0)
        {
            oldWeight      = 0;
            newWeightRatio = newLayer.weight;
        }
        else
        {
            oldWeight      = 1;
            newWeightRatio = (float)newLayer.weight / (float)totalWeight;
        }
        for (int y = 0; y < ySize; y++)
        {
            for (int x = 0; x < xSize; x++)
            {
                grid [x, y] = (grid [x, y] + newLayer.layer[x, y] * newWeightRatio) / (oldWeight + newWeightRatio);
            }
        }
        totalWeight += newLayer.weight;
    }