summaryrefslogtreecommitdiff
path: root/js/util.js
blob: f1fd3c284712558fbc16ae6bc0c87572b1a61b87 (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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
if (window.$) {
  $.fn.int = function(){ return parseInt($(this).val(),10) }
  $.fn.float = function(){ return parseFloat($(this).val()) }
  $.fn.string = function(){ return trim($(this).val()) }
  $.fn.enable = function() { return $(this).attr("disabled",null) }
  $.fn.disable = function() { return $(this).attr("disabled","disabled") }
}

function noop(){}
function trim(s){ return s.replace(/^\s+/,"").replace(/\s+$/,"") }

var E = Math.E
var PI = Math.PI
var PHI = (1+Math.sqrt(5))/2
var TWO_PI = PI*2
var LN10 = Math.LN10
function clamp(n,a,b){ return n<a?a:n<b?n:b }
function norm(n,a,b){ return (n-a) / (b-a) }
function lerp(n,a,b){ return (b-a)*n+a }
function mix(n,a,b){ return a*(1-n)+b*n }
function ceil(n){ return Math.ceil(n) }
function floor(n){ return Math.floor(n) }
function round(n){ return Math.round(n) }
function max(a,b){ return Math.max(a,b) }
function min(a,b){ return Math.min(a,b) }
function abs(n){ return Math.abs(n) }
function sign(n){ return Math.abs(n)/n }
function pow(n,b) { return Math.pow(n,b) }
function exp(n) { return Math.exp(n) }
function log(n){ return Math.log(n) }
function ln(n){ return Math.log(n)/LN10 }
function sqrt(n) { return Math.sqrt(n) }
function cos(n){ return Math.cos(n) }
function sin(n){ return Math.sin(n) }
function tan(n){ return Math.tan(n) }
function acos(n){ return Math.cos(n) }
function asin(n){ return Math.sin(n) }
function atan(n){ return Math.atan(n) }
function atan2(n){ return Math.atan2(n) }
function sec(n){ return 1/cos(n) }
function csc(n){ return 1/sin(n) }
function cot(n){ return 1/tan(n) }
function cosp(n){ return (1+Math.cos(n))/2 } // cos^2
function sinp(n){ return (1+Math.sin(n))/2 }
function random(){ return Math.random() }
function rand(n){ return (Math.random()*n) }
function randint(n){ return rand(n)|0 }
function randrange(a,b){ return a + rand(b-a) }
function choice(a){ return a[randint(a.length)] }
function deg(n){ return n*180/PI }
function rad(n){ return n*PI/180 }
function xor(a,b){ a=!!a; b=!!b; return (a||b) && !(a&&b) }
function mod(n,m){ return n-(m * floor(n/m)) }
function dist(x0,y0,x1,y1){ return sqrt(pow(x1-x0,2)+pow(y1-y0,2)) }
function angle(x0,y0,x1,y1){ return atan2(y1-y0,x1-x0) }
function avg(m,n,a){ return (m*(a-1)+n)/a }

function pixel(x,y){ return 4*(mod(y,actual_h)*actual_w+mod(x,actual_w)) }
function rgbpixel(d,x,y){
  var p = pixel(~~x,~~y)
  r = d[p]
  g = d[p+1]
  b = d[p+2]
  a = d[p+3]
}
function fit(d,x,y){ rgbpixel(d,x*actual_w/w,y*actual_h/h) }

function step(a, b){
  return (b >= a) + 0 
               // ^^ bool -> int
}


function julestep (a,b,n) {
  return clamp(norm(n,a,b), 0.0, 1.0);
}

// hermite curve apparently
function smoothstep(min,max,n){
  var t = clamp((n - min) / (max - min), 0.0, 1.0);
  return t * t * (3.0 - 2.0 * t)
}

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
}
function reverse(a){
  var reversed = []
  for (var i = 0, _len = a.length-1; i <= _len; i++){
    reversed[i] = a[_len-i]
  }
  return reversed
}
function deinterlace(a){
  var odd = [], even = []
  for (var i = 0, _len = a.length; i < _len; i++) {
    if (i % 2) even.push(a[i])
    else odd.push(a[i])
  }
  return [even, odd]
}
function weave(a){
  var aa = deinterlace(a)
  var b = []
  aa[0].forEach(function(el){ b.push(el) })
  reverse(aa[1]).forEach(function(el){ b.push(el) })
  return b
}