内トロコイド(ハイポトロコイド)の求め方

投稿日: 投稿者: Shiki

子どもの頃、下の写真のようなおもちゃで遊んだ人も多いのではないでしょうか?


I, Alexei Kouprianov, CC 表示 2.5

画像おもちゃはスピログラフ と言う名前で、内側の歯車の穴にペン先を入れて、外側の歯車に噛み合うようにグルグルと回すと奇麗な幾何学模様が現れます。

スピログラフという名は商標名なのですが、このスピログラフで描かれる曲線を数学用語では内トロコイドまたはハイポトロコイド(hypotrochoid)と呼ぶそうです。

昔よく遊んだなぁと思いながら、コンピュータ上で描いてみました。

内トロコイド計算のお試しがてら、基本的な特性を軽く調べてみた動画がこちらです。


曲線の方程式はWikipedia に載っているので、それを写せばすぐに計算できるのですが、方程式を理解するためにも始めから求めてみました。

方程式の求め方

基準となる位置を定めるため図1を初期位置とします。

内円が外円に沿って転がると図2のようになります。 このとき角度 θ\theta まで滑らずに転がったときの点 DD の位置を求めます。 OfO_f を原点とし、便利なため、複素平面で考えます。虚数単位は jj で表します。

外円の半径をRfR_f、内円の半径をRrR_r実軸OfOr\angle \text{実軸} O_f O_rθ\thetaとするとOrO_rの位置は

Or=(RfRr)exp(θj)(1)\begin{aligned} O_r = (R_f - R_r)\exp(\theta j) \tag{1} \end{aligned}

BOrD\angle BO_rDθ\theta'OrO_rから点DDまでの距離をRdR_dとすると、点DDの位置は

D=Or+Rdexp(θj)(2)\begin{aligned} D &=& O_r + R_d \exp(-\theta' j) \tag{2} \end{aligned}

内円が図2まで転がったときの外円と内円が接した長さは

Rfθ=Rr(AOrB+θ)=Rr(θ+θ)(3)\begin{aligned} R_f \theta &=& R_r (\angle AO_rB+\theta') &=& R_r (\theta+\theta') \tag{3} \end{aligned}

となるので、

θ=RfRrRrθ=(RfRr1)θ (4)\begin{aligned} \theta' &=& \frac{R_f - R_r}{R_r} \theta &=& (\frac{R_f}{R_r}-1) \theta\ \tag{4} \end{aligned}

となり、式(2)に式(1),(4)を代入すると点DDの位置は

D=Or+Rdexp((RfRr1)θj)=(RfRr)exp(θi)+Rdexp((1RfRr)θj)(5)\begin{aligned} D &=& O_r + R_d \exp(-(\frac{R_f}{R_r}-1) \theta j) \\ &=& (R_f - R_r)\exp(\theta i) + R_d \exp((1 - \frac{R_f}{R_r}) \theta j) \tag{5} \end{aligned}

となります。これをxyxy平面に直すと、

D={x=Re(D)=(RfRr)cosθ+Rdcos((1RfRr)θ)y=Im(D)=(RfRr)sinθ+Rdsin((1RfRr)θ)(6)\begin{aligned} & D = \\ & \begin{cases} x = \mathrm{Re}(D) = (R_f - R_r) \cos \theta + R_d \cos ((1 - \frac{R_f}{R_r})\theta)\\ y = \mathrm{Im}(D) = (R_f - R_r) \sin \theta + R_d \sin ((1 - \frac{R_f}{R_r})\theta)\\ \end{cases} \tag{6} \end{aligned}

となります。

元の位置に戻るために必要な周回数

こちらの動画を見て頂くと分かりやすいですが、点DDは内円が外円を一周すると元に戻るとは限らず、RfR_fRrR_rの関係で必要な周回数が変わってきます。


そこで本節では点DDが元の位置に戻るために必要な周回数NNを求めてみます。

内円が元の位置に戻るときのθ\theta

θ=2πN(NZ(整数))(7)\theta = 2\pi N (N \in\mathbb{Z}(\text{整数})) \tag{7}

このとき、点DDが元に戻る場合の関係式は

(1RfRr)θ=(1RfRr)2πN=2πM(MZ)(8)\begin{aligned} (1-\frac{R_f}{R_r})\theta = (1-\frac{R_f}{R_r}) 2\pi N = 2 \pi M \\ (M \in\mathbb{Z}) \tag{8} \end{aligned}

となり、 Rf,RrR_f, R_r が自然数の場合は

(1RfRr)NZNZよりRfRrNZ(9)\begin{aligned} &(1-\frac{R_f}{R_r}) N \in\mathbb{Z}\\ N \in\mathbb{Z}\text{より} &\\ &\frac{R_f}{R_r} N \in\mathbb{Z} \tag{9} \end{aligned}

RfR_fRrR_r の最大公約数を gg とし、 Rf=mgR_f=mgRr=ngR_r=ng とおくと (m,n,gm,n,gは自然数)

RfRrN=mgngN=mnNZ(10)\frac{R_f}{R_r} N = \frac{mg}{ng}N = \frac{m}{n}N \in\mathbb{Z} \tag{10}

となることから

N=ni(11)N = ni \tag{11}

となります。 これより、必要な最低周回数はnnとなります。 nnをプログラムで求める手順は2通りあり、pythonの場合はnumpyの最大公約数を求める関数gcdか最小公倍数を求めるlcmを使って求めます。

import numpy as np
#gcdの場合
Rr/np.gcd(Rf, Rr)
#lcmの場合
np.lcm(Rf, Rr)/Rf

gcd(mgmg, ngng)からは gg が求まり、lcm(mgmg, ngng)からは nmgnmg が求まるので、 Rr=ngR_r = ng から gg を割るか nmgnmg から Rf=mgR_f = mg を割ることで nn が求まります。

以上のように、方程式と周回数が求まると図3のような図形を描くことができます。

余談ですが、点 DD が内円を回る回数は式 (8), (11) より

M=(1mgng)ni=nimi=(nm)i(12)M = (1 - \frac{mg}{ng})*ni = ni - mi = (n-m)i \tag{12}

となります。

いろいろな条件による計算結果

求めた関係式を使って様々な条件で計算してみました。その結果動画を紹介します。補足ですが、時計回りに内円を転がしたかったので、縦が実軸(XX)、横が虚軸(YY)になっています。

糸かけ曼荼羅風


以前つくった糸かけ曼荼羅 : 素数ピッチ の動画を模してみたのですが、結構近しいものが出来ました。必要な周回数を周回させると時間がかかるので、代わりに点 DD を増やして計算しています。車輪が転がるように見えるのも面白いです。

点描画


線ではなく一定間隔Δθ\Delta \thetaで点を打っていく描画方法です。この動画は一例ですが Δθ\Delta \theta の値を変えるだけでも模様が変わってきます。

転がる円の半径を変化させる


転がる円の半径 RrR_r を変化させていく場合です。実物ではできませんが、シミュレーションでは動画のように RrR_rRfR_f より大きくすることもできます。

OrO_r から点 DD までの距離 RdR_d を変化させる


RdR_d をだんだんと大きく変化させる場合です。こちらもシミュレーションなので RdR_dRrR_r より大きくすることができます。前半と後半で様相ががらりと変わるのがお気に入りです。

内円の中でさらに円を転がしてみる


内円の中にさらに円を転がし、その円の中心を基点として点DDの軌跡を描く計算です。先行研究で名前があると思いますが、すぐに見つけられなかったので「内々トロコイド」を名付けておきました。本記事の式だけではこの計算はできないので、別途記事にする予定です。

終わり。

<関連記事>