Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于柏林噪声阵列的图像生成方法_Java_Perlin Noise - Fatal编程技术网

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制作平铺贴图相同。完全相同的代码过程,除了一个是常规的,另一个不是。