隙間を円で埋める
3つの円が互いに接していると、その隙間にぴったり収まる4つ目の円が一意に決まる。新しくできた隙間にもまた円が入る。これを再帰でくり返すと、隙間が円で埋め尽くされていく。アポロニウスのギャスケットになる。
接する4円の半径のあいだには代数の関係があり、隙間の円を試行錯誤で「探す」のでなく「計算で出す」ことができる。
接し合う4つの円の曲率 k(半径の逆数 1/r、外接円は符号をマイナスに取る)には、デカルトの円定理
(k₁ + k₂ + k₃ + k₄)² = 2(k₁² + k₂² + k₃² + k₄²)
が成り立つ。k₄ について解くと2次式になり、根が2つ — 隙間に入る小さい円と、3円を外から包む円。中心は曲率を複素数の係数とみなした同じ形の式で出る。だから既存の3円から次の円の半径も中心も即座に求まり、再帰で隙間を埋め続けられる。曲率が整数から始まると、生成される円の曲率もぜんぶ整数になることがある(アポロニウスの整数ギャスケット)。
外円の中に2つの円を左右に並べて互いに接させ、その隙間に入る円をデカルトの円定理で解くと、4つ目が一つ決まる。曲率に中心を掛けた値を複素数として同じ式に通すと、半径だけでなく中心も出る。下は左右の分け方を揺らして、隙間の円が追従するところ。
左右の円が太ると上の隙間が痩せ、入る円も小さくなる。innerCircle が返すのは半径と中心の両方で、3円の位置から一意に決まるので、揺らしても隙間に張りついたまま動く。
4つ目を入れると、隙間は3つに分かれる(外円と左の円と新しい円、など)。その各隙間にまた円が入る。同じ計算を再帰でくり返せば全部の隙間が埋まる。新しい円を入れたら、それと隣り合う2円とで作る3つの組へ潜る。曲率が小さくなりすぎたら止める。下は外円と左右2円から始めて、隙間を再帰で埋めたもの。回転をかけて全体を見せている。
3つの円から始めて、隙間という隙間が円で埋まる。minR を上げると浅い所で打ち切られて大きな隙間が残り、下げると小さな円が深くまで入る。swapCircle の側は平方根を使わず引き算だけで次の円が出る。隣り合う3円を共有したまま4つ目だけ入れ替える関係になっているので、定理を解き直さなくても済む。