Diamond square algorithm

后端 未结 4 1571
栀梦
栀梦 2020-12-04 12:44

I\'m trying to write the Diamond-Square algorithm in Java to generate a random map but can\'t figure out the implementation...

Anyone with some Java code (or other l

4条回答
  •  无人及你
    2020-12-04 13:32

    For anyone looking, here is the algorithm provided by M. Jessup wrapped in a class that takes in a seed (to allow reproducing the results), a value for n to specify dimensions (dimensions are 2^n + 1), and exposes the results as a normalised array of floats. It also has the fix for the second part of the algorithm applied.

    import java.util.Random;
    
    public class DiamondSquare {
    
    public float[][] data;
    public int width;
    public int height;
    
    public DiamondSquare(long mseed, int n) {
        //size of grid to generate, note this must be a
        //value 2^n+1
        int DATA_SIZE = (1 << n) + 1;
        width = DATA_SIZE;
        height = DATA_SIZE;
        //an initial seed value for the corners of the data
        final float SEED = 1000.0f;
        data = new float[DATA_SIZE][DATA_SIZE];
        //seed the data
        data[0][0] = data[0][DATA_SIZE-1] = data[DATA_SIZE-1][0] = 
                data[DATA_SIZE-1][DATA_SIZE-1] = SEED;
    
        float valmin = Float.MAX_VALUE;
        float valmax = Float.MIN_VALUE;
    
        float h = 500.0f;//the range (-h -> +h) for the average offset
        Random r = new Random(mseed);//for the new value in range of h
        //side length is distance of a single square side
        //or distance of diagonal in diamond
        for(int sideLength = DATA_SIZE-1;
                //side length must be >= 2 so we always have
                //a new value (if its 1 we overwrite existing values
                //on the last iteration)
                sideLength >= 2;
                //each iteration we are looking at smaller squares
                //diamonds, and we decrease the variation of the offset
                sideLength /=2, h/= 2.0){
            //half the length of the side of a square
            //or distance from diamond center to one corner
            //(just to make calcs below a little clearer)
            int halfSide = sideLength/2;
    
            //generate the new square values
            for(int x=0;x

提交回复
热议问题