Цепочки Штейнера - это набор из N кругов, каждый из которых касается 2 других непересекающихся кругов, а также предыдущего и следующего кругов цепи, как показано на изображениях ниже:
В этой задаче вы напишите программу / функцию, которая рекурсивно рисует цепочки Штейнера, то есть окружности данной цепочки будут базовыми окружностями другой итерации цепочек:
Вызов
Напишите программу / функцию, которая принимает размеры изображения и список целых чисел, обозначающих уровень окружностей в каждой последующей итерации цепочек, и выведите изображение с рекурсивными цепочками Штейнера, нарисованными на нем.
вход
Ваша программа / функция будет принимать 2 аргумента:
s
- ширина и высота изображенияls
- список натуральных чисел, обозначающих количество кружков, присутствующих в каждой последующей итерации цепочек, упорядоченных от самой верхней цепочки до самой нижней цепочки
Выход
Ваша программа / функция выведет изображение размера s
x s
с рекурсивной цепочкой Штейнера.
- Базовый круг верхнего уровня будет таким же большим, как изображение с диаметром
s
, центрированным внутри изображения. - Чтобы упростить задачу, 2 базовых круга цепи Штейнера будут концентрическими, то есть центральные точки 2 базовых кругов будут одинаковыми
- Для заданного внешнего радиуса
R
и количества окружностей в цепочкеN
формула для внутреннего радиусаR'
имеет видR' = (R-R*sin(pi/N))/(sin(pi/N)+1)
- Круги цепи, а также внутренний базовый круг будут внешними базовыми кругами следующей итерации цепей.
- При повторении по кругу цепочки порядок следующей цепочки должен соответствовать следующему значению в
ls
- При повторном прохождении по внутреннему кругу цепочки порядок должен быть таким же, как порядок его родителей (пример [5,2]):
- Все цепи должны заканчиваться рекурсией на глубине длины
ls
- Вращение цепей не имеет значения:
- Однако повороты рекурсивных цепей относительно центральной точки их родителей должны быть одинаковыми:
- Все круги должны быть нарисованы с контуром или сплошной заливкой
- Выбор цвета оставлен для реализации, за исключением лазеек (например, заполнение всего одним цветом)
Примеры запусков
В следующих примерах цвет определяется с помощью (depth of the recursion)^4
.
Вы можете найти источник здесь .
chain(600,[5,4,3])
chain(600,[11,1,1,1,1,1,1])
chain(600,[5,6,7,8,9])
источник
Ответы:
Javascript ES6, 379 байт
Это решение было использовано для генерации примеров прогонов в вопросе.
Ungolfed:
Примечание:
f
возвращает холст.Пример выполнения (предполагается, что есть что
<body>
добавить):Должен сбросить следующее изображение на страницу:
источник