-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathperlin.js
105 lines (79 loc) · 2.98 KB
/
perlin.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
; /* Fast 2D Perlin Noise */ ;
; /* Taken from http://freespace.virgin.net/hugo.elias/models/m_perlin.htm */ ;
; /* This file is public domain. Other files are not. */ ;
namespace = window.namespace || {};
namespace.util = namespace.util || {};
namespace.util.perlin = (function() {
function _cosineInterpolate(a, b, x) {
var ft = x * Math.PI;
var f = (1 - Math.cos(ft)) * .5;
return a*(1-f) + b*f;
}
function _perlinNoise(x) {
x = (x<<13) ^ x;
return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0);
}
function _smoothPerlinNoise(x) {
return _perlinNoise(x)/2 + _perlinNoise(x-1)/4 + _perlinNoise(x+1)/4;
}
function _interpolatedPerlinNoise(x) {
var integer_X = Math.floor(x);
var fractional_X = x - integer_X;
var v1 = _smoothPerlinNoise(integer_X);
var v2 = _smoothPerlinNoise(integer_X + 1);
return _cosineInterpolate(v1 , v2 , fractional_X);
}
return function perlin(x) {
var total = 0;
var p = 0.25; // persistence
var n = 7; // octaves - 1
for (var i = 0; i < n; i++) {
var frequency = Math.pow(2, i);
var amplitude = Math.pow(p, i);
total = total + _interpolatedPerlinNoise(x * frequency) * amplitude;
}
return total;
}
})();
namespace.util.perlin2d = (function() {
function _cosineInterpolate(a, b, x) {
var ft = x * Math.PI;
var f = (1 - Math.cos(ft)) * .5;
return a*(1-f) + b*f;
}
function _perlinNoise(x, y) {
var n = x + y * 57;
n = (n<<13) ^ n;
return ( 1.0 - ( (n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0);
}
function _smoothPerlinNoise(x, y) {
var corners = ( _perlinNoise(x-1, y-1)+_perlinNoise(x+1, y-1)+_perlinNoise(x-1, y+1)+_perlinNoise(x+1, y+1) ) / 16;
var sides = ( _perlinNoise(x-1, y) +_perlinNoise(x+1, y) +_perlinNoise(x, y-1) +_perlinNoise(x, y+1) ) / 8;
var center = _perlinNoise(x, y) / 4;
return corners + sides + center;
}
function _interpolatedPerlinNoise(x, y) {
var integer_X = Math.floor(x);
var fractional_X = x - integer_X;
var integer_Y = Math.floor(y);
var fractional_Y = y - integer_Y;
var v1 = _smoothPerlinNoise(integer_X, integer_Y);
var v2 = _smoothPerlinNoise(integer_X + 1, integer_Y);
var v3 = _smoothPerlinNoise(integer_X, integer_Y + 1);
var v4 = _smoothPerlinNoise(integer_X + 1, integer_Y + 1);
var i1 = _cosineInterpolate(v1 , v2 , fractional_X);
var i2 = _cosineInterpolate(v3 , v4 , fractional_X);
return _cosineInterpolate(i1 , i2 , fractional_Y);
}
return function perlin2d(x, y) {
var total = 0;
var p = 0.25; // Persistence
var n = 7;
for (var i = 0; i < n; i++) {
var frequency = Math.pow(2, i);
var amplitude = Math.pow(p, i);
total = total + _interpolatedPerlinNoise(x * frequency, y * frequency) * amplitude;
}
return total;
}
})();