画一个阿波罗垫片
给定三个相互切线的圆,我们总是可以找到另外两个与这三个圆都切线的圆。这两个被称为阿波罗圈。请注意,Apollonian圆之一实际上可能在三个初始圆周围。 从三个切圆开始,我们可以通过以下过程创建一个称为Apollonian垫片的分形: 将最初的3个圈子称为父圈子 找到父圈子的两个阿波罗圈 对于每个阿波罗圈: 对于三对父圆中的每对: 将Apollonian圈子和两个父圈子称为新的父圈子集,然后从步骤2重新开始。 例如从相等大小的圆圈开始,我们得到: 在Wikipedia上找到的图片 我们还需要一点符号。如果我们有一个半径为r且中心为(x,y)的圆,则可以将其曲率定义为k =±1 / r。通常,k为正,但是我们可以使用负k表示将垫圈中所有其他圆包围起来的圆(即所有切线从内部接触该圆)。然后,我们可以指定一个三元组的圆:(k,x * k,y * k)。 出于这个问题的目的,我们将假设正整数k以及有理数x和y。 有关此类圈子的更多示例,请参见Wikipedia文章。 在这篇文章中,还有一些关于整体垫圈的有趣的东西(以及其他有趣的东西)。 挑战 系统会为您提供4个圆的规格,每个规格看起来都像(14, 28/35, -112/105)。您可以使用任何方便的列表格式和除法运算符,以便在需要时可以简单地eval输入。您可以假设这四个圆确实彼此相切,并且第一个圆具有负曲率。这意味着您已经获得了其他三个周围的阿波罗圈。有关有效示例输入的列表,请参阅挑战的底部。 编写一个程序或函数,在给出此输入的情况下,绘制一个Apollonian垫片。 您可以通过函数参数ARGV或STDIN进行输入,然后将分形呈现在屏幕上或以您选择的格式将其写入图像文件。 如果对生成的图像进行光栅化,则其每侧必须至少为400像素,并且最大圆周围的填充不足20%。当您到达半径小于最大输入圆的400的圆或小于像素的圆时,以先发生的为准,您可能会停止递归。 您只能绘制圆形轮廓,而不能绘制完整的光盘,但是可以选择背景和线条的颜色。轮廓不得大于外圆直径的200。 这是代码高尔夫球,因此最短的答案(以字节为单位)获胜。 输入示例 这是维基百科文章中所有转换为规定输入格式的整体垫片: [[-1, 0, 0], [2, 1, 0], [2, -1, 0], [3, 0, 2]] [[-2, 0, 0], [3, 1/2, 0], [6, …