u(t) is called 60 times per second.
t: Elapsed time in seconds.
S: Shorthand for Math.sin.
C: Shorthand for Math.cos.
T: Shorthand for Math.tan.
R: Function that generates rgba-strings, usage ex.: R(255, 255, 255, 0.5)
c: A 1920x1080 canvas.
x: A 2D context for that canvas.
Here is 12 characters saved: c.width^=i=0;for(y of'111121012110')x.lineTo(960+y%2*S(p=t+1.6*'123403020140'[i++])*(z=1600/(3+y%2*C(p))),y*z);x.fill('evenodd')
using 1.6 to approximate Math.PI/2 is OK, but you should change all the 4s to 0s in the second data string, just to minimze the aggregate angular error. I used 4 for clarity, because 1.57 is accurate enough that the error is hard to notice. With 1.6 you can notice that one edge is longer than the others. c.width^=i=0;for(y of'111121012110')x.lineTo(960+y%2*S(p=t+1.6*'123003020100'[i++])*(z=1600/(3+y%2*C(p))),y*z);x.fill('evenodd')
u(t) is called 60 times per second.
t: elapsed time in seconds.
c: A 1920x1080 canvas.
x: A 2D context for that canvas.
S: Math.sin
C: Math.cos
T: Math.tan
R: Generates rgba-strings, ex.: R(255, 255, 255, 0.5)