Les chaînes de Steiner sont un ensemble de N cercles où chaque cercle est tangent à 2 autres cercles non entrecroisés ainsi qu'aux cercles précédent et suivant de la chaîne, comme le montrent les images ci-dessous:
Dans ce défi, vous écrirez un programme / une fonction qui dessine récursivement des chaînes de Steiner, c'est-à-dire que les cercles d'une chaîne donnée seront les cercles de base d'une autre itération de chaînes:
Défi
Écrivez un programme / fonction qui accepte les dimensions de l'image et une liste d'entiers indiquant le niveau des cercles dans chaque itération successive de chaînes, et sortez une image avec les chaînes Steiner récursives attirées dessus.
Contribution
Votre programme / fonction acceptera 2 arguments:
s
- largeur et hauteur de l'imagels
- liste d'entiers positifs indiquant le nombre de cercles présents dans chaque itération successive de chaînes, classés de la chaîne la plus haute à la chaîne la plus basse
Production
Votre programme / fonction affichera une image de dimension s
x s
affichant la chaîne récurrente de Steiner.
- Le cercle de base de niveau supérieur sera aussi grand que l'image avec un diamètre de
s
, centré à l'intérieur de l'image - Pour faciliter les choses, les 2 cercles de base d'une chaîne Steiner seront concentriques, c'est-à-dire que les points centraux des 2 cercles de base seront les mêmes
- Étant donné un rayon extérieur
R
, et le nombre de cercles dans une chaîneN
, la formule du rayon intérieurR'
estR' = (R-R*sin(pi/N))/(sin(pi/N)+1)
- Les cercles de la chaîne ainsi que le cercle de base interne seront les cercles de base externes de la prochaine itération des chaînes
- Lors de la répétition à travers les cercles de chaîne, l'ordre de la chaîne suivante doit correspondre à la valeur suivante dans
ls
- Tout en récurant à travers le cercle intérieur d'une chaîne, l'ordre doit être le même que celui de ses parents (exemple [5,2]):
- Toutes les chaînes doivent terminer la récursivité à une profondeur de la longueur de
ls
- La rotation des chaînes n'a pas d'importance:
- Cependant, les rotations des chaînes récursives par rapport au point central de leurs parents devraient être les mêmes:
- Tous les cercles doivent être dessinés avec un contour ou un remplissage plein
- Le choix des couleurs est laissé à l'implémentation, sauf pour les failles (par exemple, tout remplir avec la même couleur)
Exemples d'exécutions
Dans les exemples suivants, la couleur est déterminée par (depth of the recursion)^4
.
Vous pouvez trouver la source ici .
chain(600,[5,4,3])
chain(600,[11,1,1,1,1,1,1])
chain(600,[5,6,7,8,9])