CONST LightBlue = Color.FromRGB(0, 0.5, 1), LightGreen = Color.FromRGB(0.3, 1, 0.3), DotColor = Color.Red, DotRad = 5, LineWidth = 2, ArrowFrac = 0.8, NumRows = 5, NumCols = 14, NumElts = NumRows * NumCols; PROC FillBlue() IS PS.Save(); PS.SetColor(LightBlue); PS.Fill(); PS.Restore(); PS.Stroke() END; UI PointTool(FillBlue); PROC BlueRect0(a, b) IS Rect.Draw(a, b); FillBlue() END; PROC BlueRect(a, b) IS IF VAR c ~ (0.5, 0) REL (a, b), d ~ (0.3401, -0.07203) REL (a, b), e ~ (0.6599, 0.07203) REL (a, b) IN c = Geometry.Mid(a, b) AND c = Geometry.Mid(d, e) AND Geometry.CongXY(d, e, d, e) AND Geometry.Dist(d, e) = ArrowFrac * Geometry.DistY(a, b) -> PS.Save(); PS.SetWidth(LineWidth); BlueRect0(a, b); PS.SetColor(Color.Red); Arrow.Straight(d, e); PS.Restore() END FI END; PROC Scene0(o, b, d) IS IF VAR a = Geometry.Mid(b, c), c ~ (-0.8063, -3.618) REL (b, d) IN a VER o AND c HOR d -> BlueRect(c, b) END FI END; PROC Scene0Frame(o, b, d, t) IS Scene0(o, b, d) END; PROC an := Scene0Anim(o, b, d) IS an := (CLOSE(Scene0Frame, o, b, d), 1.5) END; PROC Scene1() IS IF VAR o = R2.Origin, b = (115.9, 159.3), d = (144.7, 101.6), f = (144.7, -56.89), c ~ (-0.8063, -3.618) REL (b, d), a = Geometry.Mid(b, c), e = Geometry.HorVer(f, o), g ~ (0.374, 0.2005) REL (b, e), h ~ R2.Plus(g, (-231.8, -57.65)), i = (-108.3, 309.5), j = (12.88, 263.2), k = (109.8, 323.1), l ~ (0, 26.38) IN a VER o AND c HOR d AND Geometry.CongY(b, c, g, h) AND c VER h AND b VER g AND l = Geometry.Mid(g, h) AND Slider.OnLine(i, j, k, a, l, e) -> BlueRect(c, b); BlueRect(h, g); Slider.Draw(i, j, k) END FI END; UI Template(Scene1); PROC MoveDown(o, b, d, f, i, j, k) IS IF VAR c ~ (-0.8063, -3.618) REL (b, d), a = Geometry.Mid(b, c), e = Geometry.HorVer(f, o), g ~ (0.374, 0.2005) REL (b, e), h ~ R2.Plus(g, (-231.8, -57.65)), l ~ (0.1083, 0.07878) REL (o, b) IN a VER o AND c HOR d AND Geometry.CongY(b, c, g, h) AND c VER h AND b VER g AND l = Geometry.Mid(g, h) AND Slider.OnLine(i, j, k, a, l, e) -> BlueRect(c, b); BlueRect(h, g); Slider.Draw(i, j, k) END FI END; UI PointTool(MoveDown); PROC MoveDownFrame(o, b, d, f, t) IS VAR i, j, k IN i := (-108.3, 309.5); k := (109.8, 323.1); j := (t, 0) REL (i, k); MoveDown(o, b, d, f, i, j, k) END END; PROC an := MoveDownAnim(o, b, d, f) IS an := (CLOSE(MoveDownFrame, o, b, d, f), 1); an := Anim.Extend(an, 2) END; PROC BlueQuad0(a, b, c, d) IS PS.MoveTo(a); PS.LineTo(b); PS.LineTo(c); PS.LineTo(d); PS.Close(); FillBlue() END; UI PointTool(BlueQuad0); PROC BlueQuad(a, b, c, d) IS IF VAR e = Geometry.Mid(a, b), f = Geometry.Mid(c, d), g = Geometry.Mid(e, f), h = (1, 1) REL (g, f), i ~ (0.7119, 0.06235) REL (a, c), j ~ (0.2922, -0.07568) REL (a, c) IN g = Geometry.Mid(j, i) AND Geometry.Colinear(g, i, h) AND Geometry.Dist(i, j) = ArrowFrac * Geometry.Dist(a, b) -> PS.Save(); PS.SetWidth(LineWidth); PS.SetJointStyle(PS.BevelJoints); BlueQuad0(a, b, c, d); PS.SetColor(Color.Red); Arrow.Straight(j, i); PS.Restore() END FI END; UI PointTool(BlueQuad); PROC Rotate(o, b, d, f, i, j, k) IS IF VAR c ~ (-0.8063, -3.618) REL (b, d), a = Geometry.Mid(b, c), e = Geometry.HorVer(f, o), p = Geometry.HorVer(f, b), q = (1, -1) REL (e, p), g ~ (0.2686, 0) REL (p, q), m ~ R2.Plus(g, (0, -57.65)), n ~ (0.5, 0) REL (g, m), h ~ (-1, 3.392e-8) REL (e, g), l ~ (-1, 0) REL (e, m) IN a VER o AND c HOR d AND c VER h AND b VER g AND e = Geometry.Mid(g, h) AND h VER l AND g VER m AND Geometry.CongY(b, d, l, h) AND Geometry.CongY(b, d, g, m) AND n = Geometry.Mid(g, m) AND b VER q AND Geometry.CongXY(e, p, p, q) AND Slider.OnLine(i, j, k, p, n, q) -> BlueRect(c, b); Slider.Draw(i, j, k); BlueQuad(h, l, g, m) END FI END; UI PointTool(Rotate); PROC RotateFrame(o, b, d, f, t) IS VAR i, j, k IN i := (-108.3, 309.5); k := (109.8, 323.1); j := (t, 0) REL (i, k); Rotate(o, b, d, f, i, j, k) END END; PROC an := RotateAnim(o, b, d, f) IS an := (CLOSE(RotateFrame, o, b, d, f), 1); an := Anim.Extend(an, 2) END; PROC DrawLine(a, b) IS PS.Save(); PS.SetWidth(LineWidth); PS.MoveTo(a); PS.LineTo(b); PS.Stroke(); PS.Restore() END; UI PointTool(DrawLine); PROC OpenEnds(o, b, d, f, i, j, k) IS IF VAR c ~ (-0.8063, -3.618) REL (b, d), a = Geometry.Mid(b, c), e = Geometry.HorVer(f, o), p = Geometry.HorVer(f, b), q = (1, -1) REL (e, p), g ~ (0.7513, 0) REL (p, q), h ~ (-1, 0) REL (e, g), l ~ (-1, 0) REL (e, r), m ~ (0.1751, -0.2604) REL (q, p), n ~ (-1, 0) REL (e, m), r ~ (-1, 0) REL (q, g) IN a VER o AND c HOR d AND c VER h AND b VER g AND e = Geometry.Mid(g, h) AND e = Geometry.Mid(r, l) AND e = Geometry.Mid(m, n) AND Geometry.CongY(b, d, g, r) AND Slider.OnQuarter(i, j, k, r, g, m) AND q = Geometry.Mid(g, r) -> BlueRect(c, b); Slider.Draw(i, j, k); BlueQuad(h, l, g, r); DrawLine(r, m); DrawLine(l, n) END FI END; UI PointTool(OpenEnds); PROC OpenEndsFrame(o, b, d, f, t) IS VAR i, j, k IN i := (-108.3, 309.5); k := (109.8, 323.1); j := (t, 0) REL (i, k); OpenEnds(o, b, d, f, i, j, k) END END; PROC an := OpenEndsAnim(o, b, d, f) IS an := (CLOSE(OpenEndsFrame, o, b, d, f), 1); an := Anim.Extend(an, 2) END; PROC FillGreen() IS PS.Save(); PS.SetColor(LightGreen); PS.Fill(); PS.Restore(); PS.Stroke() END; UI PointTool(FillGreen); PROC GreenTri(a, b, c) IS PS.Save(); PS.MoveTo(a); PS.LineTo(b); PS.LineTo(c); PS.Close(); PS.SetWidth(LineWidth); PS.SetJointStyle(PS.BevelJoints); FillGreen(); PS.Restore() END; UI PointTool(GreenTri); PROC BlueHorQuad(a, b, c, d, e, f) IS IF VAR g = Geometry.Mid(a, c), i ~ (0.658, -0.02696) REL (a, c), j ~ (0.342, 0.02696) REL (a, c) IN g = Geometry.Mid(j, i) AND Geometry.Dist(i, j) = ArrowFrac * Geometry.Dist(e, f) AND g HOR i -> PS.Save(); PS.SetWidth(LineWidth); PS.SetJointStyle(PS.BevelJoints); BlueQuad0(a, b, c, d); PS.SetColor(Color.Red); Arrow.Straight(j, i); PS.Restore() END FI END; UI PointTool(BlueHorQuad); PROC DelayFrame(an, pause, t) IS APPLY(CAR(an), MAX(0, t - pause)) END; PROC an := Delay(a, pause) IS an := (CLOSE(DelayFrame, a, pause), pause + CDR(a)) END; PROC Squish(o, b, d, f, i, j, k) IS IF VAR c ~ (-0.8063, -3.618) REL (b, d), a = Geometry.Mid(b, c), e = Geometry.HorVer(f, o), p = Geometry.HorVer(f, b), q = (1, -1) REL (e, p), g ~ (0.7513, 0) REL (p, q), r ~ (-1, -0) REL (q, g), h ~ (-1, 0) REL (e, g), l ~ (-1, 5.683e-8) REL (e, r), m = (-2.647e-7, -1) REL (r, g), n = (-1, 0) REL (e, m), s ~ (0.5, 0.5) REL (r, h), t ~ (0.7708, 0) REL (s, r), u ~ R2.Plus(t, (57.65, 0)), v ~ (-0.2487, 0) REL (h, t), w ~ R2.Plus(v, (57.65, 0)), x ~ (0.2292, 1) REL (t, u) IN a VER o AND c HOR d AND c VER h AND b VER g AND Geometry.CongY(b, d, g, r) AND q = Geometry.Mid(g, r) AND s = Geometry.HorVer(r, h) AND Slider.OnLine(i, j, k, r, t, s) AND u HOR r AND Geometry.CongX(t, u, r, m) AND v HOR l AND l HOR w AND Geometry.Colinear(v, h, t) AND Geometry.CongX(v, w, r, m) AND Geometry.Colinear(w, x, u) AND x HOR g AND q = Geometry.Mid(g, r) AND e = Geometry.Mid(g, h) AND e = Geometry.Mid(r, l) -> BlueRect(c, b); Slider.Draw(i, j, k); BlueHorQuad(h, w, x, t, r, m); GreenTri(h, v, w); GreenTri(x, u, t) END FI END; UI PointTool(Squish); PROC SquishFrame(o, b, d, f, t) IS VAR i, j, k IN i := (-108.3, 309.5); k := (109.8, 323.1); j := (t, 0) REL (i, k); Squish(o, b, d, f, i, j, k) END END; PROC an := SquishAnim(o, b, d, f) IS an := (CLOSE(SquishFrame, o, b, d, f), 1); an := Anim.Extend(an, 2); an := Delay(an, 1.5) END; FUNC p = Loc(x, y, a, b, c) IS (E bVec, i, cVec, j :: bVec = R2.Minus(b, a) AND i = R2.Times(1 / NumCols, bVec) AND cVec = R2.Minus(c, a) AND j = R2.Times(1 / NumRows, cVec) AND p = R2.Plus(a, R2.Plus(R2.Times(x + 0.5, i), R2.Times(y + 0.5, j)))) END; PROC DrawDot(p) IS SAVE PS IN PS.SetColor(DotColor); Circle.Draw(p, R2.PlusX(p, DotRad)); PS.Fill() END END; UI PointTool(Go); PROC PtsFrame0(xx, yy, o, b, d) IS IF VAR c ~ (-0.8063, -3.618) REL (b, d), a = Geometry.Mid(b, c), i = Geometry.HorVer(b, c) IN a VER o AND c HOR d -> BlueRect(c, b); DrawDot(Loc(yy, xx, i, b, c)) END FI END; PROC PtsFrame(xx, yy, o, b, d, f) IS IF VAR c ~ (-0.8063, -3.618) REL (b, d), a = Geometry.Mid(b, c), e = Geometry.HorVer(f, o), p = Geometry.HorVer(f, b), q = (1, -1) REL (e, p), g ~ (0.7513, 0) REL (p, q), r ~ (-1, -0) REL (q, g), h ~ (-1, 0) REL (e, g), l ~ (-1, 0) REL (e, r), m = (0, -1) REL (r, g), n = (-1, 0) REL (e, m), s ~ (0.5, 0.5) REL (r, h), t ~ (0, 0) REL (s, r), u ~ R2.Plus(t, (57.65, 0)), v ~ (-0.2487, 0) REL (h, t), w ~ R2.Plus(v, (57.65, 0)), x ~ (1, 1) REL (t, u) IN a VER o AND c HOR d AND c VER h AND b VER g AND Geometry.CongY(b, d, g, r) AND q = Geometry.Mid(g, r) AND s = Geometry.HorVer(r, h) AND t = s AND u HOR r AND Geometry.CongX(t, u, r, m) AND v HOR l AND l HOR w AND Geometry.Colinear(v, h, t) AND Geometry.CongX(v, w, r, m) AND Geometry.Colinear(w, x, u) AND x HOR g AND q = Geometry.Mid(g, r) AND e = Geometry.Mid(g, h) AND e = Geometry.Mid(r, l) -> PtsFrame0(xx, yy, o, b, d); BlueHorQuad(h, w, x, t, r, m); GreenTri(h, v, w); GreenTri(x, u, t); DrawDot(Loc(yy, xx, w, x, h)) END FI END; PROC i, j := CantorInv(x) IS VAR y IN y := (NumRows * (NumRows - 1)) / 2; IF x < y -> VAR n, nn IN IF x = 0 -> n := 0 | n := FLOOR(Math.Sqrt(2 * x)) FI; nn := (n * (n + 1)) / 2; DO x < nn -> n := n - 1; nn := (n * (n + 1)) / 2 OD; j := x - nn; i := n - j END | NumElts - y <= x -> i, j := CantorInv(NumElts - 1 - x); i, j := NumRows - i - 1, NumCols - j - 1 | VAR diff, n, mod IN diff := x - y; n := diff DIV NumRows; mod := diff MOD NumRows; i, j := NumRows - mod - 1, n + mod END FI END END; PROC MoveDots0(o, b, d, a, c, e) IS VAR t, tt, xx, yy IN t := Slider.Value(a, c, e); tt := MIN(NumElts - 1, MAX(0, ROUND((t * NumElts) - 0.5))); xx, yy := CantorInv(tt); PtsFrame0(xx, yy, o, b, d); Slider.Draw(a, c, e) END END; UI PointTool(MoveDots0); PROC MoveDotsFrame0(o, b, d, t) IS VAR a, e, c IN a := (-106, 276.1); e := (113.6, 290.5); c := (t, 0) REL (a, e); MoveDots0(o, b, d, a, c, e) END END; PROC an := MoveDotsAnim0(o, b, d) IS an := (CLOSE(MoveDotsFrame0, o, b, d), 1); an := Anim.Scale(an, 6) END; PROC MoveDots(o, b, d, f, a, c, e) IS VAR t, tt, xx, yy IN t := Slider.Value(a, c, e); tt := MIN(NumElts - 1, MAX(0, ROUND((t * NumElts) - 0.5))); xx, yy := CantorInv(tt); PtsFrame(xx, yy, o, b, d, f); Slider.Draw(a, c, e) END END; UI PointTool(MoveDots); PROC MoveDotsFrame(o, b, d, f, t) IS VAR a, e, c IN a := (-106, 276.1); e := (113.6, 290.5); c := (t, 0) REL (a, e); MoveDots(o, b, d, f, a, c, e) END END; PROC an := MoveDotsAnim(o, b, d, f) IS an := (CLOSE(MoveDotsFrame, o, b, d, f), 1); an := Anim.Scale(an, 6) END; PROC an := WholeAnim(o, b, d, f) IS an := Scene0Anim(o, b, d); an := Anim.Seq(an, MoveDotsAnim0(o, b, d)); an := Anim.Seq(an, MoveDownAnim(o, b, d, f)); an := Anim.Seq(an, RotateAnim(o, b, d, f)); an := Anim.Seq(an, OpenEndsAnim(o, b, d, f)); an := Anim.Seq(an, SquishAnim(o, b, d, f)); an := Anim.Seq(an, MoveDotsAnim(o, b, d, f)) END; PROC Go() IS IF VAR o = (0, 0), b = (116.6, 197.2), d = R2.Plus(b, (27.27, -84.19)), f = (144.7, -99.36) IN SAVE Slider IN SAVE Anim IN Slider.SetVisibility(Slider.Invisible); Anim.SetTFactor(2); Anim.Play(WholeAnim(o, b, d, f)) END END END FI END;