.geometry "version 0.40";
.l0; 
v1 = .free(-0.894904, -0.173232, "A");
v2 = .free(-0.686482, 0.190777, "B");
v3 = .free(-0.328704, -0.372994, "C");
l1 = .l.vv(v2, v3);
l2 = .l.vv(v2, v1);
l3 = .l.vv(v1, v3);
l14 = .l.vlperp(v3, l2, .in, .longline);
l15 = .l.vlperp(v2, l3, .in, .longline);
l16 = .l.vlperp(v1, l1, .in, .longline);
v23 = .v.ll(l1, l16, .magenta, .soliddiamond);
v13 = .v.ll(l15, l3, .magenta, .soliddiamond);
v12 = .v.ll(l14, l2, .magenta, .soliddiamond);
d1 = .f.vv(v23, v13);
d2 = .f.vv(v13, v12);
d3 = .f.vv(v12, v23);
mag = .f.rpn(d1, d2, d3, .add, .add, , .magenta, "Magenta perimeter");
l17 = .l.vv(v12, v13, .magenta);
l18 = .l.vv(v13, v23, .magenta);
ll19 = .l.vv(v23, v12, .magenta, .tol1);
l19 = .l.vv(v23, v12, .red, .l2on);
v11 = .v.lvmirror(l1, v1, .l1on, "A'");
l4 = .l.vv(v3, v11, .l1on);
l5 = .l.vv(v11, v2, .l1on);
v22 = .v.lvmirror(l4, v2, .l1on, "B'");
l6 = .l.vv(v3, v22, .l1on);
l7 = .l.vv(v22, v11, .l1on);
v33 = .v.lvmirror(l7, v3, .l1on, "C'");
l8 = .l.vv(v11, v33, .l1on);
l9 = .l.vv(v33, v22, .l1on);
v111 = .v.lvmirror(l9, v11, .l1on, "A''");
l10 = .l.vv(v33, v111, .l1on);
l11 = .l.vv(v111, v22, .l1on);
v222 = .v.lvmirror(l10, v22, .l1on, "B''");
l12 = .l.vv(v33, v222, .l1on);
l13 = .l.vv(v222, v111, .l1on);
vv12 = .v.lvmirror(l1, v12, .magenta, .l2on);
vv13 = .v.lvmirror(l1, v13, .magenta, .l2on, .soliddiamond);
l20 = .l.vv(v23, vv12, .magenta, .l2on);
l21 = .l.vv(vv12, vv13, .magenta, .l2on);
l22 = .l.vv(vv13, v23, .red, .l2on);
vvv23 = .v.lvmirror(l4, v23, .magenta, .l2on);
vvv12 = .v.lvmirror(l4, vv12, .magenta, .l2on, .soliddiamond);
l23 = .l.vv(vv13, vvv12, .red, .l2on);
l24 = .l.vv(vvv12, vvv23, .magenta, .l2on);
l25 = .l.vv(vvv23, vv13, .magenta, .l2on);
vvvv23 = .v.lvmirror(l7, vvv23, .magenta, .l2on, .soliddiamond);
vvvv13 = .v.lvmirror(l7, vv13, .magenta, .l2on);
l26 = .l.vv(vvv12, vvvv13, .magenta, .l2on);
l27 = .l.vv(vvvv13, vvvv23, .magenta, .l2on);
l28 = .l.vv(vvvv23, vvv12, .red, .l2on);
vvvvv12 = .v.lvmirror(l9, vvv12, .magenta, .l2on);
vvvvv13 = .v.lvmirror(l9, vvvv13, .magenta, .l2on, .soliddiamond);
l29 = .l.vv(vvvv23, vvvvv13, .red, .l2on);
l30 = .l.vv(vvvvv13, vvvvv12, .magenta, .l2on);
l31 = .l.vv(vvvvv12, vvvv23, .magenta, .l2on);
vvvvvv12 = .v.lvmirror(l10, vvvvv12, .magenta, .l2on, .soliddiamond);
vvvvvv23 = .v.lvmirror(l10, vvvv23, .magenta, .l2on);
l32 = .l.vv(vvvvv13, vvvvvv12, .red, .l2on);
l33 = .l.vv(vvvvvv12, vvvvvv23, .magenta, .l2on);
l34 = .l.vv(vvvvvv23, vvvvv13, .magenta, .l2on);
.text("Fagnano's Problem:
Show that in an acute-angled triangle, the orthic triangle is the
inscribed triangle of smallest perimeter.  (The orthic triangle is
the triangle whose vertices are the feet of the altitudes.
In the figure above, the perimeter of the green triangle is always
greater than the perimeter of the purple triangle.", .l0);
u12 = .vonl(l2, -0.786881, 0.01543, .green, .diamond);
u23 = .vonl(l1, -0.557824, -0.0119566, .green, .diamond);
u13 = .vonl(l3, -0.691999, -0.244819, .green, .diamond);
u1 = .f.vv(u12, u23);
u2 = .f.vv(u23, u13);
u3 = .f.vv(u13, u12);
green = .f.rpn(u1, u2, u3, .add, .add, .green, "Green perimeter");
uu12 = .v.lvmirror(l1, u12, .green, .l3on);
uu13 = .v.lvmirror(l1, u13, .green, .l3on, .diamond);
uuu23 = .v.lvmirror(l4, u23, .green, .l3on);
uuu12 = .v.lvmirror(l4, uu12, .green, .l3on, .diamond);
uuuu23 = .v.lvmirror(l7, uuu23, .green, .l3on, .diamond);
uuuu13 = .v.lvmirror(l7, uu13, .green, .l3on);
uuuuu12 = .v.lvmirror(l9, uuu12, .green, .l3on);
uuuuu13 = .v.lvmirror(l9, uuuu13, .green, .l3on, .diamond);
uuuuuu12 = .v.lvmirror(l10, uuuuu12, .green, .l3on, .diamond);
uuuuuu23 = .v.lvmirror(l10, uuuu23, .green, .l3on);
l35 = .l.vv(u12, u13, .green);
l37 = .l.vv(u23, u13, .green);
l39 = .l.vv(u23, uu12, .green, .l3on);
l40 = .l.vv(uu12, uu13, .green, .l3on);
l41 = .l.vv(uu13, uuu23, .green, .l3on);
l42 = .l.vv(uuu23, uuu12, .green, .l3on);
l43 = .l.vv(uuu12, uuuu13, .green, .l3on);
l44 = .l.vv(uuuu13, uuuu23, .green, .l3on);
l45 = .l.vv(uuuu23, uuuuu12, .green, .l3on);
l46 = .l.vv(uuuuu12, uuuuu13, .green, .l3on);
l47 = .l.vv(uuuuu13, uuuuuu23, .green, .l3on);
l48 = .l.vv(uuuuuu23, uuuuuu12, .green, .l3on);
ll49 = .l.vv(u12, u23, .green, .tol2);
l49 = .l.vv(u12, u23, .yellow, .l3on);
l50 = .l.vv(u23, uu13, .yellow, .l3on);
l51 = .l.vv(uu13, uuu12, .yellow, .l3on);
l52 = .l.vv(uuu12, uuuu23, .yellow, .l3on);
l53 = .l.vv(uuuu23, uuuuu13, .yellow, .l3on);
l54 = .l.vv(uuuuu13, uuuuuu12, .yellow, .l3on);
.text("Proof:  First, reflect the original triangle across edge BC, then that
triangle about A'C, then about A'B', then B'C', and finally C'A'' as in the
figure.  Note that line AB is parallel to line A''B'' (this is easy
to see just by adding up angles).  You can also convince yourself
that it's true by moving the points A, B, and C around.", .l1);
.text("Next, see what happens when the orthic triangle is reflected through the
same lines.  The line in red is equal in length to twice the perimeter
of the orthic triangle.", .l2);
.text("Finally, note what happens when any other triangle is reflected.
The line corresponding to twice the perimeter is shown in yellow.
Since the beginning and end points of the red path and yellow path
are the same distance along parallel lines, the total distance
covered is the same.  The red path, however, is always a straight
line.  The yellow path is at least as long, and usually longer.
  -- QED", .l3);
.text("Press 'Next' to continue ...", .red, .tol2);
