let R, r1, r2, r3, qprev, pace, delta, deltaMax;
createCanvas(windowWidth, windowHeight);
R = min(width, height) / 2;
curveDrawing = createGraphics(width, height);
curveDrawing.translate(width / 2, height / 2);
curveDrawing.strokeWeight(2)
function mousePressed() {
if (delta < deltaMax) delta = deltaMax;
teeth1 = floor(random(80, 200));
teeth2 = floor(random(0.2, 0.8) * teeth1);
let lcm = teeth1 * teeth2 / gcd(teeth1, teeth2);
let fullTurns = lcm / teeth1;
r2 = r1 * teeth2 / teeth1;
r3 = r2 * random(0.5, 1);
deltaMax = r1 * TAU * fullTurns;
} = twoCircles(r1, r2, r3, delta);
function twoCircles(r1, r2, r3, delta) {
const ang1 = (delta % perim1) / r1;
const ang2 = (delta % perim2) / r2;
const p = createVector(r1, 0).rotate(ang1)
const c = p.copy().setMag(r1 - r2);
const q = c.copy().add(createVector(r3, 0).rotate(ang1 - ang2));
let completed = delta / deltaMax * 100;
text (`Click for \nanother`, 100, 50);
image(curveDrawing, 0, 0);
text (`${completed.toFixed(1)} % \ncomplete\n(click to stop)`, 100, 50);
batch = floor(map(abs(50-completed)**2, 50**2, 0, 5, 50))
for (let i = 0; i < batch; i++) {
} = twoCircles(r1, r2, r3, delta);
curveDrawing.line(qprev.x, qprev.y, q.x, q.y);
image(curveDrawing, 0, 0)
translate(width / 2, height / 2);
} = twoCircles(r1, r2, r3, delta);
circle(c.x, c.y, r2 * 2);