首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perlin noise -我做错了什么?

Perlin noise -我做错了什么?
EN

Stack Overflow用户
提问于 2013-07-18 18:36:54
回答 1查看 176关注 0票数 1

我刚刚开始学习world generation,我一直在到处寻找perlin noise上的教程,但遗憾的是,在谷歌上找不到太多。前几天,我学习了一个教程,但我的代码无法正常工作。

这是我的Java方法。

代码语言:javascript
复制
private static double[][] createNoise(int xn, int yn, int sps) {
    int m = yn * sps;
    int n = xn * sps;
    double[][] u = new double[yn + 1][];
    double[][] v = new double[yn + 1][];

    double[][] x = new double[m][];
    double[][] y = new double[m][];
    double[][] z = new double[m][];

    for (int i = 0; i < m; i++) {
        x[i] = new double[n];
        y[i] = new double[n];
        z[i] = new double[n];
    }
    for (int i = 0; i < yn + 1; i++) {
        u[i] = new double[xn + 1];
        v[i] = new double[xn + 1];
    }

    for (int i = 0; i < xn + 1; i++) {
        for (int j = 0; j < yn + 1; j++) {
            u[i][j] = nextRandom();
            v[i][j] = nextRandom();
        }
    }
    double hx = xn / (n - 1);
    double hy = yn / (m - 1);
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            x[i][j] = hx * j;
            y[i][j] = hy * i;
        }
    }

    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            int xc = (int)x[i][j];
            int yc = (int)y[i][j];

            if (x[i][j] % 1 == 0 && x[i][j] != 0 ) xc = xc - 1;
            if (y[i][j] % 1 == 0 && y[i][j] != 0 ) yc = yc - 1;

            double xr = x[i][j] - xc;
            double yr = y[i][j] - yc;
            double s11[] = {-xr, -yr};
            double s21[] = {-xr, 1 - yr};
            double s22[] = {1 - xr, 1 - yr};
            double s12[] = {1 - xr, -yr};

            double q11 = s11[0] * u[yc][xc] + s11[1] * v[yc][xc];
            double q21 = s21[0] * u[yc + 1][xc] + s21[1] * v[yc + 1][xc];
            double q22 = s22[0] * u[yc + 1][xc + 1] + s22[1] * v[yc + 1][xc + 1];
            double q12 = s12[0] * u[yc][xc + 1] + s12[1] * v[yc][xc + 1];

            z[i][j] = lerp(x[i][j], y[i][j], xc, xc + 1, yc, yc + 1, q11, q12, q21, q22);
        }
    }

    return z;
}

令人遗憾的是,该方法返回的高度图如下所示

如您所见,第一行/第一列正常工作,但之后算法似乎失败了。我确保了这个方法

代码语言:javascript
复制
nextRandom();

返回一个介于-1和1之间的浮点值。

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-18 19:02:47

感谢用户@gawi指出这一点。

代码语言:javascript
复制
hx = xn / (n - 1);

将除以2个整数,并且很可能返回0。您可以通过对其进行双精度转换来修复此问题:

代码语言:javascript
复制
double hx = (double)xn / (n - 1);

,那么地图就可以工作了!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17721135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档