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