曲線2(サーキット族のメタモルフォーゼ)
このページはマス旅の一部です。
教科書や図鑑では「サイクロイド」「アステロイド」「カージオド」が
それぞれ別々の公式や独立した曲線として紹介されがちです。
しかし、これらはすべて「円が滑らずに転がるとき、円周上の1点が描く軌跡
」というたった1つのメカニズムから生まれるルーレット(円転がり曲線)というファミリーです。
今回は、この「転がる系の曲線」ファミリーが、パラメータを動かすことで曲線たちがじわじわと形を変えていくメタモルフォーゼの仕組みをプログラミングで視覚化してみよう。
1.転がる系の曲線のメタモルフォーゼ
課題:転がる系の曲線のメタモルフォーゼアプリ
「変数、パラメータ」
を変えると
「ルーレットファミリー」がじわじわ、または、カチカチ移り変わる。
2.数学外の知識
私の勝手な解釈ですが。
18世紀は数式中心の天才数学者オイラー・ライプニッツの活躍した時代です。
17世紀は物理と数学となって発展したガリレオ・ガリレイ、ニュートンさんがいる時代ですね。
#カージオイド
17世紀は「歯車の時代」です。機械工業が発展した時代ですね。
レーマーが「歯車の歯の形」の最適化のためにカージオイドを研究を始めたらしいです。
弧長などの図形的な性質がわかったのは18世紀になってからです。
#サイクロイド
ガリレオが面積と関連づけたり、ホイヘンスが振り子に関連づけたり、ベルヌーイが最速の転がり軌跡に関連づけたりと、17世紀に物理的な視点・興味からのアプローチで盛り上がった歴史が見られます。
#アステロイド
17世紀末はヨハン・ベルヌーイさんが研究を開始して、ライプニッツも話題にしているようですね。
現代のように「公理的に数学を体系として組み立てる」関心ではなく、
17世紀という時代は、
この曲線かっこいい!この曲線は「道具」に使える!
など個々のオブジェ、オブジェクトへの関心が大きかったという背景を覚えておきたいですね。
3.数学・言語・プログラミングの支援
<個々の方程式>
3直線とも円の定点の通過軌跡です。
円がすべらずに転がる場所で変わってきます。
回転角をθとするとパラメータtの方程式表示ができますね。
#カージオイド(心臓型);
半径aの円が同サイズの円周上の外を回ります。
Curve(a(1+cos(θ))cos(θ),a(1+cos(θ))sin(θ))です。
#サイクロイド:
半径aの円が直線上を回ります。
Curve(a(θ-sinθ),a(1- cosθ))です。
#アステロイド(星形);
半径aの円周の内側を半径1/4 aの円が回ります。
Curve(a cos^3θ,asin^3θ)
このようにバラバラに数式化すると別々の式に見えますね。
でも、回転する円は1個です。
土台が凸で同じ曲率だとカージオイド、
土台が凹で曲率が4分の1だとアステロイドですね。
それがすべらずに回転する土台が直線だとサイクロイド。
ということは、円の進行方向に対して曲率を変化させればよいのです。
<数式の共通点を作るための数式の理由の立ち返る>
#カージオイド
カージオイドを作る点Pの動きは2つの動きの合成だ。
中心の移動+円の自転
固定円Cの周りを同サイズの円Dが回るとき、
C(a,0),D(3a,0),P(4a,0)から回転を開始する。
中心Dが中心Cの周りをθ回転したときベクトルの成分をかこう。
|CD|=中心間の距離=a+a=2aであり、θの回転を投影する。
ベクトルCD=(2a cosθ,2a sinθ)
DPは円Dの動点Pの中心Dからx軸と水平に引いた線からみる。
自転角度は公転角度をたしてθ+θ=2θ
ベクトルDP=(a cos2θ,a sin2θ)
点Pの座標はベクトルの和
OP=OC+CD+DPで、
(a+2a cosθ+a cos2θ,0+ 2a sinθ+a sin2θ)
= a(1+2cosθ+(2cos^2θ-1),2sinθ+2sinθcosθ)
= 2a(1+cosθ)(cosθ,sinθ)
もしも、Cを原点にしてスタートの点Pを円Cとの接点にすると、
CP=CD-DPから
(2a cosθ-a cos2θ,2a sinθ-a sin2θ)
と見かけが少しかわるけど、原因まで分解していると、
すぐ対応できるね。
#エピサイクロイド
サイクロイドが進む直線が膨らんで円になるイメージだ。
円の外側を回るという意味から「エピ」サイクロイド。
カージオイドの円の半径が同じでないとしたらどうなるだろうか。
固定円Cの半径をR,円Dの半径をrにして一般化しよう。
Cを原点に移動することで、x座標とy座標の対称性を高めよう。
また、Pの開始点を円Cとの接点からにしよう。
そうすると、円の内側を回る場合との共通のスタートが切れるね。
C(0,0),D(R+r,0),P(R,0)から回転を開始する。
ベクトルCD=((R+r)cosθ,(R+r)sinθ)
2円の接した弧長が等しいから、回転角は半径に反比例する。
m=R/rとすると、m倍の公転効果が自転に加わるので
自転角度は公転角度をたしてθ+mθ=(m+1)θ
ベクトルDP=(rcos(m+1)θ,r sin(m+1)θ
ベクトルCP=CD-DP=
((R+r)cosθ-rcos(m+1)θ,(R+r)sinθ-rsin(m+1)θ)
このエピサイクロイドの式で、R=r=aとすると、
R+r=2a,m+1=1/1+1=2だから、カージオイドと同じになるね。
#ハイポサイクロイド
では、Cの円の中で円Dを回転させてみよう。
円の内側のサイクロイドだから、「ハイポ」サイクロイド。
C(0,0),D(R-r,0),P(R,0)だから、中心間距離CDがR-rになったね。
ベクトルCD=((R-r)cosθ,(R-r)sinθ)
2円の接した弧長が等しいから、回転角は半径に反比例する。
m=R/rとすると、m倍の公転効果が自転を減少させるから
自転角度は公転角度を引いてθ-mθ=-(m-1)θ
ベクトルDP=(rcos(-(m-1)θ),r sin(-(m+1)θ))=(-rcos(m-1)θ,rsin(m-1)θ)
ベクトルCP=CD-DP=
((R-r)cosθ+rcos((m-1)θ),(R-r)sinθ-rsin((m-1)θ))
これがハイポサイクロイドのパラメータ表示だ。
R=a,r=1/4a m-1=4-1=3とすると、3倍角の公式を使うことで、式変形してまとめると、
(3/4a cosθ+1/4acos(3θ),3/4a sinθ-1/4asin(3θ)=(x,y)
x=3/4a cosθ+1/4a (4cos^3θ-3cosθ)=a cos^3θ
y=3/4a sinθ-1/4a (3sinθ-4sin^3θ-)=a sin^3θ
これで、ハイポサイクロイドの式からアステロイドの式を導くことができたね。
<みなサイクロイド仲間だ>
エピサイクロイドはCurve((R+r)cosθ-rcos(m+1)θ,(R+r)sinθ-rsin(m+1)θ)
ハイポサイクロイドはCurve((R-r)cosθ+rcos(m-1)θ,(R-r)sinθ-rsin(m-1)θ)
エピ、ハイポをとるとどちらもサイクロイドだね。
かんじんのサイクロイドを同じ流れでベクトルの和で考えるとどうなるだろうか。
定直線の半径をRは∞にしたと同じだ。
円Dの半径はr。円Dと定直線の接点をCとする。
C(0,0),D(0,r),P(0,0)から回転を開始する。
点Cのx座標は回転して円Dが直線に接した弧長に等しいから、ベクトルOC=(rθ,0)
ベクトルCD=(0,r)
ベクトルDP=(rcosθ,r sinθ)
DPはCDと逆向きから始まるので、
ベクトルOP=OC+CD-DP=(rθ-rcosθ,r-rsinθ)
エピサイクロイドの数式の変形からサイクロイドの式を出せないだろうか?
Curve((R+r)cosθ-rcos(m+1)θ,(R+r)sinθ-rsin(m+1)θ)=Curve(x,y)とおく。
m=R/rからの公転効果の角をmθ=θR/r=φとおくことで、
θ=φ/mと置き換えができるね。
y=(mr+r)sin(φ/m)-rsin[(m+1)φ/m]
=r[(m+1)sin(φ/m)-rsin{(m+1)/m φ}]
=r[msin(φ/m)+sin(φ/m)-rsin{(1+1/m)φ}]
m→∞のとき、m sin(φ/m)=φ sin(φ/m)/(φ/m)→φ・1=φ
m→∞のとき、sin(φ/m)→sin(0)=0
m→∞のとき、sin{(1+1/m)φ}→sinφだから、
m→∞のとき、y→r[φ+0-sinφ]=r(φ-sinφ)
同様にして、x→rcosφ
Curve(x,y)→(rcosφ、rφ-rsinφ)となる。
まだ、少し違う式になっているので、自転角φを公転角θに座標変換すればなんとかなるでしょう。
ということで、「サイクロイド」ファミリー、
くるくる回る「ルーレット」ファミリーのできあがりです!
4.コード化
<geogebra>
タイトルは「転がる系の曲線のメタモルフォーゼ」
# 入力・パラメータ
# mode: 1 = 外転がり(エピ), 0 = 内転がり(ハイポ) は手動で切り替えます。
# 転がる動円の半径
# 半径比 m= R / r mはアニメーションにします。
# 基円半径R
mode = slider(0, 1, 1)
m = slider(1, 6,0.2)
r = 1
R = m * r
#曲線表示
# 媒介変数曲線 (0 <= t <= 2*pi (周期の考慮))はラベルなしで青色
# Curve(x式, y式, 変数, 開始, 終了)
conicCurve = If(mode == 1, Curve(r*((m+1)*cos(t) - cos((m+1)*t)), r*((m+1)*sin(t) - sin((m+1)*t)), t, 0, 2*pi), Curve(r*((m-1)*cos(t) + cos((m-1)*t)), r*((m-1)*sin(t) - sin((m-1)*t)), t, 0, 2*pi))
# 基円はラベルなしで点線で赤
baseCircle = Circle((0,0), R)
#テキスト表示
#曲線名は太字で青色にして図にかぶらないところに移動する。
textName = If(mode == 1, If(m == 1, "カージオド (Cardioid)", If(m == 2, "ネフロイド (Nephroid)", "エピサイクロイド")), If(m == 4, "アステロイド (Astroid)", If(m == 2, "直線 (Line)", "ハイポサイクロイド")))
info="基円半径 R = " + R + ", 動円半径 r = " + r + " (比 m = " + m + ")判定: " + textName