The usage example is at the top of the code. Enjoy.
You can also view the code in its updated state here:
http://vylocity.com/ide/QuaintShanty/Libraries/
/*
// File: Perlin
// Author: Kristopher A. (Quaint Shanty)
// Description: Simplex and Perlin Noise generator
*/
/*
* A speed-improved perlin and simplex noise algorithms for 2D.
*
* Based on example code by Stefan Gustavson (stegu@itn.liu.se).
* Optimisations by Peter Eastman (peastman@drizzle.stanford.edu).
* Better rank ordering method by Stefan Gustavson in 2012.
* Converted to Javascript by Joseph Gentle and converted to vyScript by Kristopher Ali
*
* Version 2012-03-09
*
* This code was placed in the public domain by its original author,
* Stefan Gustavson. You may use it as you see fit, but
* attribution is appreciated.
*
*/
/// Usage:
/// var p = new Diob('Perlin')
/// p.seed(Math.random())
/// for(var x = 0; x < MAP_WIDTH; x++)
/// for(var y = 0; y < MAP_HEIGHT; y++)
/// var value = p.simplex(x / 100, y / 100) // or p.perlin(...)
Perlin
onNew()
this.perm[511] = null//new Array(512)
this.gradP[511] = null//new Array(512)
var noise = {}
function grad(g, x, y)
g.x = x
g.y = y
function getGrad(g, x, y)
return g.x*x + g.y*y
var grads = [
{'x': -1, 'y': 1}, {'x': 0, 'y': 1}, {'x': 1, 'y': 1},
{'x': -1, 'y': 0}, {'x': 0, 'y': 0}, {'x': 1, 'y': 0},
{'x': -1, 'y': -1}, {'x': 0, 'y': -1}, {'x': 1, 'y': -1}
]
var p = [151,160,137,91,90,15,
131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180]
var perm = []
var gradP = []
function seed(val)
if(val > 0 && val < 1)
val *= 65536
val = Math.floor(val)
if(val < 256)
val |= val << 8
for(var i = 0; i < 256; i++)
if(i & 1)
v = this.p[i]^(val & 255)
else
v = this.p[i]^((val >> 8) & 255)
this.perm[i] = this.perm[i + 256] = v
this.gradP[i] = this.gradP[i + 256] = this.grads[v % 9]
var F2 = 0.36602540378443864676372317075294
var G2 = 0.21132486540518711774542560974902
var F3 = 0.33333333333333333333333333333333
var G3 = 0.16666666666666666666666666666667
function simplex(xin, yin)
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 = xin-i+t
var y0 = yin-j+t
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 + 2 * this.G2
var y2 = y0 - 1 + 2 * this.G2
i &= 255
j &= 255
var gi0 = this.gradP[i+this.perm[j]]
var gi1 = this.gradP[i+i1+this.perm[j+j1]]
var gi2 = this.gradP[i+1+this.perm[j+1]]
var t0 = 0.5 - x0*x0-y0*y0
if(t0<0)
n0 = 0
else
t0 *= t0
n0 = t0 * t0 * this.getGrad(gi0, x0, y0)
var t1 = 0.5 - x1*x1-y1*y1
if(t1<0)
n1 = 0
else
t1 *= t1
n1 = t1 * t1 * this.getGrad(gi1, x1, y1)
var t2 = 0.5 - x2*x2-y2*y2
if(t2<0)
n2 = 0
else
t2 *= t2
n2 = t2 * t2 * this.getGrad(gi2, x2, y2)
return 70 * (n0 + n1 + n2)
function fade(t)
return t*t*t*(t*(t*6-15)+10)
function lerp(a, b, t)
return (1-t)*a + t*b
function perlin(x, y)
var X = Math.floor(x)
var Y = Math.floor(y)
x = x - X
y = y - Y
X = X & 255
Y = Y & 255
var n00 = this.getGrad(this.gradP[X+this.perm[Y]], x, y)
var n01 = this.getGrad(this.gradP[X+this.perm[Y+1]], x, y-1)
var n10 = this.getGrad(this.gradP[X+1+this.perm[Y]], x-1, y)
var n11 = this.getGrad(this.gradP[X+1+this.perm[Y+1]], x-1, y-1)
var u = fade(x)
return this.lerp(this.lerp(n00, n10, u), this.lerp(n01, n11, u), this.fade(y))
You can also view the code in its updated state here: http://vylocity.com/ide/QuaintShanty/Libraries/
/* // File: Perlin // Author: Kristopher A. (Quaint Shanty) // Description: Simplex and Perlin Noise generator */ /* * A speed-improved perlin and simplex noise algorithms for 2D. * * Based on example code by Stefan Gustavson (stegu@itn.liu.se). * Optimisations by Peter Eastman (peastman@drizzle.stanford.edu). * Better rank ordering method by Stefan Gustavson in 2012. * Converted to Javascript by Joseph Gentle and converted to vyScript by Kristopher Ali * * Version 2012-03-09 * * This code was placed in the public domain by its original author, * Stefan Gustavson. You may use it as you see fit, but * attribution is appreciated. * */ /// Usage: /// var p = new Diob('Perlin') /// p.seed(Math.random()) /// for(var x = 0; x < MAP_WIDTH; x++) /// for(var y = 0; y < MAP_HEIGHT; y++) /// var value = p.simplex(x / 100, y / 100) // or p.perlin(...) Perlin onNew() this.perm[511] = null//new Array(512) this.gradP[511] = null//new Array(512) var noise = {} function grad(g, x, y) g.x = x g.y = y function getGrad(g, x, y) return g.x*x + g.y*y var grads = [ {'x': -1, 'y': 1}, {'x': 0, 'y': 1}, {'x': 1, 'y': 1}, {'x': -1, 'y': 0}, {'x': 0, 'y': 0}, {'x': 1, 'y': 0}, {'x': -1, 'y': -1}, {'x': 0, 'y': -1}, {'x': 1, 'y': -1} ] var p = [151,160,137,91,90,15, 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166, 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196, 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123, 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9, 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228, 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107, 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254, 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180] var perm = [] var gradP = [] function seed(val) if(val > 0 && val < 1) val *= 65536 val = Math.floor(val) if(val < 256) val |= val << 8 for(var i = 0; i < 256; i++) if(i & 1) v = this.p[i]^(val & 255) else v = this.p[i]^((val >> 8) & 255) this.perm[i] = this.perm[i + 256] = v this.gradP[i] = this.gradP[i + 256] = this.grads[v % 9] var F2 = 0.36602540378443864676372317075294 var G2 = 0.21132486540518711774542560974902 var F3 = 0.33333333333333333333333333333333 var G3 = 0.16666666666666666666666666666667 function simplex(xin, yin) 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 = xin-i+t var y0 = yin-j+t 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 + 2 * this.G2 var y2 = y0 - 1 + 2 * this.G2 i &= 255 j &= 255 var gi0 = this.gradP[i+this.perm[j]] var gi1 = this.gradP[i+i1+this.perm[j+j1]] var gi2 = this.gradP[i+1+this.perm[j+1]] var t0 = 0.5 - x0*x0-y0*y0 if(t0<0) n0 = 0 else t0 *= t0 n0 = t0 * t0 * this.getGrad(gi0, x0, y0) var t1 = 0.5 - x1*x1-y1*y1 if(t1<0) n1 = 0 else t1 *= t1 n1 = t1 * t1 * this.getGrad(gi1, x1, y1) var t2 = 0.5 - x2*x2-y2*y2 if(t2<0) n2 = 0 else t2 *= t2 n2 = t2 * t2 * this.getGrad(gi2, x2, y2) return 70 * (n0 + n1 + n2) function fade(t) return t*t*t*(t*(t*6-15)+10) function lerp(a, b, t) return (1-t)*a + t*b function perlin(x, y) var X = Math.floor(x) var Y = Math.floor(y) x = x - X y = y - Y X = X & 255 Y = Y & 255 var n00 = this.getGrad(this.gradP[X+this.perm[Y]], x, y) var n01 = this.getGrad(this.gradP[X+this.perm[Y+1]], x, y-1) var n10 = this.getGrad(this.gradP[X+1+this.perm[Y]], x-1, y) var n11 = this.getGrad(this.gradP[X+1+this.perm[Y+1]], x-1, y-1) var u = fade(x) return this.lerp(this.lerp(n00, n10, u), this.lerp(n01, n11, u), this.fade(y))