Plato on Github
Report Home
src/quietriot.js
Maintainability
50.27
Lines of code
112
Difficulty
128.43
Estimated Errors
2.07
Function weight
By Complexity
By SLOC
/*jshint bitwise:false */ /** * https://gist.github.com/304522 * Ported from Stefan Gustavson's java implementation * http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf * Read Stefan's excellent paper for details on how this code works. * * @author Sean McCullough banksean@gmail.com * * You can pass in a random number generator object if you like. * It is assumed to have a random() method. */ /** * @namespace */ var SimplexNoise = {}; SimplexNoise.grad3 = [[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]]; SimplexNoise.p = []; SimplexNoise.perm = []; // A lookup table to traverse the simplex around a given point in 4D. // Details can be found where this table is used, in the 4D noise method. SimplexNoise.simplex = [ [0,1,2,3],[0,1,3,2],[0,0,0,0],[0,2,3,1],[0,0,0,0],[0,0,0,0],[0,0,0,0],[1,2,3,0], [0,2,1,3],[0,0,0,0],[0,3,1,2],[0,3,2,1],[0,0,0,0],[0,0,0,0],[0,0,0,0],[1,3,2,0], [0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0], [1,2,0,3],[0,0,0,0],[1,3,0,2],[0,0,0,0],[0,0,0,0],[0,0,0,0],[2,3,0,1],[2,3,1,0], [1,0,2,3],[1,0,3,2],[0,0,0,0],[0,0,0,0],[0,0,0,0],[2,0,3,1],[0,0,0,0],[2,1,3,0], [0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0], [2,0,1,3],[0,0,0,0],[0,0,0,0],[0,0,0,0],[3,0,1,2],[3,0,2,1],[0,0,0,0],[3,1,2,0], [2,1,0,3],[0,0,0,0],[0,0,0,0],[0,0,0,0],[3,1,0,2],[0,0,0,0],[3,2,0,1],[3,2,1,0]]; SimplexNoise.config = function(r) { var i, p = SimplexNoise.p, perm = SimplexNoise.perm; if (typeof r === 'undefined') { r = Math; } for (i = 0; i < 256; i += 1) { SimplexNoise.p[i] = Math.floor(r.random() * 256); } // To remove the need for index wrapping, double the permutation table length for(i = 0; i < 512; i += 1) { perm[i] = p[i & 255]; } }; SimplexNoise.noise = function(xin, yin) { var grad3 = SimplexNoise.grad3; var p = SimplexNoise.p; var perm = SimplexNoise.perm; var simplex = SimplexNoise.simplex; if (!p.length) { SimplexNoise.config(); } var n0, n1, n2; // Noise contributions from the three corners // Skew the input space to determine which simplex cell we're in var F2 = 0.5 * (Math.sqrt(3.0) - 1.0); var s = (xin + yin) * F2; // Hairy factor for 2D var i = Math.floor(xin + s); var j = Math.floor(yin + s); var G2 = (3.0 -Math.sqrt(3.0)) / 6.0; var t = (i + j) * G2; var X0 = i - t; // Unskew the cell origin back to (x,y) space var Y0 = j - t; var x0 = xin - X0; // The x,y distances from the cell origin var y0 = yin - Y0; // For the 2D case, the simplex shape is an equilateral triangle. // Determine which simplex we are in. var i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords if (x0 > y0) { i1 = 1; j1 = 0; } // lower triangle, XY order: (0,0)->(1,0)->(1,1) else { i1 = 0; j1 = 1; } // upper triangle, YX order: (0,0)->(0,1)->(1,1) // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where // c = (3-sqrt(3))/6 var x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords var y1 = y0 - j1 + G2; var x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords var y2 = y0 - 1.0 + 2.0 * G2; // Work out the hashed gradient indices of the three simplex corners var ii = i & 255; var jj = j & 255; var gi0 = this.perm[ii + this.perm[jj]] % 12; var gi1 = this.perm[ii + i1 + this.perm[jj + j1]] % 12; var gi2 = this.perm[ii + 1 + this.perm[jj + 1]] % 12; // Calculate the contribution from the three corners var t0 = 0.5 - x0 * x0 - y0 * y0; if (t0 < 0) { n0 = 0.0; } else { t0 *= t0; n0 = t0 * t0 * this.dot(this.grad3[gi0], x0, y0); // (x,y) of grad3 used for 2D gradient } var t1 = 0.5 - x1 * x1 - y1 * y1; if (t1 < 0) { n1 = 0.0; } else { t1 *= t1; n1 = t1 * t1 * this.dot(this.grad3[gi1], x1, y1); } var t2 = 0.5 - x2 * x2 - y2 * y2; if (t2 < 0) { n2 = 0.0; } else { t2 *= t2; n2 = t2 * t2 * this.dot(this.grad3[gi2], x2, y2); } // Add contributions from each corner to get the final noise value. // The result is scaled to return values in the interval [-1,1]. return 70.0 * (n0 + n1 + n2); }; SimplexNoise.dot = function(g, x, y) { return g[0] * x + g[1] * y; }; module.exports = SimplexNoise;