PRED HorSym(a, b, c) IS c HOR b AND (c, a) CONG (a, b) END; UI PointTool(HorSym); PROC Valentine(g, m, txt) IS IF VAR a = (1.521, 0) REL (g, m), b ~ (1.838, -0.3548) REL (g, m), c ~ (1.659, -0.7405) REL (g, m), d ~ (1.248, -0.7609) REL (g, m), e ~ (0.8838, -0.7789) REL (g, m), f ~ (0.497, -0.3847) REL (g, m), h ~ (0.497, 0.3847) REL (g, m), i ~ (0.8838, 0.7789) REL (g, m), j ~ (1.248, 0.7609) REL (g, m), k ~ (1.659, 0.7405) REL (g, m), l ~ (1.838, 0.3548) REL (g, m) IN TRUE OR a VER g AND HorSym(a, b, l) AND HorSym(a, c, k) AND HorSym(a, d, j) AND HorSym(a, e, i) AND HorSym(a, f, h) AND Geometry.Colinear(c, d, e) AND a VER m -> PS.MoveTo(a); PS.CurveTo(b, c, d); PS.CurveTo(e, f, g); PS.CurveTo(h, i, j); PS.CurveTo(k, l, a); PS.SetColor(Color.Red); PS.Fill(); PS.SetColor(Color.Black); PS.SetFontSize(PS.Huge); Type.C(m, txt) END FI END; UI TextTool(Valentine); CONST Rad = 20; PROC ValenT(mid, tip, txt, dur, t) IS VAR theta, center IN theta := t / dur * 2 * Math.Pi + Math.Pi / 2; center := R2.Minus(tip, (0, Rad)); tip := R2.Plus(center, (Rad * COS(theta), Rad * SIN(theta))); Valentine(tip, mid, txt) END END; PROC an := Throb(mid, tip, txt, dur) IS an := (CLOSE(ValenT, mid, tip, txt, dur), dur) END; PROC Cmd0() IS IF VAR a ~ (-87.8563, 69.022514), b = (-87.8563, 3.792446), c = (91.64321, 69.022514), d ~ (91.64321, 3.792446), an1, an2, an3, an4 IN a HOR c AND b HOR d AND a VER b AND c VER d -> an1 := Throb(c, d, "Zeus", 1); an2 := Anim.Seq(an1, Anim.Seq(an1, an1)); an3 := Throb(a, b, "Juno-2", 2); an4 := Anim.Scale(an3, CDR(an2)); Anim.Play(Anim.Co(an2, an4)) END FI END;