# how to draw a moving point on a curve?

I almost remember an example that has a moving red point on a given curve, which will moving time and time again, with no controls...

now, here is my question: given a curve by

u[y_] := y^4 - 4 y^2 + 3
v[y_] := 2 y - y^3
curv=ParametricPlot[{u[y], v[y]}, {y, -2, 2}]


then, how to attach a "big red" moving point on it, which are moving again and again?

• How do we decide which curve to put the point on at say x=0? Nov 16, 2012 at 12:46

You can use Animate

u[y_] := y^4 - 4 y^2 + 3
v[y_] := 2 y - y^3
curv = ParametricPlot[{u[y], v[y]}, {y, -2, 2}];
Animate[
Show[
curv,
Graphics[{PointSize[Large], Red, Point[Dynamic[{u[t], v[t]}]]}]
]
, {t, -2, 2,AppearanceElements->None}] • can I make it without controls? Nov 16, 2012 at 12:51
• @van, you could use Table[] in place of Animate[] and export as a GIF file... Nov 16, 2012 at 12:58
• @vanabel Try Animate[Plot[Sin[x + a], {x, 0, 10}], {a, 0, 5, AppearanceElements -> None}] Nov 16, 2012 at 13:01
• I really think you should review your last solution, what you are producing is the product of an invisible element and a graph, which is perfectly valid in Mathematica, but definitely not what someone reading the code expects. When you want to tie a dynamic expression to a different display form, you should properly use DynamicWrapper. Nov 16, 2012 at 15:15
• @jVincent, Yes I'll make it more clear :)
– ssch
Nov 16, 2012 at 15:51

A potential way of doing this is by using DynamicModule to keep a scoped variable time, and use Dynamic wrapper to keep it updated:

 curve

DynamicModule[{t},
DynamicWrapper[
Show[curv, Graphics[{PointSize[Large], Red, Point[Dynamic[{u[t], v[t]}]]}]],
t = Clock[{-2, 2}]
]
]

• I like the use of Clock I couldn't figure out how to get it neat like that :)
– ssch
Nov 16, 2012 at 17:00
• Any way with Dynamic and Clock to do that yet have the point traverse the curve just once? Just as AnimationRepetitions -> 1 would do inside an Animate? Nov 16, 2012 at 18:54
• @murray Have a look at the documentation for Clock it has a quite useful span of usages. to set it to only run through the animation once in this case, simply use Clock[{-2, 2}, 4, 1]. Nov 16, 2012 at 19:02
• @jVincent: Yes, I see that Clock allows running just once. It's just that I've always been annoyed that Animate, and the Manipulate animation control, produce a loop. Nov 17, 2012 at 15:35

p=0;
t = CreateScheduledTask[p = Mod[p + 0.1, 4, -2], 0.1];

Show[
curv,
Graphics[{Red, PointSize[0.03], Dynamic@Point@{u[p], v[p]}}]
]



Stop it using:

RemoveScheduledTask[t];


Alternatively, you could use Refresh to take care of the timing.

Show[
curv,
Graphics[{Red, PointSize[0.03],
Dynamic[Refresh[p = Mod[p + 0.05, 4, -2]; Point@{u[p], v[p]},
UpdateInterval -> 0.05, TrackedSymbols -> {}]]}]
]


Note the TrackedSymbols -> {} option which prevents the p = Mod[p + 0.05, 4, -2] part from self-triggering another iteration.

It's even easier using Clock:

Show[curv,
Graphics[{Red, PointSize[0.03],
Dynamic[Point@{u[#], v[#]} &@Clock[{-2, 2, .05}, 5]]}]]


Another way to use Clock: with a Mesh + MeshFunctions combination:

 Dynamic @ ParametricPlot[{u[x], v[x]}, {x, -2, 2},
MeshFunctions -> {#3 &},
Mesh -> {{Clock[{-2, 2}]}},
MeshStyle -> {Red, PointSize[Large]}] Yet another way: Using ListAnimate:

 ListAnimate[Table[Show[ParametricPlot[{u[x], v[x]}, {x, -2, 2}],
Graphics[{PointSize[Large], Red, Point[{u[t], v[t]}]}]],
{t, -2, 2, .01}], Paneled -> False] /.
HoldPattern[AppearanceElements -> _] -> (AppearanceElements -> None) (the trick to remove AppearanceElements from Vitaly's answer to a related question.)