PRIVATE CONST A = (0, -100), B = (100, -100), C = (100, -220), DeltaT = 0.4 / 5, CurvePower = 4, showFrameNum = 0; PRIVATE VAR low := -1.2, high := 1.2, frameNum, labelPt; PRIVATE PROC ShowFrameNum() IS IF showFrameNum # 0 -> Type.R(C, Unparse.Value(frameNum)); frameNum := frameNum + 1 | SKIP FI END; PRIVATE FUNC p = P(t) IS (E t2 = t * t :: p = (t, t2 * t2) REL (A, B)) END; PRIVATE FUNC dp = DP(t) IS (E t2 = t * t :: dp = 4 * t2 * t) END; PRIVATE PRED Perp(u, v) IS CAR(u) * CAR(v) + CDR(u) * CDR(v) = 0 END; PRIVATE FUNC q = Q(t) IS (E p = P(t) :: q ~ (0, 1) REL (A, B) AND (p, q) CONG (A, B) AND Perp(R2.Minus(q, p), (1, DP(t)))) END; PRIVATE PROC DrawCurve() IS SAVE PS IN VAR t = low IN PS.MoveTo(P(t)); t := t + 0.1; DO t < high -> PS.LineTo(P(t)); t := t + 0.1 OD; PS.LineTo(P(high)) END; PS.SetWidth(3); PS.Stroke() END END; PRIVATE PROC DrawBar(t) IS SAVE PS IN VAR p, q IN p := P(t); q := Q(t); PS.MoveTo(q); PS.LineTo((-1, 0) REL (p, q)); PS.SetWidth(3); PS.Stroke() END END END; PRIVATE PROC DrawTrajectory(stop) IS VAR t = low IN PS.MoveTo(Q(t)); t := t + 0.05; DO t < stop -> PS.LineTo(Q(t)); t := t + 0.05 OD; PS.LineTo(Q(stop)) END END; PRIVATE PROC TypeFunc(p) IS SAVE PS IN PS.SetFontFace("Times-Italic"); Type.R(p, "y ="); PS.MoveTo(p); Show.L(" x"); PS.SetFont("Times-Roman", PS.GetFontSize() - 1); PS.Type(R2.Plus(PS.CurrentPoint(), (2, PS.GetFontPtSize() / 3)), Text.FromNum(CurvePower, 1)) END END; PRIVATE PROC DrawFrame(t) IS PS.SetFontSize(PS.Huge); TypeFunc(labelPt); ShowFrameNum(); DrawCurve(); SAVE PS IN PS.SetColor(Color.Red); DrawTrajectory(t); PS.Stroke() END; DrawBar(t) END; PROC Start() IS frameNum := 0; labelPt := R2.Plus((0, 10), P(low)); DrawFrame(low) END; UI PointTool(Start); PRIVATE FUNC y = Sqrt(x) IS y ~ 10 AND y * y = x END; PRIVATE FUNC d = Delta(t) IS (E dp = DP(t) :: d = DeltaT / Sqrt(1 + dp * dp)) END; PROC Go() IS frameNum := 1; labelPt := R2.Plus((0, 10), P(low)); VAR t = low IN DO t < high -> DrawFrame(t); PS.ShowPage(); PS.Reset(); t := t + Delta(t) OD; DrawFrame(high) END END; UI PointTool(Go); PROC Cmd0() IS Start() END;