// Graphing Convergence of Fourier Sine Series
// James Brink, 2/24/2020
let slider;
let f = 0;
let m;
let n;
function setup() {
createCanvas(722, 270);
createSpan(" n = ");
nSpan = createSpan(" ");
nSlider = createSlider(1, 100, 0);
createSpan(" "
+ " m =  ");
mSpan = createSpan(" ");
mSlider = createSlider(1, 10, 1);
createSpan("
");
let sqButton = createButton("Sum sin(m*i*x)/i for i = 1, 3, 5, ..., n");
sqButton.mousePressed(function () { f = 0;});
createSpan("
");
let sawButton = createButton("Sum sin(m*i*x)/i for i = 1, 2, 3, ..., n)")
sawButton.mousePressed(function () { f = 1; });
createSpan("
");
let triButton = createButton("Sum +/- sin(m*i*x)/(i * i) for i = 1, 3, 5, ..., n )");
createSpan(" (Here +/- means every other term is subtracted)");
triButton.mousePressed(function () { f = 3;});
createSpan("
These wave commonly called square waves,"
+ " sawtooth waves and triangular waves.");
createSpan("
James Brink 2/24/2020");
angleMode(DEGREES);
} // setup
function draw() {
background(200);
fill(color(144, 0, 0));
// determine m and n
m = mSlider.value();
mSpan.html(m + " period = "
+(round(36000/m)/100) + "o ");
n = nSlider.value();
nSpan.html(n);
// label 3 points
noStroke();
text("0", 3, 230);
text("360", 350, 230);
text("720", 700, 230);
// show periods
stroke(color(165, 42, 42));
for (let i = 0; i <= 2 * m; i++) {
drawingContext.setLineDash([2, 10]);
let p = 360 * i/m;
line(p, 0, p, 200);
drawingContext.setLineDash([]);
}
// evaluate the functions
if (f == 0) { // the square wave
n = 2 * nSlider.value() - 1; // only use odd harmonics
squareWave(n);
noStroke();
fill(color(0, 0, 255));
text("Sum sin(i*x)/i for i = 1, 3, 5, ..., " + n, 40, 255);
text("Coefficient function: 1/i", 360, 245);
text("Coefficients: 1, 0, 1/3, 0, 1/5, 0, 1/7, 0, 1/9, 0, ...", 360, 260);
} else if (f == 1) { // the sawtooth wave
n = nSlider.value(); // uses all harmonics
sawWave(n);
noStroke();
fill(color(0, 0, 255));
text("Sum sin(m*i*x)/i for i = 1, 2, 3, ..., " + n , 40, 255);
text("Coefficient function: 1/i", 360, 245);
text("Coefficients: 1, 1/2, 1/3, 1/4, 1/5, 1/6, 1/7, 1/8, 1/9, 1/10, ...",
360, 260);
} else if (f == 3) { // the triangle wave
n = 2 * nSlider.value() - 1; // uses only odd harmonics
triWave(n);
noStroke();
fill(color(0, 0, 255));
text("Sum +/- sin(i * x)/(i * i) for i =1, 3, 5,..., " + n, 40, 245);
text("(Here +/- means every other term is subtracted)", 40, 260);
text("Coefficient function: +/-1/(i*i)", 360, 245);
text("Coefficients: (1, 0, -1/9, 0, 1/25, 0, -1/49, 0, 1/81, ...", 360, 260);
}
} // draw
// draw a triangle wave
function triWave(n) {
stroke(color(255, 0, 0));
noFill();
beginShape();
for (x = 0; x < 720; x++) {
let s = 0;
sign = 1;
for (let i = 1; i <= n; i += 2) {
s += sign * sin(m * i * x)/(i*i);
sign = - sign;
}
vertex( x, -60 * s + 95);
}
endShape();
} // end triWave
// draw a sawtooth wave
function sawWave(n) {
stroke(color(255, 0, 0));
noFill();
beginShape();
for (x = 0; x < 720; x++) {
let s = 0;
for (let i = 1; i <= n; i++) {
s += sin(m * i * x) /i;
}
vertex( x, -50 * s + 100);
}
endShape();
} // end sawWave
// draw a square wave
function squareWave(n) {
stroke(color(255, 0, 0));
noFill();
beginShape();
for (x = 0; x < 720; x++) {
let s = 0;
for (let i = 1; i <= n; i += 2) {
s += sin(m * i * x)/i;
}
vertex( x, -60 * s + 75);
}
endShape();
} // end squareWave