次摆线(Trochoid)
此文为旧博客搬运。 ——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$ 时的次摆线(也称长幅摆线) |