As Correntes Steiner são um conjunto de N círculos em que cada círculo é tangente a outros 2 círculos sem interseção, bem como aos círculos anteriores e seguintes da cadeia, conforme visto nas imagens abaixo:
Neste desafio, você escreverá um programa / função que desenha cadeias de Steiner recursivamente, ou seja, os círculos de uma determinada cadeia serão os círculos base de outra iteração de cadeias:
Desafio
Escreva um programa / função que aceite as dimensões da imagem e uma lista de números inteiros denotando o nível de círculos em cada iteração sucessiva de cadeias e imprima uma imagem com as cadeias recursivas de Steiner desenhadas para ela.
Entrada
Seu programa / função aceitará 2 argumentos:
s
- largura e altura da imagemls
- lista de números inteiros positivos que indicam o número de círculos presentes em cada iteração sucessiva de cadeias, ordenadas da cadeia mais superior à mais inferior
Resultado
Seu programa / função exibirá uma imagem da dimensão s
x s
exibindo a cadeia Steiner recusativa.
- O círculo base do nível superior será tão grande quanto a imagem com um diâmetro
s
centrado dentro da imagem - Para facilitar as coisas, os 2 círculos básicos de uma cadeia de Steiner serão concêntricos, ou seja, os pontos centrais dos 2 círculos da linha de base serão os mesmos
- Dado um raio externo
R
, e o número de círculos em uma cadeiaN
, a fórmula para o raio internoR'
éR' = (R-R*sin(pi/N))/(sin(pi/N)+1)
- Os círculos da cadeia, bem como o círculo base interno, serão os círculos base externos da próxima iteração de cadeias
- Ao recorrer pelos círculos da cadeia, a ordem da próxima cadeia deve corresponder ao próximo valor em
ls
- Enquanto se repete através do círculo interno de uma cadeia, a ordem deve ser igual à ordem de seus pais (exemplo [5,2]):
- Todas as cadeias devem terminar a recursão a uma profundidade do comprimento de
ls
- A rotação das correntes não importa:
- No entanto, as rotações das cadeias recursivas em relação ao ponto central dos pais devem ser as mesmas:
- Todos os círculos devem ser desenhados com um contorno ou preenchimento sólido
- A escolha da cor é deixada para a implementação, exceto as brechas (por exemplo, preenchendo tudo com a mesma cor)
Execuções de exemplo
Nos exemplos a seguir, a cor é determinada por (depth of the recursion)^4
.
Você pode encontrar a fonte aqui .
chain(600,[5,4,3])
chain(600,[11,1,1,1,1,1,1])
chain(600,[5,6,7,8,9])
fonte
Respostas:
Javascript ES6, 379 bytes
Esta solução foi usada para gerar as execuções de exemplo na pergunta.
Ungolfed:
Nota:
f
retorna uma tela.Exemplo de execução (pressupõe que haja um
<body>
para anexar):Deve despejar a seguinte imagem na página:
fonte