Twitter で「結びトーラス」の作り方を知りたい、というツイートをみかけて、まっ先に、川崎徹郎先生の下の図を思い出しました。
http://pc1.math.gakushuin.ac.jp/~kawasaki/HTMLSurfaces/htmlSurfaces30.html
以前に日本数学会のマークとしても使われていたもので、とても印象深く覚えていました。
この図形を「ミカンの中に結んだ管が入っているような曲面」と説明している文章が、僕にはとても可笑しくて、図形科学の授業のなかで「百聞は一見に如かず」の例として紹介したこともあります。
『みなさん、「ミカンの中に結んだ管が入っているような曲面」と言われて、どのような形を想像しますか? この図形を説明したものですよ。やっぱり、言葉で形を伝えるのは難しいですね。正確な図を描くことが大事です。』みたいな感じで。
でも、この曲面が実際に、どのような数式で表現されるのか、この曲面がどのような意味を持つのかはよく知りませんでした。
その後、再びTwitterで、次のページにて説明が記載されていることを知りました。
こちらの説明がとてもわかりやすかったので、上記のページから図を引用して紹介します。
まず、次のようなTorus knotのパスを描きます。
Torus knot については、Wikipediaに詳しいです。
そして、この経路に沿って円を掃引して、パイプ状にします。
後は、これをひっくり返すだけ。
具体的には、表面上の点に対して、特定の点からの距離の逆数をかけた位置に移動することで、遠くの点は近くに、近くの点は遠くに射影されます。
その結果、次のような図が得られることになります。
この図は、次のような一連の Mathematica のコマンドで描くことができるそうです。
f[t_] := With[{s = 3 t/2}, {(2 + Cos[s]) Cos[t], (2 + Cos[s]) Sin[t], Sin[s]} - {2, 0, 0}]
v1[t_] := Cross[f'[t], {0, 0, 1}] // Normalize
v2[t_] := Cross[f'[t], v1[t]] // Normalize
g[t_, \[Theta]_] := f[t] + (Cos[\[Theta]] v1[t] + Sin[\[Theta]] v2[t])/2s3Proj[v_] := v/Norm[v]^2
ParametricPlot3D[
Evaluate@s3Proj[g[t, \[Theta]] - f[0]], {t, 0, 4 Pi}, {\[Theta], 0,
2 Pi}, Mesh -> None, PlotRange -> All, MaxRecursion -> 6,
PlotStyle -> Opacity[0.5]]
すみません。僕は検証していません。
その代わりに、上記のコードと同じことを行うプログラムを JavaScript で作成してみました。
プログラムのページはこちら。
http://mitani.cs.tsukuba.ac.jp/ja/software/js/torus_knot/torus_knot.html
インタラクティブにくるくる回したり、マウスホイールでズームしたりできます。
ずっとズームしていくと、中が見えるようになります。
一度できてしまえば、あとは少しパラメータをいじってあげることで、いろいろなバリエーションを見ることができます。
こんなのや
こんなの
あとは、こんなのも。
おまけにこんなのも。
JavaScirptはブラウザでコードを見ることができますから、興味があれば、自由に改変してみてください。
というわけで、Twitter経由で、ほどよい課題を見かけることができたおかげで、久しぶりにプログラミングを楽しめたのでした。
ちなみに、トーラスがひっくり返す、というのは、僕の大好きな Dimensions という動画の第8章の中に登場します。