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
|
export function mod(n,m){ return n-(m * Math.floor(n/m)) }
export function clamp(n,a,b) { return n<a?a:n<b?n:b }
export function norm(n,a,b) { return (n-a) / (b-a) }
export function lerp(n,a,b) { return (b-a)*n+a }
export function mix(n,a,b) { return a*(1-n)+b*n }
export function randint(n) { return Math.floor(Math.random()*n) }
export function randrange(a,b){ return Math.random() * (b-a) + a }
export function randsign(){ return Math.random() >= 0.5 ? -1 : 1 }
export function choice (a){ return a[ Math.floor(Math.random() * a.length) ] }
export function lerp(n,a,b){ return (b-a)*n+a }
export function angle(x0,y0,x1,y1){ return Math.atan2(y1-y0,x1-x0) }
export function dist(x0,y0,x1,y1){ return Math.sqrt(Math.pow(x1-x0,2)+Math.pow(y1-y0,2)) }
export function xor(a,b){ a=!!a; b=!!b; return (a||b) && !(a&&b) }
export function quantize(a,b){ return Math.floor(a/b)*b }
export function shuffle(a){
for (var i = a.length; i > 0; i--){
var r = randint(i)
var swap = a[i-1]
a[i-1] = a[r]
a[r] = swap
}
return a
}
// returns a gaussian random function with the given mean and stdev.
export function gaussian(mean, stdev) {
let y2;
let use_last = false;
return () => {
let y1;
if (use_last) {
y1 = y2;
use_last = false;
}
else {
let x1, x2, w;
do {
x1 = 2.0 * Math.random() - 1.0;
x2 = 2.0 * Math.random() - 1.0;
w = x1 * x1 + x2 * x2;
} while( w >= 1.0);
w = Math.sqrt((-2.0 * Math.log(w))/w);
y1 = x1 * w;
y2 = x2 * w;
use_last = true;
}
let retval = mean + stdev * y1;
if (retval > 0)
return retval;
return -retval;
}
}
|