CONST Radius = 10; PROC MoveBallFrame(a, b, dur, t) IS SAVE PS IN Circle.DrawR((t / dur, 0) REL (a, b), Radius); PS.SetColor(Color.Red); PS.Fill() END END; PROC an := MoveBall(a, b, dur) IS an := (CLOSE(MoveBallFrame, a, b, dur), dur) END; PROC an := CoExtend(a1, a2) IS IF CDR(a1) < CDR(a2) -> a1 := Anim.Extend(a1, CDR(a2)) | CDR(a1) > CDR(a2) -> a2 := Anim.Extend(a2, CDR(a1)) | SKIP FI; an := Anim.Co(a1, a2) END; PROC DrawExtended(an, t) IS APPLY(CAR(an), MIN(CDR(an), t)) END; PROC CoExtendFrame(a1, a2, t) IS DrawExtended(a1, t); DrawExtended(a2, t) END; PROC an := CoExtend2(a1, a2) IS an := (CLOSE(CoExtendFrame, a1, a2), MAX(CDR(a1), CDR(a2))) END; PROC Cmd0() IS IF VAR a ~ (-65.89, 120.6), b ~ (-71.19, -30.34), an1, an2, c ~ (41.66, -41.72) IN an1 := MoveBall(a, b, 1); an2 := MoveBall(a, c, 1); Anim.Play(Anim.Co(Anim.Extend(an1, 1.5), Anim.Seq(Anim.Skip(0.5), an2))) END FI END;