var sin = Math.sin; var tau = Math.PI*2; module.exports = { /** * Set up a sinusoid generating function, * which we'll use to draw the "progressively * better looking" integral approximations. */ setup: function(api) { var w = api.getPanelWidth(); var h = api.getPanelHeight(); var generator; if (!this.generator) { generator = ((v,scale) => { scale = scale || 1; return { x: v*w/tau, y: scale * sin(v) }; }); generator.start = 0; generator.end = tau; generator.step = 0.1; generator.scale = h/3; this.generator = generator; } }, /** * Draw the generator's sine function: */ drawSine: function(api, dheight) { var w = api.getPanelWidth(); var h = api.getPanelHeight(); var generator = this.generator; generator.dheight = dheight; api.setColor("black"); api.drawLine({x:0,y:h/2}, {x:w,y:h/2}); api.drawFunction(generator, {x:0, y:h/2}); }, /** * Draw the sliced between the sine curve and * the x-axis, with a variable number of steps so * we can show the approximation becoming better * and better as we increase the step count. */ drawSlices: function(api, steps) { var w = api.getPanelWidth(); var h = api.getPanelHeight(); var f = w/tau; var area = 0; var c = steps <= 25 ? 1 : 0; api.reset(); api.setColor("transparent"); api.setFill("rgba(150,150,255, 0.4)"); for (var step=tau/steps, i=step/2, v, p1, p2; i