みちく茶話会の茶話

みちく茶話会 > 茶話 > 複素関数で太極図を描く

複素関数で太極図を描く

「数式で絵を描きました!」みたいなのを時々見掛けますよね。初音ミク(ねとらぼ記事)とかアンパンマンがドラえもんになるやつ(個人ブログの記事)とか。ハート型になるグラフ(Google検索)なんかそこらじゅうの記事で紹介されています。

当記事もそんな「数式で絵を描きました!」の一例ですが、上記の例のような“線画”(xy平面上の曲線)だけではなく、“塗り”にまでチャレンジします。

“塗り”を数式でどう表すかといいますと、複素関数を使います。複素関数のグラフを視覚化する手法として定義域の着色(Wikipedia)というものがありまして、関数の値を一定の規則で色に変換し、定義域の各点をその色で着色してくれます。今回使った複素関数を色でプロットするツールでは、色相で偏角を、輝度で絶対値を表現していて……みたいな難しい話は当該ページの解説を見てください。重要なのは次の3点です。

太極図(東方Projectの文脈だと「陰陽玉」と呼ばれがち)はだいたい白黒か紅白なイメージなので、この3色を目指せばよいことになります。ぴったり0や∞でなくても、めっちゃ大きな数やめっちゃ小さな数にすることができれば白黒っぽくできるはずです。

そんな感じで発見できたのが、次のような関数たちです。作れた順に解説してみますので、関心がありましたら読んでみてください。関心が無くても「へ~すげ~」くらいには思っていただければ幸いです。

バージョン1
バージョン2
バージョン3
バージョン4
バージョン1: 最初の粗削り版
f(z)=
exp[890/g(z)]
exp[1/g(z)]

\(g(z)=(\sqrt{3}|6z^2+1+\sqrt{3}i|-2)(r-\arctan\theta)(r-\arctan(\theta+\pi))(r-\arctan(\theta+2\pi))(r-\arctan(\theta+3\pi))\) として、 \(f(z)=\exp\left[\dfrac{890}{g(z)}\right]\) です(ただし \(r=|z|,\ \theta=\arg(z)\) (複素数zの絶対値と偏角)で、 \(\exp\) は指数関数、 \(\arctan\) は \(\tan\) の逆関数)。最初に頑張った荒削りなのでめっちゃ式がゴツいですね。原点を中心に、半径 \(\pi/2\) 未満の大きさです。g(z)が“線画”を担当していて、逆数を取ったり指数の肩に載せることで、色をいい感じにしようとしています。

g(z)だけだとこんな感じ
exp[35*g(z)]とかでもいいかも?

“線画”g(z)は、第一因数の√3なんちゃら~が陰中陽・陽中陰の2つの丸を描いていて、以降のarctanたちが螺旋を描いています。左側に切れ目が出来てしまうのは因数にarctanたちがたくさんあるのと関係していて、θの値の範囲が-πからπまでのためにこんなことになっています。極座標のグラフだったら1つの式で書けたのに……(たぶん)(2つの式かも)と思いますが、ここを乗り越える方法を思い付いて発展させたのが次に紹介するバージョン2です。

バージョン2:なんか周囲にすごい模様(?)が
f(z)=
exp[9*g(z)]
別の塗り方の例。arg[g(z)]

\(g(z)=(1-2|3z^2+1|)\sin(\tan(r)-\theta)\) として、 \(f(z)=\exp[9g(z)]\) です(ただし \(r=|z|,\ \theta=\arg(z)\) (複素数zの絶対値と偏角)で、 \(\exp\) は指数関数)。太極図の中心は原点 \(0\) 、陰中陽・陽中陰の中心は \(\pm\frac{1}{\sqrt{3}}i\) となっています。周囲を取り囲むぐちゃぐちゃ部分ですが、すごい模様になっているのは描画の解像度の限界のせいで、本当は無限に回転する螺旋になっています。 内側からも外側からも半径 \(\pi/2\) の円に収束してるはず。ズームアウトすると、この無限螺旋は半径 \(\pi\) ごとに存在しています。

“線画”g(z)はこんな感じ
g(z)をズームアウト。螺旋がたくさん

\(\sin(\tan(r)-t)\) というのがバージョン1での \((r-\arctan\theta)(r-\arctan(\theta+\pi))\ldots\) をまとめた(どころか外側にも螺旋を続けた)ものになっています。少し解説をしますと、“線画”にあたる式g(z)というのは、g(z)=0の解が線画となる曲線を形成しています(実数値関数g(z)の値が正負で入れ替わる境界線です)。 \(\sin(\tan(r)-t)=0\) としますと、 \(\tan(r)=t,t\pm\pi,t\pm2\pi,\ldots\) となりまして、(円 \(r=\pi/2\) の内側では)バージョン1のarctanの因数たち(を適切に増殖させたもの)と同じ解曲線を描いてくれます。さらに、tanが \(\pi\) ごとの周期関数であるおかげで、外側にも無限に螺旋が形作られます。きもい。

せっかく切れ目無く描けたので、色んな塗り方をして遊んでみましょう。

exp[64/g(z)]:外側に赤い靄が広がり紅魔郷ぽい(?)
log[arg[g(z)]]:綺麗に紅白で2値化されました
z^arg[g(z)]:なんか勢いがある。CDっぽい
[g(z)]^z:遊びすぎました

いまのところg(z)は実数しか返さないので、偏角関数argを噛ませると、 \(0,\pi\) のどちらかの値にしかなりません(実は \(-\pi\) にもなりえますがなんとか避けました)。この2値から好きな色を表す値への関数を上手い具合に作れれば、好きな2色の太極図を作れます。お好きにカスタマイズしてみましょう(?)。

バージョン3:別のアプローチ
f(z)=
螺旋とは別の曲線で描いてみる

\(f(z)=\exp\left[\left(\left|z^2-\dfrac{k^2}{4}\right|-\dfrac{k^2}{8}\right)(r-k)(y-(r-k)x)\right]\) (ただし \(x=\Re(z),\ y=\Im(z),\ r=|z|\) :複素数zの実部・虚部・絶対値)です。たとえばk=4とすると \(f(z)=\exp\left[(|z^2-4|-2)(r-4)(y-(r-4)x)\right]\) となり、随分すっきりした式になりました。

原点中心、半径kの太極図で、陰中陽・陽中陰の中心はちょうど \(±k/2\) の点です。陰中陽・陽中陰は前2つと同様の方法で描いていますが、波打ち部分を螺旋とは別の曲線で描いてみました。

exp内最後の因数、 \((y-(r-k)x)\) が波打ち部分の曲線を作っています。なんか式をぐちゃぐちゃ弄くり回してたら発見しました。xy平面上の曲線ともみなせるこの \(y-(r-k)x=0\) ですが、画面外では天地方向に伸びていきます。たしかそれぞれ直線 \(x=\pm1\) に漸近していた気がします(証明は演習問題としま)(せん)。

変数kを動かすことで、太極図の半径を自由に(?)変えられるのがこの式の強みです。ということで、kを0から12まで動かせるパラパラ漫画を作りました。スライダを動かしてグラフの変化を眺めてみてください。

k=6

赤い靄の中から太極図がブワッと現れてくる感じ、なかなか面白いと思いますがいかがでしょう。

バージョン4:古太極図
f(z)=
k=1
k=2

\(f(z)=\exp\left[-256\left(|2z^2-1|-\dfrac{1}{k}\right)\left(r-\dfrac{2\sqrt{2}}{k}\right)\cos(r-\theta)\right]\) (ただし \(r=|z|,\ \theta=\arg(z)\) :複素数zの絶対値と偏角)です。なんか突然違う形状の図ですね。どうしてこんなのを紹介するのかというと、ここで少し妄言を聞いてください。

Wikipediaによれば、太極図というのは歴史上さまざまに描かれたそうで、そのなかで「古太極図」「先天太極図」などと呼ばれる図は、八卦の並び順(のうち「先天図」のほう)を分かりやすく説明できるものだったそうです。そんな古太極図を私なりに噛み砕いて描いてみたのがk=1のときのグラフなのですが、八卦との対応をどう説明するかというと、次のような図になります。

古太極図と八卦(先天図)

円周を8等分するように、原点と円周を結ぶ線分を引きます。これらの線分をそれぞれ中心から外向きに辿り、白い領域なら陽爻⚊を、黒い領域なら陰爻⚋を、というように3つ並べると、8方向に8種類の卦を生成することができます。実軸方向から正の向きに、坎☵、巽☴、乾☰、兌☱、離☲、震☳、坤☷、艮☶、となります(数学の文脈で並べたのでこの順にしてしまいましたが、易の文脈では12時方向から始まり反時計回りに乾、兌、離、……の順っぽいです)。ちょうどこれが先天図(Wikipedia)の並び方になります。

古太極図から八卦が生成できたので、あとは古太極図と現在の太極図を繋ぐだけです。そうすれば「太極図の周りに八卦が並んでるあの図」に繋がります。古太極図はk=1だったのを、k=2とすれば、(サイズが小さくなりますが)現在の太極図のようになります。kを0.4から2.4まで動かせるパラパラ漫画を作ってみましたので、スライダを動かして、古今の太極図の変化を目撃してください。

k=1.0

ちなみに、東方香霖堂P38挿絵のミニ八卦炉も、これと同じ先天図の並び方で八卦が描かれています。やった!でも他の作品の他のシーンで描写されてるミニ八卦炉は並び方が違ってたりするのでよくわからない……。

もひとつちなみに、k=1で陰中陽・陽中陰を描いている∞形の曲線ですが、これはレムニスケート(Wikipedia)に一致します。リンク先の記事でaという変数がありますが、この図のものは \(a=1/\sqrt{2}\) にあたります。

あとがき

とりあえずこれまでに発見できたのはこんなとこです。思ったよりめちゃ長い記事になってしまった……。わりとシンプルな数式で綺麗に描けたような気がしますが、もっともっとシンプルに(因数いっことかで)描ける式ないかな~と欲望は絶えません。また見つけたら追加します(が取り急ぎ4種類も作れたのでとりあえずは満足)。それでは。