let rtPentSm = 0.4858682717566458;
let rtPentLg = 0.7861513777574233;
createCanvas(windowWidth, windowHeight);
scaleFactor = min(width,height)/2.5;
p.push(new p5.Vector(0,0));
p.push(new p5.Vector(0,rtPentLg));
p.push(new p5.Vector(rtPentSm,rtPentLg));
p.push(new p5.Vector(rtPentLg,rtPentSm));
p.push(new p5.Vector(rtPentLg,0));
v = new p5.Vector(0.9,0.1);
uP = new p5.Vector(-0.2,0.4);
centerCanvasOnUnitOrigin();
strokeWeight(1/(scaleFactor*2)); noFill();
showAxes(); showUnitCircle();
let x = new p5.Vector(cos(frameCount/60),0.0).mult(multiplier*atanh(rtPentLg));
v = x.copy().setMag(tanh(m));
uP.set(cos((frameCount+30)/80),sin((frameCount+30)/80)).mult(rtPentLg);
let ideals = Klein.idealPoints(u,v);
vectorLine(ideals[0],ideals[1]);
fill(255,0,0); vectorCircle(u, 0.02);
fill(0,0,255); vectorCircle(v, 0.02);
fill(255,0,0); vectorCircle(ideals[0], 0.01);
fill(0,0,255); vectorCircle(ideals[1], 0.01);
for (let i = 0; i < 5; i++) { vectorLine(p[i], p[(i+1)%5]); }
for (let i = 0; i < 5; i++) { vectorLine(q[i], q[(i+1)%5]); }
for (let vert of p) { vectorCircle(vert, 0.01); }
function centerCanvasOnUnitOrigin() {
translate(width/2,height/2); scale(scaleFactor,-scaleFactor);
line(-(windowWidth-10)/(scaleFactor*2),0,(windowWidth-10)/(scaleFactor*2),0);
line(0,-(windowHeight-10)/(scaleFactor*2),0,(windowHeight-10)/(scaleFactor*2));
function showUnitSquare() {
function showUnitCircle() {