首次尝试裸露的骨头perlin噪音

时间:2018-03-01 18:42:24

标签: java algorithm perlin-noise

我一直试图理解噪音很长一段时间,我想我终于找到了一个可以向我解释的地方。我已经看了很长时间的复杂算法,所以我决定对噪音的形成进行简单的英语解释。

http://flafla2.github.io/2014/08/09/perlinnoise.html

https://www.youtube.com/watch?v=MJ3bvCkHJtE

这是我使用过的两个来源。

我的问题是,噪声似乎只是我给出的两个点之间的插值(当两个点都在一个点之下时),当点数高于一时,数字很快就会增长到数万亿。

我的输入是,(。95,02)或(10.38,39.04)

我试图实现一个非常基本的版本,所以很容易理解。这是我的代码:

package perlinNoise;

public class Perlin {
    int grads[][] = {{1,0},{0,1},{-1,0},{0,-1},{1,1},{-1,1},{1,-1},{-1,-1}};
    public double perlin (double x, double y) {
        int unitX = (int)x & 255; // decide unit square
        int unitY = (int)y & 255; // decide unit square

        double relX = x-Math.floor(x); // relative x position
        double relY = y-Math.floor(y); // relative y position

        // bad pseudorandom gradient
        int[] gradTL = grads[(unitX+unitY)%8];
        int[] gradTR = grads[((unitX+1)+unitY)%8];
        int[] gradBL = grads[(unitX+(unitY+1))%8];
        int[] gradBR = grads[((unitX+1)+(unitY+1))%8];

        // distance from edges to point, relative x and y inside the unit square
        double[] vecTL = {relX,relY};
        double[] vecTR = {1-relX,relY};
        double[] vecBL = {relX,1-relY};
        double[] vecBR = {1-relX,1-relY};

        double tl = dot(gradTL,vecTL);
        double tr = dot(gradTR,vecTR);
        double bl = dot(gradBL,vecBL);
        double br = dot(gradBR,vecBR);

        double u = fade(relX);
        double v = fade(relY);

        double x1 = lerp(tl,tr, u);
        double y1 = lerp(bl,br, u);

        return lerp(x1,y1, v);
    }

    public double dot(int[] grad, double[] dist) {
        return (grad[0]*dist[0] + grad[1]*dist[1]);
    }

    public double lerp(double start, double end, double rate){
         return start+rate*(end-start);
    }
    public double fade(double t) {
        return t*t*t*(t*(t*6-15)+10);
    }
}

如果有经验丰富的人可以提供一些建议,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

您获得巨大数字值的原因> 1是由于您的export class ButcherShop extends React.Component {功能:

fade

我不完全确定你打算它与值有关> 1,但正如所写,它为值0到10提供以下内容:

public double fade(double t) {
        return t*t*t*(t*(t*6-15)+10);
}