Dengan tiga lingkaran singgung yang saling berhubungan, kita selalu dapat menemukan dua lingkaran lagi yang bersinggungan dengan ketiganya. Keduanya disebut lingkaran Apollonia . Perhatikan bahwa salah satu lingkaran Apolonia mungkin sebenarnya berada di sekitar tiga lingkaran awal.
Mulai dari tiga lingkaran singgung, kita dapat membuat fraktal yang disebut paking Apollonia , dengan proses berikut:
- Panggil 3 lingkaran awal lingkaran induk
- Temukan dua lingkaran Apollonia lingkaran induk
- Untuk setiap lingkaran Apolonia:
- Untuk setiap pasangan dari tiga pasang lingkaran induk:
- Panggil lingkaran Apollonia dan dua lingkaran induk kumpulan baru lingkaran orangtua dan mulai lagi dari langkah 2.
- Untuk setiap pasangan dari tiga pasang lingkaran induk:
Misalnya dimulai dengan lingkaran dengan ukuran yang sama, kita mendapatkan:
Gambar ditemukan di Wikipedia
Ada satu lagi notasi yang kami butuhkan. Jika kita memiliki lingkaran jari-jari r dengan pusat (x, y) , kita dapat mendefinisikan kelengkungannya sebagai k = ± 1 / r . Biasanya k akan positif, tetapi kita dapat menggunakan k negatif untuk menunjukkan lingkaran yang membungkus semua lingkaran lain di dalam paking (yaitu semua garis singgung menyentuh lingkaran itu dari dalam). Kemudian kita dapat menentukan lingkaran dengan triplet angka: (k, x * k, y * k) .
Untuk keperluan pertanyaan ini, kita akan mengasumsikan bilangan bulat positif k dan rasional x dan y .
Contoh lebih lanjut untuk lingkaran tersebut dapat ditemukan di artikel Wikipedia .
Ada juga beberapa hal menarik tentang gasket integral dalam artikel ini (di antara hal-hal menyenangkan lainnya dengan lingkaran).
Tantangan
Anda akan diberikan spesifikasi 4 lingkaran, yang masing-masing akan terlihat seperti (14, 28/35, -112/105)
. Anda dapat menggunakan format daftar dan operator divisi apa saja yang nyaman, sehingga Anda dapat dengan mudah eval
memasukkannya jika mau. Anda mungkin berasumsi bahwa 4 lingkaran memang bersinggungan satu sama lain, dan yang pertama memiliki kelengkungan negatif. Itu berarti Anda sudah diberikan lingkaran Apollonia di sekitar tiga lainnya. Untuk daftar input contoh yang valid, lihat bagian bawah tantangan.
Tulis program atau fungsi yang, jika diberi input ini, menggambar gasket Apollonia.
Anda dapat mengambil input melalui argumen fungsi, ARGV atau STDIN dan membuat fraktal di layar atau menulisnya ke file gambar dalam format pilihan Anda.
Jika gambar yang dihasilkan dirasterisasi, itu harus setidaknya 400 piksel di setiap sisi, dengan kurang dari 20% di sekitar lingkaran terbesar. Anda dapat berhenti berulang ketika Anda mencapai lingkaran yang radiusnya kurang dari 400 dari lingkaran input terbesar, atau lingkaran yang lebih kecil dari piksel, mana yang terjadi terlebih dahulu.
Anda harus menggambar hanya garis lingkaran, bukan cakram penuh, tetapi warna latar dan garis adalah pilihan Anda. Garis luar tidak boleh lebih lebar dari 200 dari diameter lingkaran luar.
Ini kode golf, jadi jawaban tersingkat (dalam byte) menang.
Contoh Input
Berikut ini adalah semua gasket integral dari artikel Wikipedia yang dikonversi ke format input yang ditentukan:
[[-1, 0, 0], [2, 1, 0], [2, -1, 0], [3, 0, 2]]
[[-2, 0, 0], [3, 1/2, 0], [6, -2, 0], [7, -3/2, 2]]
[[-3, 0, 0], [4, 1/3, 0], [12, -3, 0], [13, -8/3, 2]]
[[-3, 0, 0], [5, 2/3, 0], [8, -4/3, -1], [8, -4/3, 1]]
[[-4, 0, 0], [5, 1/4, 0], [20, -4, 0], [21, -15/4, 2]]
[[-4, 0, 0], [8, 1, 0], [9, -3/4, -1], [9, -3/4, 1]]
[[-5, 0, 0], [6, 1/5, 0], [30, -5, 0], [31, -24/5, 2]]
[[-5, 0, 0], [7, 2/5, 0], [18, -12/5, -1], [18, -12/5, 1]]
[[-6, 0, 0], [7, 1/6, 0], [42, -6, 0], [43, -35/6, 2]]
[[-6, 0, 0], [10, 2/3, 0], [15, -3/2, 0], [19, -5/6, 2]]
[[-6, 0, 0], [11, 5/6, 0], [14, -16/15, -4/5], [15, -9/10, 6/5]]
[[-7, 0, 0], [8, 1/7, 0], [56, -7, 0], [57, -48/7, 2]]
[[-7, 0, 0], [9, 2/7, 0], [32, -24/7, -1], [32, -24/7, 1]]
[[-7, 0, 0], [12, 5/7, 0], [17, -48/35, -2/5], [20, -33/35, 8/5]]
[[-8, 0, 0], [9, 1/8, 0], [72, -8, 0], [73, -63/8, 2]]
[[-8, 0, 0], [12, 1/2, 0], [25, -15/8, -1], [25, -15/8, 1]]
[[-8, 0, 0], [13, 5/8, 0], [21, -63/40, -2/5], [24, -6/5, 8/5]]
[[-9, 0, 0], [10, 1/9, 0], [90, -9, 0], [91, -80/9, 2]]
[[-9, 0, 0], [11, 2/9, 0], [50, -40/9, -1], [50, -40/9, 1]]
[[-9, 0, 0], [14, 5/9, 0], [26, -77/45, -4/5], [27, -8/5, 6/5]]
[[-9, 0, 0], [18, 1, 0], [19, -8/9, -2/3], [22, -5/9, 4/3]]
[[-10, 0, 0], [11, 1/10, 0], [110, -10, 0], [111, -99/10, 2]]
[[-10, 0, 0], [14, 2/5, 0], [35, -5/2, 0], [39, -21/10, 2]]
[[-10, 0, 0], [18, 4/5, 0], [23, -6/5, -1/2], [27, -4/5, 3/2]]
[[-11, 0, 0], [12, 1/11, 0], [132, -11, 0], [133, -120/11, 2]]
[[-11, 0, 0], [13, 2/11, 0], [72, -60/11, -1], [72, -60/11, 1]]
[[-11, 0, 0], [16, 5/11, 0], [36, -117/55, -4/5], [37, -112/55, 6/5]]
[[-11, 0, 0], [21, 10/11, 0], [24, -56/55, -3/5], [28, -36/55, 7/5]]
[[-12, 0, 0], [13, 1/12, 0], [156, -12, 0], [157, -143/12, 2]]
[[-12, 0, 0], [16, 1/3, 0], [49, -35/12, -1], [49, -35/12, 1]]
[[-12, 0, 0], [17, 5/12, 0], [41, -143/60, -2/5], [44, -32/15, 8/5]]
[[-12, 0, 0], [21, 3/4, 0], [28, -4/3, 0], [37, -7/12, 2]]
[[-12, 0, 0], [21, 3/4, 0], [29, -5/4, -2/3], [32, -1, 4/3]]
[[-12, 0, 0], [25, 13/12, 0], [25, -119/156, -10/13], [28, -20/39, 16/13]]
[[-13, 0, 0], [14, 1/13, 0], [182, -13, 0], [183, -168/13, 2]]
[[-13, 0, 0], [15, 2/13, 0], [98, -84/13, -1], [98, -84/13, 1]]
[[-13, 0, 0], [18, 5/13, 0], [47, -168/65, -2/5], [50, -153/65, 8/5]]
[[-13, 0, 0], [23, 10/13, 0], [30, -84/65, -1/5], [38, -44/65, 9/5]]
[[-14, 0, 0], [15, 1/14, 0], [210, -14, 0], [211, -195/14, 2]]
[[-14, 0, 0], [18, 2/7, 0], [63, -7/2, 0], [67, -45/14, 2]]
[[-14, 0, 0], [19, 5/14, 0], [54, -96/35, -4/5], [55, -187/70, 6/5]]
[[-14, 0, 0], [22, 4/7, 0], [39, -12/7, -1/2], [43, -10/7, 3/2]]
[[-14, 0, 0], [27, 13/14, 0], [31, -171/182, -10/13], [34, -66/91, 16/13]]
[[-15, 0, 0], [16, 1/15, 0], [240, -15, 0], [241, -224/15, 2]]
[[-15, 0, 0], [17, 2/15, 0], [128, -112/15, -1], [128, -112/15, 1]]
[[-15, 0, 0], [24, 3/5, 0], [40, -5/3, 0], [49, -16/15, 2]]
[[-15, 0, 0], [24, 3/5, 0], [41, -8/5, -2/3], [44, -7/5, 4/3]]
[[-15, 0, 0], [28, 13/15, 0], [33, -72/65, -6/13], [40, -25/39, 20/13]]
[[-15, 0, 0], [32, 17/15, 0], [32, -161/255, -16/17], [33, -48/85, 18/17]]