var ARRAY8 = (typeof Uint8Array !== 'undefined') ? Uint8Array : Array; var Perlin = function () { this.F2 = 0.5 * (Math.sqrt(3.0) - 1.0); this.G2 = (3.0 - Math.sqrt(3.0)) / 6.0; var random = Math.random; this.p = new ARRAY8(256); this.perm = new ARRAY8(512); this.permMod12 = new ARRAY8(512); for (var i = 0; i < 256; i++) { this.p[i] = random() * 256; } for (i = 0; i < 512; i++) { this.perm[i] = this.p[i & 255]; this.permMod12[i] = this.perm[i] % 12; } } Perlin.prototype = { grad3: new Float32Array([1, 1, 0, -1, 1, 0, 1, -1, 0, -1, -1, 0, 1, 0, 1, -1, 0, 1, 1, 0, -1, -1, 0, -1, 0, 1, 1, 0, -1, 1, 0, 1, -1, 0, -1, -1]), noise: function (xin, yin) { var permMod12 = this.permMod12, perm = this.perm, grad3 = this.grad3; var n0=0, n1=0, n2=0; var s = (xin + yin) * this.F2; var i = Math.floor(xin + s); var j = Math.floor(yin + s); var t = (i + j) * this.G2; var X0 = i - t; var Y0 = j - t; var x0 = xin - X0; var y0 = yin - Y0; var i1, j1; if (x0 > y0) { i1 = 1; j1 = 0; } else { i1 = 0; j1 = 1; } var x1 = x0 - i1 + this.G2; var y1 = y0 - j1 + this.G2; var x2 = x0 - 1.0 + 2.0 * this.G2; var y2 = y0 - 1.0 + 2.0 * this.G2; var ii = i & 255; var jj = j & 255; var t0 = 0.5 - x0 * x0 - y0 * y0; if (t0 >= 0) { var gi0 = permMod12[ii + perm[jj]] * 3; t0 *= t0; n0 = t0 * t0 * (grad3[gi0] * x0 + grad3[gi0 + 1] * y0); } var t1 = 0.5 - x1 * x1 - y1 * y1; if (t1 >= 0) { var gi1 = permMod12[ii + i1 + perm[jj + j1]] * 3; t1 *= t1; n1 = t1 * t1 * (grad3[gi1] * x1 + grad3[gi1 + 1] * y1); } var t2 = 0.5 - x2 * x2 - y2 * y2; if (t2 >= 0) { var gi2 = permMod12[ii + 1 + perm[jj + 1]] * 3; t2 *= t2; n2 = t2 * t2 * (grad3[gi2] * x2 + grad3[gi2 + 1] * y2); } // The result is scaled to return values in the interval [-1,1]. return 70.0 * (n0 + n1 + n2); } }