0

I'm trying to begin learning to use Perlin Noise to create a tile map. I'm just beginning so I found some source code online to create an array based on Perlin Noise. So I have an array of good data right now (as far as I know) but I don't understand what kinds of methods can be used to convert this from an array into a tile map.

Does anybody have any examples or sources of any methods to do this?

Here is the code I'm using the generate the array.

package perlin1;

import java.util.Random;

public class ImageWriter {
/** Source of entropy */
private Random rand_;

/** Amount of roughness */
float roughness_;

/** Plasma fractal grid */
private float[][] grid_;


/** Generate a noise source based upon the midpoint displacement fractal.
 * 
 * @param rand The random number generator
 * @param roughness a roughness parameter
 * @param width the width of the grid
 * @param height the height of the grid
 */
public ImageWriter(Random rand, float roughness, int width, int height) {
    roughness_ = roughness / width;
    grid_ = new float[width][height];
    rand_ = (rand == null) ? new Random() : rand;
}


public void initialise() {
    int xh = grid_.length - 1;
    int yh = grid_[0].length - 1;

    // set the corner points
    grid_[0][0] = rand_.nextFloat() - 0.5f;
    grid_[0][yh] = rand_.nextFloat() - 0.5f;
    grid_[xh][0] = rand_.nextFloat() - 0.5f;
    grid_[xh][yh] = rand_.nextFloat() - 0.5f;

    // generate the fractal
    generate(0, 0, xh, yh);
}


// Add a suitable amount of random displacement to a point
private float roughen(float v, int l, int h) {
    return v + roughness_ * (float) (rand_.nextGaussian() * (h - l));
}


// generate the fractal
private void generate(int xl, int yl, int xh, int yh) {
    int xm = (xl + xh) / 2;
    int ym = (yl + yh) / 2;
    if ((xl == xm) && (yl == ym)) return;

    grid_[xm][yl] = 0.5f * (grid_[xl][yl] + grid_[xh][yl]);
    grid_[xm][yh] = 0.5f * (grid_[xl][yh] + grid_[xh][yh]);
    grid_[xl][ym] = 0.5f * (grid_[xl][yl] + grid_[xl][yh]);
    grid_[xh][ym] = 0.5f * (grid_[xh][yl] + grid_[xh][yh]);

    float v = roughen(0.5f * (grid_[xm][yl] + grid_[xm][yh]), xl + yl, yh
            + xh);
    grid_[xm][ym] = v;
    grid_[xm][yl] = roughen(grid_[xm][yl], xl, xh);
    grid_[xm][yh] = roughen(grid_[xm][yh], xl, xh);
    grid_[xl][ym] = roughen(grid_[xl][ym], yl, yh);
    grid_[xh][ym] = roughen(grid_[xh][ym], yl, yh);

    generate(xl, yl, xm, ym);
    generate(xm, yl, xh, ym);
    generate(xl, ym, xm, yh);
    generate(xm, ym, xh, yh);
}


/**
 * Dump out as a CSV
 */
public void printAsCSV() {
    for(int i = 0;i < grid_.length;i++) {
        for(int j = 0;j < grid_[0].length;j++) {
            System.out.print(grid_[i][j]);
            System.out.print(",");
        }
        System.out.println();
    }
}


/**
 * Convert to a Boolean array
 * @return the boolean array
 */
public boolean[][] toBooleans() {
    int w = grid_.length;
    int h = grid_[0].length;
    boolean[][] ret = new boolean[w][h];
    for(int i = 0;i < w;i++) {
        for(int j = 0;j < h;j++) {
            ret[i][j] = grid_[i][j] < 0;
        }
    }
    return ret;
}


/** For testing */
public static void main(String[] args) {
    ImageWriter n = new ImageWriter(null, 1.0f, 250, 250);
    n.initialise();
    n.printAsCSV();
   }
}

The resulting array is all amounts between 0 and 1.

Again, I'm just looking for how this array can be converted into a tile map. Any help is appreciated. Thanks

Corey
  • 152
  • 1
  • 3
  • 11
  • That all depends on what you're trying to create a tilemap of. Ultimately you need to assign each output value to some kind of tile. A good start if to plot the image to greyscale. It will look like hills. It makes sense to assign low numbers to water tiles, medium numbers to grass, higher numbers to mountainous and higher still to ice – Richard Tingle Sep 16 '13 at 14:07
  • sounds like you are making it overly complicated. Perlin noise is the same as a sine wave function except it s irregular, if you can make the tile map with sinewave X multiply by sinewave Z, it is the same as making a tile map with 2-D Perlin. Exactly the same code procedure except one is regular and the other isn# t. – bandybabboon Nov 04 '13 at 21:36

0 Answers0