summaryrefslogtreecommitdiff
path: root/app/client/util/math.js
blob: c301ffdec17e8eb31c7c10634824fe08ab4126e6 (plain)
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 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 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;
  }
}