Steiner Chains es un conjunto de N círculos donde cada círculo es tangente a otros 2 círculos que no se cruzan, así como a los círculos anteriores y siguientes de la cadena, como se ve en las imágenes a continuación:
En este desafío, escribirá un programa / función que dibuja cadenas Steiner de forma recursiva, es decir, los círculos de una cadena dada serán los círculos base de otra iteración de cadenas:
Desafío
Escriba un programa / función que acepte dimensiones de imagen y una lista de enteros que denotan el nivel de los círculos en cada iteración sucesiva de cadenas, y genere una imagen con las cadenas recursivas de Steiner dibujadas a ella.
Entrada
Su programa / función aceptará 2 argumentos:
s
- ancho y alto de la imagenls
- lista de enteros positivos que denotan el número de círculos presentes en cada iteración sucesiva de cadenas, ordenadas desde la cadena superior hasta la cadena inferior
Salida
Su programa / función generará una imagen de dimensión s
x que s
muestra la cadena de Steiner recusiva.
- El círculo base del nivel superior será tan grande como la imagen con un diámetro
s
centrado dentro de la imagen - Para facilitar las cosas, los 2 círculos de base de una cadena Steiner serán concéntricos, es decir, los puntos centrales de los 2 círculos de referencia serán los mismos
- Dado un radio externo
R
, y el número de círculos en una cadenaN
, la fórmula para el radio internoR'
esR' = (R-R*sin(pi/N))/(sin(pi/N)+1)
- Los círculos de la cadena, así como el círculo base interno, serán los círculos base externos de la próxima iteración de cadenas.
- Mientras se repite a través de los círculos de la cadena, el orden de la siguiente cadena debe corresponder al siguiente valor en
ls
- Mientras se repite a través del círculo interno de una cadena, el orden debe ser el mismo que el orden de sus padres (ejemplo [5,2]):
- Todas las cadenas deben terminar la recursión a una profundidad de la longitud de
ls
- La rotación de las cadenas no importa:
- Sin embargo, las rotaciones de las cadenas recursivas en relación con el punto central de sus padres deberían ser las mismas:
- Todos los círculos deben dibujarse con un contorno o relleno sólido.
- La elección del color se deja a la implementación, salvo las lagunas (por ejemplo, llenar todo con el mismo color)
Ejecuciones de ejemplo
En los siguientes ejemplos, el color está determinado por (depth of the recursion)^4
.
Puedes encontrar la fuente aquí .
chain(600,[5,4,3])
chain(600,[11,1,1,1,1,1,1])
chain(600,[5,6,7,8,9])
fuente
Respuestas:
Javascript ES6, 379 bytes
Esta solución se utilizó para generar el ejemplo que se ejecuta en la pregunta.
Sin golf:
Nota:
f
devuelve un lienzo.Ejemplo de ejecución (se supone que hay
<body>
que agregar):Debería volcar la siguiente imagen a la página:
fuente