"行ったり来たり"と"回転運動"

# 背景
面白い記事を見つけた。

https://qiita.com/kenji-kondo/items/91ae417ad858ec4652e7

どうしてこのようなことが起こるのか自分できちんと計算して納得したい。

# 計算
円を構成する各点の位置を経時的に追えばよい。
円の中心座標を$(x_0, y_0)$とし、角速度$\omega$で円運動させる。時刻$t$における中心座標は、
```math
\begin{aligned}
x_0(t) &= R_0 \cos\omega t \\
y_0(t) &= R_0 \sin\omega t 
\end{aligned}
```
であらわされる。ただし、$R_0$は円運動の半径である。
円の１点に注目して、その動きを追う。円の各点は、$(x_0, y_0)$を原点に取った極座標において、角度$\phi$で区別することが出来る。$t=0$で角度$\phi_0$の点の位置は
```math
\begin{aligned}
x(t) &= R\cos\phi (t) + x_0(t) \\
y(t) &= R\sin\phi (t) + y_0(t) \\
\phi(0) &= \phi_0
\end{aligned}
```
で与えられる。

ここで、単振動について考えてみる。角度$\theta$で単振動する点の位置は、
```math
\begin{aligned}
x(t) &= r(t) \cos\theta \\
y(t) &= r(t) \sin\theta \\
r(t) &= \sin\omega t 
\end{aligned}
```
のようにあらわされる。

これを踏まえて元の問題に戻る。
```math
\begin{aligned}
x(t) &= R\cos\phi (t) + x_0(t) = R\cos\phi (t) + R_0 \cos\omega t \\
y(t) &= R\sin\phi (t) + y_0(t) = R\sin\phi (t) + R_0 \sin\omega t\\
\phi(t) &= \phi_0
\end{aligned}
```
が単振動となるように$R_0, \phi(t)$を設定したい。
三角関数の合成を行い、$x(t), y(t)$を$\sin$であらわす。単振動となるように、少々発見的であるが、
```math
\begin{aligned}
\phi(t) &= -\omega t + \phi_0 \\
R_0 &= R
\end{aligned}
```
とする。これを代入すれば、
```math
\begin{aligned}
x(t) &= R(\cos\phi_0+1)\cos\omega t + R\sin\phi_0\sin\omega t \\
y(t) &= R\sin\phi_0\cos\omega t  + R(-\cos\phi_0+1)\sin\omega t\\
\end{aligned}
```
となる。三角関数の合成により、
```math
\begin{aligned}
x(t) &= \sqrt{R^2(\cos\phi_0+1)^2 + R^2\sin^2\phi_0}\sin\left[\omega t + \tan^{-1}\frac{(\cos\phi_0+1)}{\sin\phi_0}\right]\\
y(t) &= \sqrt{R^2(-\cos\phi_0+1)^2 + R^2\sin^2\phi_0}\sin\left[\omega t + \tan^{-1}\frac{\sin\phi_0}{(-\cos\phi_0+1)}\right]\\
\end{aligned}
```
となる($\sin\phi_0>0$のとき。そうでないときは位相に$+\pi$する)。実は、
$$
\frac{(\cos\phi_0+1)}{\sin\phi_0} = \frac{\sin\phi_0}{(-\cos\phi_0+1)}
$$
が成立するため、上式は単振動となっている。単振動の初期位相と角度が$\phi_0$に依存する形となっており、それぞれ、
```math
\begin{aligned}
\tan^{-1}\frac{(\cos\phi_0+1)}{\sin\phi_0} \\
\tan^{-1}\frac{\sqrt{(-\cos\phi_0+1)^2 + \sin^2\phi_0}}{\sqrt{(\cos\phi_0+1)^2 + \sin^2\phi_0}}
\end{aligned}
```
となる。

# 動画を作ってみる
processingを使って動画を作ってみる。versionは4.2。
```
int width = 1000;
int height = 1000;

void settings()
{
  size(width, height);
}

int N = 7; // 玉の数
float dt = 0.05;
float w = 1; // 角速度
float R = 100;
float R0 = R;
float t = 0;

void draw()
{
  background(0);
  translate(width/2, height/2);
  noFill();
  circle(0,0,4.*R); // 直径を指定
  for(int n=0; n<N; n++)
  {
    float phi0 = 2*PI/float(N)*n;
    float phi = -w * t + phi0;
    float x = R*cos(phi) + R0*cos(w*t);
    float y = R*sin(phi) + R0*sin(w*t);
    stroke(255,255,255);
    circle(x, y, 10);
  
    float theta0 = atan2((cos(phi0)+1) ,  sin(phi0));
    circle(0,0,(4*R*sin(theta0))); // 初期位置
    
    line(0,0,500,500*sqrt((-cos(phi0)+1)*(-cos(phi0)+1)+sin(phi0)*sin(phi0))/sqrt((cos(phi0)+1)*(cos(phi0)+1)+sin(phi0)*sin(phi0)));
    line(-500,-500*sqrt((-cos(phi0)+1)*(-cos(phi0)+1)+sin(phi0)*sin(phi0))/sqrt((cos(phi0)+1)*(cos(phi0)+1)+sin(phi0)*sin(phi0)),0,0);
    line(0,0,500,-500*sqrt((-cos(phi0)+1)*(-cos(phi0)+1)+sin(phi0)*sin(phi0))/sqrt((cos(phi0)+1)*(cos(phi0)+1)+sin(phi0)*sin(phi0)));
    line(-500,500*sqrt((-cos(phi0)+1)*(-cos(phi0)+1)+sin(phi0)*sin(phi0))/sqrt((cos(phi0)+1)*(cos(phi0)+1)+sin(phi0)*sin(phi0)),0,0);
  }
  t += dt;
  saveFrame("frames/####.png");
}
```
<iframe width="560" height="315" src="https://www.youtube.com/embed/txnTtQY_J1U?si=qvlS8K5eqTt3UDbb" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>