此文为旧博客搬运。 ——2020.05.17

想到次摆线的情况是这样的:在海边散步时想到了海啸,然后想到了海波的传播情况,而简单海波可以用次摆线来近似。关于海波、海啸以及各种不同的“摆线”的情况,以后有空再写。

所谓次摆线,就是当圆沿一直线运动时,圆平面内一固定点的轨迹。针对如图所示圆心在横轴上的圆及其上一点(红点),假定圆的半径为 $a​$,圆点到圆心的距离为 $b​$,圆顺时针转动的角速度为 $\omega​$,初始红点在 $(0,b)​$ 位置,则 $t​$ 时刻圆点的坐标为:

\[\begin{align} x(t) &= b \sin \omega t + a\omega t \\\\ y(t) &= b \cos \omega t \end{align}\]

圆点的横坐标变化除了转动引起外,还有(因转动引起的)平动,纵坐标则只有转动引起变化。

在Mathematica里面可以用下面代码简单画出

a = 1;
b = 0.5;
\[Omega] = 1.;
x[a_, b_, \[Omega]_, t_] := b Sin[\[Omega] t] + a \[Omega] t
y[a_, b_, \[Omega]_, t_] := b Cos[\[Omega] t]
rad = {Thin, Blue, Line[{{0, 0}, {0, b}}]};
cir0 = Circle[{0, 0}, a];
ptb = {PointSize[Medium], Red, Point[{0, b}]};
pt2 = {PointSize[Small], Blue, Point[{0, 0}]};
cir1 = {rad, cir0, ptb, pt2};
ani = Animate[
  Show[Graphics[{Rotate[
      Translate[cir1, {a \[Omega] t, 0}], -\[Omega] t, {a \[Omega] t, 
       0}]}, Axes -> {True, False}, 
    PlotRange -> {{-Pi, 7 Pi}, {-1.5, 1.5}}], 
   ParametricPlot[{x[a, b, \[Omega], t0], y[a, b, \[Omega], t0]}, {t0,
      0, t}, PlotStyle -> {Thin, Red}]], {t, 0.0001, 6 Pi}]

注意渲染动画时,假定圆先作平动(Translate),再作转动(Rotate),要不然不容易确定转动的中心。

如果需要导出用于网页的 gif,可用如下代码:

frame[t_] := 
 Show[Graphics[{Rotate[
     Translate[cir1, {a \[Omega] t, 0}], -\[Omega] t, {a \[Omega] t, 
      0}]}, Axes -> {True, False}, 
   PlotRange -> {{-Pi, 7 Pi}, {-1.5, 1.5}}, ImageSize -> 600], 
  ParametricPlot[{x[a, b, \[Omega], t0], y[a, b, \[Omega], t0]}, {t0, 
    0, t}, PlotStyle -> {Thin, Red}]]
frames = Table[frame[t], {t, 0.0001, 6 Pi, 6 Pi/50}];
Export["anib0.5.gif", frames, "AnimationRepetitions" -> \[Infinity]]

此将动画分解成很多帧,然后再导出组合形成动画。"AnimationRepetitions" -> \[Infinity] 是为了让gif 动画不停播放。

如下分别为 $b=0.5, 1.0, 1.5$ $(b\lt a, b=a, b\gt a)$时的次摆线情况:

$b=0.5$ 时的次摆线(也称短幅摆线)
$b=1.0$ 时的摆线
$b=1.5$ 时的次摆线(也称长幅摆线)