Java中的Perlin Noise

对于我正在研究的元胞自动机项目,我需要使用不同的算法和技术随机生成二维布尔数组。 目前我在应用程序中只有一种随机化 – 循环遍历数组中的每个单元格并生成随机双变量,然后如果随机数高于0.5,那么我将该单元格设置为true,否则它将被设置为为假。

我想研究使用更有趣的算法生成这些布尔矩阵,例如Perlin Noise或类似的东西。 如果你知道除了Perlin Noise之外的其他任何东西,那么在地形生成中使用的噪声发生器或类似的东西可能会很好(Minecraft的世界一代给了我这个想法)。

唯一的问题是我不知道从哪里开始(任何想法?):)

我想到的第一件事是随机位移分形。 它也用于生成地形,比Perlin Noise更容易。

package so; import java.util.Random; public class Noise { /** 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 Noise(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) { Noise n = new Noise(null, 1.0f, 250, 250); n.initialise(); n.printAsCSV(); } } 

随机位移分形图1随机位移分形图2随机位移分形图3

我的库代码中有一些perlin噪声实现和一些其他噪声生成函数:

http://code.google.com/p/mikeralib/source/browse/#svn%2Ftrunk%2FMikera%2Fsrc%2Fmain%2Fjava%2Fmikera%2Fmath

随意探索/使用(代码是开源GPL,基于J3D代码)。