Java 基于柏林噪声阵列的图像生成方法
我正在尝试开始学习使用柏林噪波创建一个平铺贴图。我刚刚开始,所以我在网上找到了一些源代码来创建基于柏林噪声的数组。所以我现在有一个很好的数据数组(据我所知),但我不知道什么样的方法可以用来将它从数组转换成平铺贴图 有没有人有这样做的任何方法的例子或来源 下面是我正在使用的生成数组的代码Java 基于柏林噪声阵列的图像生成方法,java,perlin-noise,Java,Perlin Noise,我正在尝试开始学习使用柏林噪波创建一个平铺贴图。我刚刚开始,所以我在网上找到了一些源代码来创建基于柏林噪声的数组。所以我现在有一个很好的数据数组(据我所知),但我不知道什么样的方法可以用来将它从数组转换成平铺贴图 有没有人有这样做的任何方法的例子或来源 下面是我正在使用的生成数组的代码 package perlin1; import java.util.Random; public class ImageWriter { /** Source of entropy */ private Ra
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();
}
}
packageperlin1;
导入java.util.Random;
公共类图像编写器{
/**熵源*/
私有随机随机随机数;
/**粗糙度*/
浮子粗糙度;
/**等离子体分形网格*/
私有浮动[][]网格;
/**基于中点位移分形生成噪波源。
*
*@param rand随机数生成器
*@param粗糙度粗糙度参数
*@param width网格的宽度
*@param height网格的高度
*/
公共ImageWriter(随机rand、浮动粗糙度、整型宽度、整型高度){
粗糙度=粗糙度/宽度;
网格=新浮动[宽度][高度];
rand=(rand==null)?new Random():rand;
}
公开无效初始化(){
int xh=网格长度-1;
int yh=网格[0]。长度-1;
//设置角点
grid_u[0][0]=rand_u0.nextFloat()-0.5f;
grid_u[0][yh]=rand_u0.nextFloat()-0.5f;
grid_uxh[0]=rand_xh.nextFloat()-0.5f;
grid_uxh][yh]=rand_xh.nextFloat()-0.5f;
//生成分形
生成(0,0,xh,yh);
}
//向点添加适当数量的随机位移
专用浮子粗化(浮子v、内部l、内部h){
返回v+粗糙度*(浮动)(rand.nextGaussian()*(h-l));
}
//生成分形
私有void生成(int-xl、int-yl、int-xh、int-yh){
int xm=(xl+xh)/2;
int-ym=(yl+yh)/2;
if((xl==xm)和&(yl==ym))返回;
网格_xm][yl]=0.5f*(网格_xl][yl]+网格_xh][yl]);
网格_xm][yh]=0.5f*(网格_xl][yh]+网格_xh][yh]);
网格_xl[ym]=0.5f*(网格_xl[yl]+网格_xl[yh]);
网格_xh][ym]=0.5f*(网格_xh][yl]+网格_xh][yh]);
浮点数v=粗化(0.5f*(网格[xm][yl]+网格[xm][yh]),xl+yl,yh
+xh);
网格_uxm][ym]=v;
网格_xm][yl]=粗化(网格_xm][yl],xl,xh);
网格_xm][yh]=粗化(网格_xm][yh],xl,xh);
网格[xl][ym]=粗化(网格[xl][ym],yl,yh);
网格(grid)[xh][ym]=粗化(网格(grid)[xh][ym],yl,yh);
生成(xl、yl、xm、ym);
生成(xm,yl,xh,ym);
生成(xl、ym、xm、yh);
生成(xm、ym、xh、yh);
}
/**
*作为CSV转储
*/
public void printAsCSV(){
对于(int i=0;i<网格长度;i++){
对于(int j=0;j
结果数组是0到1之间的所有数量
同样,我只是想了解如何将这个数组转换为平铺贴图。
感谢您的帮助。谢谢这取决于您试图创建的瓷砖贴图。最终,您需要将每个输出值分配给某种平铺。如果要将图像打印为灰度,这是一个良好的开端。它看起来像山。将低数字分配给水砖是有意义的,将中等数字分配给草地是有意义的,将高数字分配给山地是有意义的,将更高的数字分配给冰层是有意义的。听起来,你把它变得过于复杂了。Perlin噪波与正弦波函数相同,只是它不规则。如果可以使用正弦波X乘以正弦波Z制作平铺贴图,则与使用二维Perlin制作平铺贴图相同。完全相同的代码过程,除了一个是常规的,另一个不是。