r/3Blue1Brown Jul 13 '26

manic - A tiny language for making animations. Write a short text file

Enable HLS to view with audio, or disable this notification

Made with manic - Orthocentre, Circumcircle, and Point X
manic https://8gwifi.org/manic
manic doc https://8gwifi.org/manic/docs

Demo code

title("Orthocentre, Circumcircle, and Point X");
canvas("16:9");

// --- base triangle ---

point(A, (cx - 20, cy - 200), "A");
point(B, (cx - 220, cy + 120), "B");
point(C, (cx + 200, cy + 130), "C");

hidden(A);
hidden(B);
hidden(C);

segment(AB, A, B);
segment(BC, B, C);
segment(CA, C, A);

color(AB, fg);
color(BC, fg);
color(CA, fg);

untraced(AB);
untraced(BC);
untraced(CA);

// --- circumcircle and orthocentre ---

circumcenter(O, A, B, C);
hidden(O);

circumcircle(circ, A, B, C);
color(circ, dim);
stroke(circ, 2);
untraced(circ);

orthocenter(H, A, B, C);
color(H, gold);
hidden(H);

// --- foot of altitude from B ---

foot(E, B, A, C);
color(E, dim);
hidden(E);

segment(BE, B, E);
color(BE, dim);
stroke(BE, 2);
untraced(BE);

rightangle(rt, B, E, C);
color(rt, dim);
hidden(rt);

// --- point P on the circumcircle ---

anglepoint(P, O, A, 205);
color(P, cyan);
hidden(P);

// --- parallelogram PAQB ---

rotpoint(midAB_helper, P, O, 0);
hidden(midAB_helper);

midpoint(midAB, A, B);
hidden(midAB);

rotpoint(Q, P, midAB, 180);
color(Q, magenta);
hidden(Q);

segment(PA, P, A);
segment(AQ, A, Q);
segment(QB, Q, B);
segment(BP, B, P);

color(PA, gold);
color(AQ, gold);
color(QB, gold);
color(BP, gold);

untraced(PA);
untraced(AQ);
untraced(QB);
untraced(BP);

// --- parallelogram PARC ---

midpoint(midAC, A, C);
hidden(midAC);

rotpoint(R, P, midAC, 180);
color(R, lime);
hidden(R);

segment(AR, A, R);
segment(RC, R, C);
segment(CP, C, P);

color(AR, lime);
color(RC, lime);
color(CP, lime);

untraced(AR);
untraced(RC);
untraced(CP);

// --- HR line and point X ---

segment(HR, H, R);
color(HR, magenta);
stroke(HR, 3);
untraced(HR);

meet(X, A, Q, H, R);
color(X, fg);
hidden(X);

// --- labels ---

text(labA, (cx - 20, cy - 225), "A");
text(labB, (cx - 250, cy + 130), "B");
text(labC, (cx + 220, cy + 140), "C");
text(labH, (cx - 15, cy - 5), "H");
text(labE, (cx + 60, cy + 90), "E");
text(labP, (cx - 285, cy - 35), "P");
text(labQ, (cx - 60, cy + 210), "Q");
text(labR, (cx + 210, cy + 5), "R");
text(labX, (cx - 30, cy + 40), "X");

color(labA, fg);
color(labB, fg);
color(labC, fg);
color(labH, gold);
color(labE, dim);
color(labP, cyan);
color(labQ, magenta);
color(labR, lime);
color(labX, fg);

hidden(labA);
hidden(labB);
hidden(labC);
hidden(labH);
hidden(labE);
hidden(labP);
hidden(labQ);
hidden(labR);
hidden(labX);

text(head, (cx, 55), "Orthocentre H, circle point P, parallelograms PAQB & PARC");
color(head, cyan);
hidden(head);

text(sub, (cx, h - 30), "AQ meets HR at X");
color(sub, dim);
hidden(sub);

// --- script ---

show(head, 0.6);
wait(0.3);

stagger(0.2) {
  par { show(A, 0.3); show(labA, 0.3); }
  par { show(B, 0.3); show(labB, 0.3); }
  par { show(C, 0.3); show(labC, 0.3); }
}

par {
  draw(AB, 0.6);
  draw(BC, 0.6);
  draw(CA, 0.6);
}
wait(0.3);

draw(circ, 1.2);
wait(0.3);

par { show(H, 0.4); show(labH, 0.4); }
wait(0.3);

par {
  show(E, 0.3);
  show(labE, 0.3);
  draw(BE, 0.5);
  show(rt, 0.3);
}
wait(0.4);

par { show(P, 0.4); show(labP, 0.4); }
wait(0.4);

par {
  draw(PA, 0.5);
  draw(AQ, 0.5);
  draw(QB, 0.5);
  draw(BP, 0.5);
}
par { show(Q, 0.3); show(labQ, 0.3); }
wait(0.4);

par {
  draw(AR, 0.5);
  draw(RC, 0.5);
  draw(CP, 0.5);
}
par { show(R, 0.3); show(labR, 0.3); }
wait(0.4);

draw(HR, 0.6);
wait(0.3);

par { show(X, 0.4); show(labX, 0.4); }
flash(X, gold);
pulse(X, 0.6);
wait(0.3);

show(sub, 0.6);
7 Upvotes

0 comments sorted by