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
|
export const mod = (n,m) => n-(m * Math.floor(n/m))
export const clamp = (n,a,b) => n<a?a:n<b?n:b
export const norm = (n,a,b) => (n-a) / (b-a)
export const lerp = (n,a,b) => (b-a)*n+a
export const mix = (n,a,b) => a*(1-n)+b*n
export const randint = (n) => Math.floor(Math.random()*n)
export const randrange = (a,b) => Math.random() * (b-a) + a
export const randsign = () => Math.random() >= 0.5 ? -1 : 1
export const choice = (a) => a[ Math.floor(Math.random() * a.length) ]
export const angle = (x0,y0,x1,y1) => Math.atan2(y1-y0, x1-x0)
export const dist = (x0,y0,x1,y1) => Math.sqrt(Math.pow(x1-x0, 2) + Math.pow(y1-y0, 2))
export const xor = (a,b) => { a=!!a; b=!!b; return (a||b) && !(a&&b) }
export const quantize = (a,b) => Math.floor(a/b)*b
export const 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;
}
}
|