みたにっき@はてな

三谷純のブログ

結びトーラスの話

Twitter で「結びトーラス」の作り方を知りたい、というツイートをみかけて、まっ先に、川崎徹郎先生の下の図を思い出しました。

 

f:id:JunMitani:20171015211718p:plain

http://pc1.math.gakushuin.ac.jp/~kawasaki/HTMLSurfaces/htmlSurfaces30.html

 

以前に日本数学会のマークとしても使われていたもので、とても印象深く覚えていました。

この図形を「ミカンの中に結んだ管が入っているような曲面」と説明している文章が、僕にはとても可笑しくて、図形科学の授業のなかで「百聞は一見に如かず」の例として紹介したこともあります。

『みなさん、「ミカンの中に結んだ管が入っているような曲面」と言われて、どのような形を想像しますか? この図形を説明したものですよ。やっぱり、言葉で形を伝えるのは難しいですね。正確な図を描くことが大事です。』みたいな感じで。

 

でも、この曲面が実際に、どのような数式で表現されるのか、この曲面がどのような意味を持つのかはよく知りませんでした。

 

その後、再びTwitterで、次のページにて説明が記載されていることを知りました。

mathematica.stackexchange.com

こちらの説明がとてもわかりやすかったので、上記のページから図を引用して紹介します。

 

まず、次のようなTorus knotのパスを描きます。

 

f:id:JunMitani:20171015212351p:plain

Torus knot については、Wikipediaに詳しいです。

Torus knot - Wikipedia

 

そして、この経路に沿って円を掃引して、パイプ状にします。

enter image description here

後は、これをひっくり返すだけ。

具体的には、表面上の点に対して、特定の点からの距離の逆数をかけた位置に移動することで、遠くの点は近くに、近くの点は遠くに射影されます。

その結果、次のような図が得られることになります。

enter image description here

この図は、次のような一連の 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])/2

s3Proj[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

インタラクティブにくるくる回したり、マウスホイールでズームしたりできます。

ずっとズームしていくと、中が見えるようになります。

 

一度できてしまえば、あとは少しパラメータをいじってあげることで、いろいろなバリエーションを見ることができます。

 

こんなのや

こんなの

あとは、こんなのも。

 

おまけにこんなのも。

f:id:JunMitani:20171015213834p:plain

JavaScirptはブラウザでコードを見ることができますから、興味があれば、自由に改変してみてください。

 

というわけで、Twitter経由で、ほどよい課題を見かけることができたおかげで、久しぶりにプログラミングを楽しめたのでした。

 

ちなみに、トーラスがひっくり返す、というのは、僕の大好きな Dimensions という動画の第8章の中に登場します。

youtu.be