Cho ba vòng tròn tiếp tuyến lẫn nhau, chúng ta luôn có thể tìm thấy hai vòng tròn tiếp tuyến với cả ba vòng tròn đó. Hai người này được gọi là vòng tròn Apollonia . Lưu ý rằng một trong các vòng tròn Apollonia thực sự có thể nằm xung quanh ba vòng tròn ban đầu.
Bắt đầu từ ba vòng tròn tiếp tuyến, chúng ta có thể tạo ra một mảnh nhỏ gọi là miếng đệm Apollonia , theo quy trình sau:
- Gọi 3 vòng tròn ban đầu là vòng tròn cha
- Tìm hai vòng tròn Apollonia của vòng tròn cha mẹ
- Đối với mỗi vòng tròn Apollonia:
- Đối với mỗi cặp của ba cặp vòng tròn cha mẹ:
- Gọi vòng tròn Apollonia và hai vòng tròn cha mẹ là nhóm vòng tròn cha mẹ mới và bắt đầu lại từ bước 2.
- Đối với mỗi cặp của ba cặp vòng tròn cha mẹ:
Ví dụ: bắt đầu với các vòng tròn có kích thước bằng nhau, chúng tôi nhận được:
Hình ảnh được tìm thấy trên Wikipedia
Chúng ta cần thêm một chút ký hiệu. Nếu chúng ta có một vòng tròn bán kính r với tâm (x, y) , chúng ta có thể định nghĩa độ cong của nó là k = ± 1 / r . Thông thường k sẽ dương, nhưng chúng ta có thể sử dụng k âm để biểu thị vòng tròn bao quanh tất cả các vòng tròn khác trong miếng đệm (tức là tất cả các tiếp tuyến chạm vào vòng tròn đó từ bên trong). Sau đó, chúng ta có thể chỉ định một vòng tròn với một bộ ba số: (k, x * k, y * k) .
Đối với mục đích của câu hỏi này, chúng tôi sẽ giả sử số nguyên dương k và hợp lý x và y .
Các ví dụ khác cho các vòng tròn như vậy có thể được tìm thấy trong bài viết Wikipedia .
Ngoài ra còn có một số nội dung thú vị về các miếng đệm tích hợp trong bài viết này (trong số những điều thú vị khác với vòng tròn).
Các thách thức
Bạn sẽ được cung cấp 4 thông số kỹ thuật hình tròn, mỗi thông số sẽ như thế nào (14, 28/35, -112/105)
. Bạn có thể sử dụng bất kỳ định dạng danh sách và toán tử phân chia thuận tiện, như vậy bạn có thể chỉ cần eval
nhập liệu nếu bạn muốn. Bạn có thể cho rằng 4 vòng tròn thực sự tiếp xúc với nhau và đầu tiên trong số chúng có độ cong âm. Điều đó có nghĩa là bạn đã được đưa ra vòng tròn Apollonia xung quanh của ba người kia. Để biết danh sách các ví dụ đầu vào hợp lệ, xem phần dưới cùng của thử thách.
Viết chương trình hoặc hàm, với đầu vào này, vẽ một miếng đệm Apollonia.
Bạn có thể nhận đầu vào thông qua đối số chức năng, ARGV hoặc STDIN và hiển thị fractal trên màn hình hoặc ghi nó vào tệp hình ảnh theo định dạng bạn chọn.
Nếu hình ảnh thu được được rasterized, nó phải có ít nhất 400 pixel ở mỗi bên, với phần đệm dưới 20% xung quanh vòng tròn lớn nhất. Bạn có thể ngừng đệ quy khi bạn tiếp cận các vòng tròn có bán kính nhỏ hơn 400 vòng tròn đầu vào lớn nhất hoặc các vòng tròn nhỏ hơn pixel, tùy theo trường hợp nào xảy ra trước.
Bạn phải chỉ vẽ đường viền vòng tròn, không phải đĩa đầy đủ, nhưng màu nền và đường kẻ là lựa chọn của bạn. Các đường viền không được rộng hơn 200 đường kính vòng tròn bên ngoài.
Đây là mã golf, vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.
Ví dụ đầu vào
Dưới đây là tất cả các miếng đệm tích hợp từ bài viết Wikipedia được chuyển đổi sang định dạng đầu vào được quy định:
[[-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]]