export function mod(n,m){ return n-(m * Math.floor(n/m)) } export function clamp(n,a,b) { return n= 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; } }