アポロニアのガスケットを描く
3つの相互に接する円が与えられた場合、それら3つすべてに接する2つの円を常に見つけることができます。これら2つはアポロニア円と呼ばれます。アポロニアの円の1つが実際に3つの初期円の周りにあることに注意してください。 3つの接線円から始めて、次のプロセスでアポロニアンガスケットと呼ばれるフラクタルを作成できます。 最初の3つの円を親の円と呼びます 親円の2つのアポロニア円を見つける 各アポロニア円について: 親円の3つのペアの各ペアに対して: アポロニアン円と2つの親円を新しい親円のセットと呼び、ステップ2からやり直します。 たとえば、同じサイズの円から始めて、次のようになります。 ウィキペディアで見つかった画像 必要な表記法がもう1つあります。中心(x、y)の半径rの円がある場合、その曲率をk =±1 / rとして定義できます。通常、kは正ですが、負のkを使用して、ガスケット内の他のすべての円を囲む円を示します(つまり、すべての接線が内側からその円に接触します)。次に、3組の数字で円を指定できます:(k、x * k、y * k)。 この質問の目的のために、正の整数kと有理xおよびyを仮定します。 このようなサークルのその他の例は、Wikipediaの記事に記載されています。 また、この記事には、一体型ガスケットに関する興味深いものがあります(他の面白い点もあります)。 チャレンジ 4つの円の指定が与えられ、それぞれがのようになります(14, 28/35, -112/105)。eval必要に応じて単純に入力できるように、便利なリスト形式と除算演算子を使用できます。4つの円は実際に互いに接しており、最初の円は負の曲率を持っていると仮定できます。これは、他の3つのアポロニア円が既に与えられていることを意味します。有効な入力例のリストについては、チャレンジの下部をご覧ください。 この入力が与えられると、アポロニアンガスケットを描画するプログラムまたは関数を記述します。 関数引数、ARGVまたはSTDINを介して入力を取得し、画面上にフラクタルをレンダリングするか、選択した形式で画像ファイルに書き込むことができます。 結果の画像をラスタライズする場合、各円は少なくとも400ピクセルで、最大の円の周りに20%未満のパディングが必要です。半径が最大入力円の400未満の円、またはピクセルより小さい円のいずれか早い方に到達すると、再帰を停止できます。 完全なディスクではなく、円の輪郭のみを描画する必要がありますが、背景と線の色は任意です。アウトラインは、外側の円の直径の200倍より広くしてはなりません。 これはコードゴルフなので、最短の回答(バイト単位)が勝ちです。 入力例 Wikipediaの記事のすべての不可欠なガスケットは、所定の入力形式に変換されています。 [[-1, 0, 0], [2, 1, 0], [2, -1, 0], [3, 0, 2]] [[-2, 0, 0], [3, 1/2, 0], [6, …