numpy+matplotlibでトロコイド曲線

wikipedia:トロコイドを参考にして。数式打ち込むだけで芸はない。

Trochoid


import numpy as np
from matplotlib import pyplot as plt

RANGE = 0.001
rm = 1.
rds = [1./5., 1./2., 1., 2., 3.]
sita = np.arange(-8., 8., RANGE)
for rd in rds:
    x = rm * sita - rd * np.sin(sita)
    y = rm - rd * np.cos(sita)
    plt.plot(x, y)

plt.legend(rds)
plt.axhline(color="black")
plt.axvline(color="black")
plt.show()

Epitrochoid

import numpy as np
from matplotlib import pyplot as plt

RANGE = 0.001
rc = 3.
rm = 1.
rd = 0.5
sita = np.arange(-np.pi, np.pi, RANGE)
x = (rc + rm) * np.cos(sita) - rd * np.cos((rc+rm)/rm*sita)
y = (rc + rm) * np.sin(sita) - rd * np.sin((rc+rm)/rm*sita)
plt.plot(x, y, "r", rc*np.cos(sita), rc*np.sin(sita), "b")

plt.axhline(color="black")
plt.axvline(color="black")
plt.show()

Hypotrochoid

これについてはパラメータを変更するとそれなりに変化があって面白い。

import numpy as np
from matplotlib import pyplot as plt

RANGE = 0.001
rc = 5.
rm = 3.
rd = 5.
sita = np.arange(0., np.pi*6, RANGE)
x = (rc - rm) * np.cos(sita) + rd * np.cos((rc-rm)/rm*sita)
y = (rc - rm) * np.sin(sita) - rd * np.sin((rc-rm)/rm*sita)
plt.plot(x, y, "r", rc*np.cos(sita), rc*np.sin(sita), "b")

plt.axhline(color="black")
plt.axvline(color="black")
plt.show()

すわっとアニメーションさせるとこんな感じ。

続けるとしたら以下のサイトを見ながら描いていこうかしら。
Wolfram Math World:Hypotrochoid
wikipedia:Spirograph
Wolfram Math World:Spirograph