CONST LightColor = Color.Grey50, LightWidth = 1.5, SoftRed = Color.FromHSV(Color.RedHue, 0.5, 1), SoftBlue = Color.FromHSV(Color.BlueHue, 0.5, 1), SoftGreen = Color.FromHSV(Color.GreenHue, 0.8, 0.5), SoftMagenta = Color.FromHSV(Color.MagentaHue, 0.5, 1); PROC Label(name) IS SAVE PS IN PS.SetFont("Helvetica", PS.Huge); TypeLinesC.Center((0, 200), name) END END; UI TextTool(Label); FUNC d = PerpPoint(a, b, c) IS (E x = (100, 0) REL (a, b) :: Angle.Right(x, d, c) AND Geometry.Colinear(a, d, x)) END; UI PointTool(PerpPoint); PROC DrawLine(a, b) IS SAVE PS IN PS.SetWidth(LightWidth); PS.MoveTo(a); PS.LineTo(b); PS.Stroke() END END; UI PointTool(DrawLine); PROC DrawPerp(a, b, c) IS IF VAR d ~ (0.1, 0) REL (b, c), f ~ (0.1, 0) REL (b, a) IN Geometry.Colinear(a, f, b) AND Geometry.Colinear(b, d, c) AND (f, b) CONG (b, d) AND Geometry.Dist(f, b) = 10 -> IF VAR e ~ (0.5, 0.2) REL (f, b) IN (f, e) PARA (b, c) AND (a, b) PARA (e, d) -> SAVE PS IN PS.SetWidth(LightWidth); PS.MoveTo(c); PS.LineTo(b); PS.MoveTo(d); PS.LineTo(e); PS.LineTo(f); PS.MoveTo(a); PS.LineTo(b); PS.Stroke() END END FI END FI END; UI PointTool(DrawPerp); PROC Connect3(a, b, c) IS SAVE PS IN PS.MoveTo(a); PS.LineTo(c); PS.LineTo(b); PS.SetWidth(LightWidth); PS.Stroke() END END; UI PointTool(Connect3); PROC Start() IS VAR a = (-164.4, -182.8), b = (187.8, -78.12), c = (19.69, 149.4) IN SAVE PS IN Triangle.Draw(a, b, c); PS.SetWidth(2); PS.Stroke() END END END; UI Template(Start); PROC Orthocenter() IS IF VAR a = (-164.4, -182.8), b = (187.8, -78.12), c = (19.69, 149.4), g ~ (95.47, -105.6), h ~ (113.5, 22.5), i ~ (-37.27, 46.61), j ~ (67.5, -11.45) IN g = PerpPoint(a, b, c) AND h = PerpPoint(b, c, a) AND i = PerpPoint(c, a, b) AND Geometry.Colinear(c, j, g) AND Geometry.Colinear(i, j, b) -> SAVE PS IN PS.SetColor(SoftRed); DrawPerp(a, g, c); DrawPerp(b, h, a); DrawPerp(c, i, b); Connect3(b, i, j); Connect3(c, g, j); Connect3(a, h, j) END; SAVE PS IN Triangle.Draw(a, b, c); PS.SetWidth(2); PS.Stroke() END; PtLabel.SetDotSize(4); SAVE PS IN PS.SetColor(Color.Red); PtLabel.None(i); PtLabel.None(h); PtLabel.None(g); PtLabel.None(j) END; Label("Orthocenter") END FI END; UI Template(Orthocenter); PROC Centroid() IS IF VAR a = (-164.4, -182.8), b = (187.8, -78.12), c = (19.69, 149.4), d ~ (11.7, -130.5), e ~ (103.7, 35.64), f ~ (-72.35, -16.7), m ~ (14.36, -37.17) IN d = Geometry.Mid(a, b) AND e = Geometry.Mid(b, c) AND f = Geometry.Mid(a, c) AND Geometry.Colinear(a, m, e) AND Geometry.Colinear(b, m, f) -> SAVE PS IN PS.SetColor(SoftMagenta); DrawLine(c, d); DrawLine(b, f); DrawLine(a, e) END; SAVE PS IN Triangle.Draw(a, b, c); PS.SetWidth(2); PS.Stroke() END; PtLabel.SetDotSize(4); SAVE PS IN PS.SetColor(Color.Magenta); PtLabel.None(d); PtLabel.None(e); PtLabel.None(f); PtLabel.None(m) END; Label("Centroid") END FI END; UI Template(Centroid); PROC Circumcenter() IS IF VAR a = (-164.4, -182.8), b = (187.8, -78.12), c = (19.69, 149.4), d ~ (11.7, -130.5), e ~ (103.7, 35.64), f ~ (-72.35, -16.7), k ~ (-12.2, -50.03) IN d = Geometry.Mid(a, b) AND e = Geometry.Mid(b, c) AND f = Geometry.Mid(a, c) AND Angle.Right(a, d, k) AND Angle.Right(c, f, k) -> SAVE PS IN PS.SetColor(SoftBlue); DrawPerp(a, d, k); DrawPerp(c, f, k); DrawPerp(b, e, k) END; SAVE PS IN Triangle.Draw(a, b, c); PS.SetWidth(2); PS.Stroke() END; PtLabel.SetDotSize(4); SAVE PS IN PS.SetColor(Color.Blue); PtLabel.None(d); PtLabel.None(e); PtLabel.None(f); PtLabel.None(k) END; Label("Circumcenter") END FI END; UI Template(Circumcenter); PROC AllThree() IS IF VAR a = (-164.4, -182.8), b = (187.8, -78.12), c = (19.69, 149.4), d ~ (11.7, -130.5), e ~ (103.7, 35.64), f ~ (-72.35, -16.7), g ~ (95.47, -105.6), h ~ (113.5, 22.5), i ~ (-37.27, 46.61), j ~ (67.5, -11.45), k ~ (-12.2, -50.03), m ~ (14.36, -37.17) IN d = Geometry.Mid(a, b) AND e = Geometry.Mid(b, c) AND f = Geometry.Mid(a, c) AND g = PerpPoint(a, b, c) AND h = PerpPoint(b, c, a) AND i = PerpPoint(c, a, b) AND Geometry.Colinear(c, j, g) AND Geometry.Colinear(i, j, b) AND Angle.Right(a, d, k) AND Angle.Right(c, f, k) AND Geometry.Colinear(a, m, e) AND Geometry.Colinear(b, m, f) -> SAVE PS IN PS.SetColor(SoftMagenta); DrawLine(c, d); DrawLine(b, f); DrawLine(a, e) END; SAVE PS IN PS.SetColor(SoftRed); DrawPerp(a, g, c); DrawPerp(b, h, a); DrawPerp(c, i, b); Connect3(b, i, j); Connect3(c, g, j); Connect3(a, h, j) END; SAVE PS IN PS.SetColor(SoftBlue); DrawPerp(a, d, k); DrawPerp(c, f, k); DrawPerp(b, e, k) END; SAVE PS IN Triangle.Draw(a, b, c); PS.SetWidth(2); PS.Stroke() END; PtLabel.SetDotSize(4); SAVE PS IN PS.SetColor(Color.Red); PtLabel.None(i); PtLabel.None(h); PtLabel.None(g); PtLabel.None(j); PS.SetColor(Color.Blue); PtLabel.None(d); PtLabel.None(e); PtLabel.None(f); PtLabel.None(k); PS.SetColor(Color.Magenta); PtLabel.None(m) END END FI END; UI Template(AllThree); PROC EulerLine() IS IF VAR a = (-164.4, -182.8), b = (187.8, -78.12), c = (19.69, 149.4), d ~ (11.7, -130.5), e ~ (103.7, 35.64), f ~ (-72.35, -16.7), g ~ (95.47, -105.6), h ~ (113.5, 22.5), i ~ (-37.27, 46.61), j ~ (67.5, -11.45), k ~ (-12.2, -50.03), m ~ (14.36, -37.17) IN d = Geometry.Mid(a, b) AND e = Geometry.Mid(b, c) AND f = Geometry.Mid(a, c) AND g = PerpPoint(a, b, c) AND h = PerpPoint(b, c, a) AND i = PerpPoint(c, a, b) AND Geometry.Colinear(c, j, g) AND Geometry.Colinear(i, j, b) AND Angle.Right(a, d, k) AND Angle.Right(c, f, k) AND Geometry.Colinear(a, m, e) AND Geometry.Colinear(b, m, f) -> SAVE PS IN PS.SetColor(SoftMagenta); DrawLine(c, d); DrawLine(b, f); DrawLine(a, e) END; SAVE PS IN PS.SetColor(SoftRed); DrawPerp(a, g, c); DrawPerp(b, h, a); DrawPerp(c, i, b); Connect3(b, i, j); Connect3(c, g, j); Connect3(a, h, j) END; SAVE PS IN PS.SetColor(SoftBlue); DrawPerp(a, d, k); DrawPerp(c, f, k); DrawPerp(b, e, k) END; SAVE PS IN Triangle.Draw(a, b, c); PS.SetWidth(2); PS.Stroke() END; SAVE PS IN PS.MoveTo(j); PS.LineTo(k); PS.SetWidth(1.5 * LightWidth); PS.SetColor(Color.Black); PS.Stroke() END; PtLabel.SetDotSize(4); SAVE PS IN PS.SetColor(Color.Red); PtLabel.None(i); PtLabel.None(h); PtLabel.None(g); PtLabel.None(j); PS.SetColor(Color.Blue); PtLabel.None(d); PtLabel.None(e); PtLabel.None(f); PtLabel.None(k); PS.SetColor(Color.Magenta); PtLabel.None(m) END END FI END; UI Template(EulerLine); PROC EulerMidpoint() IS IF VAR a = (-164.4, -182.8), b = (187.8, -78.12), c = (19.69, 149.4), d ~ (11.7, -130.5), e ~ (103.7, 35.64), f ~ (-72.35, -16.7), g ~ (95.47, -105.6), h ~ (113.5, 22.5), i ~ (-37.27, 46.61), j ~ (67.5, -11.45), k ~ (-12.2, -50.03), l ~ (27.65, -30.74) IN d = Geometry.Mid(a, b) AND e = Geometry.Mid(b, c) AND f = Geometry.Mid(a, c) AND g = PerpPoint(a, b, c) AND h = PerpPoint(b, c, a) AND i = PerpPoint(c, a, b) AND Geometry.Colinear(c, j, g) AND Geometry.Colinear(i, j, b) AND Angle.Right(a, d, k) AND Angle.Right(c, f, k) AND l = Geometry.Mid(j, k) -> SAVE PS IN PS.SetColor(SoftRed); DrawPerp(a, g, c); DrawPerp(b, h, a); DrawPerp(c, i, b); Connect3(b, i, j); Connect3(c, g, j); Connect3(a, h, j) END; SAVE PS IN PS.SetColor(SoftBlue); DrawPerp(a, d, k); DrawPerp(c, f, k); DrawPerp(b, e, k) END; SAVE PS IN Triangle.Draw(a, b, c); PS.SetWidth(2); PS.Stroke() END; SAVE PS IN PS.MoveTo(j); PS.LineTo(k); PS.SetWidth(1.5 * LightWidth); PS.SetColor(Color.Black); PS.Stroke() END; PtLabel.SetDotSize(4); SAVE PS IN PS.SetColor(SoftGreen); PtLabel.None(l); PS.SetColor(Color.Red); PtLabel.None(i); PtLabel.None(h); PtLabel.None(g); PtLabel.None(j); PS.SetColor(Color.Blue); PtLabel.None(d); PtLabel.None(e); PtLabel.None(f); PtLabel.None(k) END END FI END; UI Template(EulerMidpoint); PROC Feuerbach() IS IF VAR a = (-164.4, -182.8), b = (187.8, -78.12), c = (19.69, 149.4), d ~ (11.7, -130.5), e ~ (103.7, 35.64), f ~ (-72.35, -16.7), g ~ (95.47, -105.6), h ~ (113.5, 22.5), i ~ (-37.27, 46.61), j ~ (67.5, -11.45), k ~ (-12.2, -50.03), l ~ (27.65, -30.74) IN d = Geometry.Mid(a, b) AND e = Geometry.Mid(b, c) AND f = Geometry.Mid(a, c) AND g = PerpPoint(a, b, c) AND h = PerpPoint(b, c, a) AND i = PerpPoint(c, a, b) AND Geometry.Colinear(c, j, g) AND Geometry.Colinear(i, j, b) AND Angle.Right(a, d, k) AND Angle.Right(c, f, k) AND l = Geometry.Mid(j, k) -> SAVE PS IN PS.SetColor(SoftRed); DrawPerp(a, g, c); DrawPerp(b, h, a); DrawPerp(c, i, b); Connect3(b, i, j); Connect3(c, g, j); Connect3(a, h, j) END; SAVE PS IN PS.SetColor(SoftBlue); DrawPerp(a, d, k); DrawPerp(c, f, k); DrawPerp(b, e, k) END; SAVE PS IN Triangle.Draw(a, b, c); PS.SetWidth(2); PS.Stroke() END; SAVE PS IN PS.MoveTo(j); PS.LineTo(k); PS.SetWidth(1.5 * LightWidth); PS.SetColor(Color.Black); PS.Stroke() END; PtLabel.SetDotSize(4); SAVE PS IN PS.SetColor(SoftGreen); PtLabel.None(l); Circle.Draw(l, e); PS.Stroke(); PS.SetColor(Color.Red); PtLabel.None(i); PtLabel.None(h); PtLabel.None(g); PtLabel.None(j); PS.SetColor(Color.Blue); PtLabel.None(d); PtLabel.None(e); PtLabel.None(f); PtLabel.None(k) END END FI END; UI Template(Feuerbach); PROC NinePoint() IS IF VAR a = (-164.4, -182.8), b = (187.8, -78.12), c = (19.69, 149.4), d ~ (11.7, -130.5), e ~ (103.7, 35.64), f ~ (-72.35, -16.7), g ~ (95.47, -105.6), h ~ (113.5, 22.5), i ~ (-37.27, 46.61), j ~ (67.5, -11.45), k ~ (-12.2, -50.03), l ~ (27.65, -30.74), m ~ (-48.45, -97.13), n ~ (127.6, -44.79), o ~ (43.59, 68.97) IN d = Geometry.Mid(a, b) AND e = Geometry.Mid(b, c) AND f = Geometry.Mid(a, c) AND g = PerpPoint(a, b, c) AND h = PerpPoint(b, c, a) AND i = PerpPoint(c, a, b) AND Geometry.Colinear(c, j, g) AND Geometry.Colinear(i, j, b) AND Angle.Right(a, d, k) AND Angle.Right(c, f, k) AND l = Geometry.Mid(j, k) AND m = Geometry.Mid(a, j) AND n = Geometry.Mid(b, j) AND o = Geometry.Mid(c, j) -> SAVE PS IN PS.SetColor(SoftRed); DrawPerp(a, g, c); DrawPerp(b, h, a); DrawPerp(c, i, b); Connect3(b, i, j); Connect3(c, g, j); Connect3(a, h, j) END; SAVE PS IN PS.SetColor(SoftBlue); DrawPerp(a, d, k); DrawPerp(c, f, k); DrawPerp(b, e, k) END; SAVE PS IN Triangle.Draw(a, b, c); PS.SetWidth(2); PS.Stroke() END; SAVE PS IN PS.MoveTo(j); PS.LineTo(k); PS.SetWidth(1.5 * LightWidth); PS.SetColor(Color.Black); PS.Stroke() END; PtLabel.SetDotSize(4); SAVE PS IN PS.SetColor(SoftGreen); PtLabel.None(l); PtLabel.None(m); PtLabel.None(n); PtLabel.None(o); Circle.Draw(l, e); PS.Stroke(); PS.SetColor(Color.Red); PtLabel.None(i); PtLabel.None(h); PtLabel.None(g); PtLabel.None(j); PS.SetColor(Color.Blue); PtLabel.None(d); PtLabel.None(e); PtLabel.None(f); PtLabel.None(k) END END FI END; UI Template(NinePoint);