periodic-function
Version:
Collection of periodic functions
172 lines (142 loc) • 3.9 kB
JavaScript
const t = require('tape')
const fn = require('./')
const almost = require('almost-equal')
function draw(fn, ...args) {
if (typeof document === 'undefined') return
let arr = populate(fn, 32, ...args)
let canvas = document.body.appendChild(document.createElement('canvas'))
let ctx = canvas.getContext('2d')
canvas.width = arr.length
canvas.height = 32
let w = canvas.width * .75, h = canvas.height*.75
ctx.beginPath()
// ctx.moveTo(canvas.width*.125,canvas.height*.625)
for (let i = 0, l = arr.length; i < l; i++) {
// ctx.fillRect(w*i/l, h*.5, 1, -(arr[i]*.5)*h )
ctx.lineTo(w*i/l + canvas.width*.125, canvas.height*.5-(arr[i]*.5)*h )
}
// ctx.lineTo(canvas.width*.875,canvas.height*.625)
ctx.lineWidth = 2;
ctx.stroke()
ctx.closePath()
}
function populate(fn, N, ...args) {
return Array.from({length: N}, (v, i) => fn(i/N, ...args))
}
t('sin', t => {
draw(fn.sine)
var sin = populate(fn.sine, 1024);
t.equal(sin[0], 0);
t.equal(sin[~~(1024/4)], 1);
t.ok(almost(sin[~~(1024/2)], 0, 0.0001, 0.0001));
t.equal(fn.sine(-.75), fn.sine(.25))
t.end()
});
t('cos', t => {
draw(fn.sine, .25)
var cos = populate(fn.sine, 4, .25);
t.equal(cos[0], 1);
t.ok(almost(cos[1], 0, 0.0001, 0.0001));
t.equal(cos[2], -1);
t.ok(almost(cos[3], 0, 0.0001, 0.0001));
t.end()
});
t('delta', t => {
draw(fn.pulse)
var delta = populate(fn.pulse, 4);
t.equal(delta[0], 1);
t.equal(delta[1], 0);
t.equal(delta[2], 0);
t.equal(delta[3], 0);
t.end()
});
t('pulse', t => {
var pulse = populate(fn.pulse, 10, 0);
t.equal(pulse[0], 1);
t.equal(pulse[1], 0);
t.equal(pulse[9], 0);
t.equal(fn.pulse(-.75), fn.pulse(.25))
t.end()
});
t('square', t => {
draw(fn.square)
var square = populate(fn.square, 10);
t.equal(square[0], 1);
t.equal(square[4], 1);
t.equal(square[5], -1);
t.equal(square[9], -1);
draw(fn.square, .1)
var square = populate(fn.square, 10, .1);
t.equal(square[0], 1);
t.equal(square[4], -1);
t.equal(square[5], -1);
t.equal(square[9], -1);
t.equal(fn.square(-.75), fn.square(.25))
t.end()
});
t('triangle', t => {
draw(fn.triangle)
var triangle = populate(fn.triangle, 8);
t.equal(triangle[0], 1);
t.equal(triangle[1], 0.5);
t.equal(triangle[2], 0);
t.equal(triangle[3], -.5);
t.equal(triangle[4], -1);
t.equal(triangle[6], 0);
t.equal(triangle[7], 0.5);
t.equal(fn.triangle(-.75), fn.triangle(.25))
t.end()
});
t('triangle ratio', t => {
draw(fn.triangle, .25)
var triangle = populate(fn.triangle, 8, .25);
t.equal(triangle[2], -1)
t.end()
});
t('saw', t => {
draw(fn.sawtooth)
var saw = populate(fn.sawtooth, 8);
t.equal(saw[0], 1);
t.equal(saw[7], -.75);
draw(fn.sawtooth, true)
var sawi = populate(fn.sawtooth, 8, true);
t.equal(sawi[0], -1);
t.equal(sawi[7], .75);
t.equal(fn.sawtooth(-.75), fn.sawtooth(.25))
t.end()
});
t('fourier', t => {
draw(fn.fourier, [0, 1, 0, .5], [0, .5, 0, .1], true)
var series = populate(fn.fourier, 8, [1, .5, .25, .125], true);
t.equal(series[0], 1)
populate(fn.fourier, 8, null, [1, .5, .25, .125], true);
populate(fn.fourier, 8, [1, .5, .25, .125], null, true);
t.end()
});
t('noise', t => {
draw(fn.noise)
t.end()
})
t('clausen', t => {
draw(fn.clausen)
var clausen = populate(fn.clausen, 10);
t.ok(almost(clausen[5], 0))
t.equal(fn.clausen(-.75), fn.clausen(.25))
t.end()
});
t('interpolate', t => {
let set = Array.from({length: 6}, (v, i) => Math.random()*2 - 1)
draw(fn.interpolate, set)
var int = populate(fn.interpolate, 10, [0, .5, 1, .5, 0]);
t.equal(int[0], 0)
t.equal(int[1], 0.25)
t.equal(int[2], 0.5)
t.equal(int[9], 0)
t.end()
})
t('step', t => {
let set = Array.from({length: 6}, (v, i) => Math.random()*2 - 1)
draw(fn.step, set)
t.end()
})