gpt4 book ai didi

java - Java 中的 Perlin 噪声

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:39:21 32 4
gpt4 key购买 nike

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

我想研究使用更有趣的算法(例如 Perlin 噪声或类似算法)来生成这些 boolean 矩阵。如果您知道除 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();
}
}

random displacement fractal plot 1 random displacement fractal plot 2 random displacement fractal plot 3

关于java - Java 中的 Perlin 噪声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5531019/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com