L’objectif de ce défi est de produire une animation d’un système d’ entraînement par chaîne , composé d’un ensemble de pignons reliés entre eux par une chaîne .
Exigences générales
Votre programme recevra une liste de pignons , spécifiés en (x, y, radius)
triplets. Le système d’entraînement par chaîne résultant est constitué de ces pignons, reliés entre eux par une chaîne tendue fermée passant au-dessus de chacun d’eux, dans l’ordre . Votre objectif est de produire une animation en boucle infinie , montrant le système en mouvement. Par exemple, étant donné l'entrée
(0, 0, 16), (100, 0, 16), (100, 100, 12), (50, 50, 24), (0, 100, 12)
, la sortie devrait ressembler à quelque chose comme
.
Le système de coordonnées doit être tel que l’axe des x pointe vers la droite et l’axe des y vers le haut. Vous pouvez supposer que les rayons sont des nombres pairs supérieurs ou égaux à 8 (nous verrons pourquoi cela compte plus tard.) Vous pouvez également supposer qu'il y a au moins deux pignons et que les pignons ne se croisent pas . Les unitésde l'entrée ne sont pas trop critiques. Tous les exemples et scénarios de test de cette publication utilisent des pixels comme unités d'entrée (ainsi, par exemple, le rayon du pignon central de la figure précédente est de 24 pixels;) essayez de ne pas trop vous écarter de ces unités. Dans la suite du défi, les quantités spatiales sont censées être exprimées dans les mêmes unités que l'entrée - veillez à conserver les proportions! Les dimensions de la sortie doivent être légèrement plus grandes que le cadre de sélection de tous les pignons, suffisamment grandes pour que tout le système soit visible. En particulier, les positions absolues des pignons ne devraient pas affecter la sortie; seules leurs positions relatives doivent (ainsi, par exemple, si nous décalions tous les pignons de l'exemple ci-dessus de la même quantité, la sortie resterait la même.)
La chaîne doit être tangente aux pignons sur lesquels elle passe à tous les points de contact, et directement partout ailleurs. La chaîne doit passer sur les pignons de sorte que les segments de chaîne adjacents (c'est-à-dire les parties de la chaîne situées entre deux pignons qui se rejoignent sur le même pignon) ne se croisent pas .
.
Par exemple, alors que le système de gauche ci-dessus est valide, celui du milieu ne l’est pas, car les deux segments adjacents de la chaîne qui passent au-dessus du pignon inférieur gauche se croisent. Cependant, notez que le bon système est valide, car les deux segments de la chaîne qui se croisent ne sont pas adjacents (ce système est cependant produit par une entrée différente de celle des deux autres).
Pour simplifier les choses (r), vous pouvez supposer qu’aucun pignon ne croise la coque convexe de ses deux pignons voisins, ni les coques convexes de chacun de ses voisins et de leur autre voisin. En d'autres termes, le pignon supérieur du diagramme ci-dessous ne peut croiser aucune des régions ombrées.
Les segments de chaîne peuvent croiser des pignons autres que ceux sur lesquels ils sont passés (comme dans le dernier cas de test). Dans ce cas, la chaîne doit toujours apparaître devant les pignons.
Exigences visuelles
La chaîne devrait consister en une série de maillons de largeurs alternées. La largeur du lien étroit doit être d'environ 2 et la largeur du lien large d' environ 5. La longueur des deux types de liens doit être à peu près égale. La périodede la chaîne, c'est-à-dire la longueur totale d'une paire de liens large / étroite, doit être le nombre le plus proche de 4π qui correspond à un nombre entier de fois dans la longueur de la chaîne. Par exemple, si la longueur de la chaîne est 1 000, sa période doit être de 12,5, soit le nombre le plus proche de 4π (12,566 ...) qui correspond à un nombre entier de fois (80) sur 1 000. Il est important que la période corresponde à un nombre entier de fois dans la longueur de la chaîne, de sorte qu'il n'y ait pas d'artefacts à l'endroit où la chaîne s'enroule.
Un pignon de rayon R devrait être composé de trois parties concentriques: un axe central , qui devrait être un cercle de rayon d'environ 3; le corps du pignon , autour de l'essieu, qui devrait être un cercle de rayon d'environ R - 4.5; et le bord du pignon , autour du corps, qui devrait être un cercle de rayon autour de
R - 1.5. La jante devrait également contenir les dents du pignon , qui devrait avoir une largeur d'environ 4; la taille et l'espacement des dents doivent correspondre à la taille des maillons de la chaîne, afin qu'ils s'emboîtent parfaitement.
La période des dents du pignon, c'est-à-dire la distance entre deux dents consécutives le long de la circonférence du pignon, doit correspondre à la période de la chaîne. Étant donné que la période est d'environ 4π et que le rayon du pignon est garanti, la période doit tenir dans la circonférence du pignon un nombre de fois presque entier, de sorte qu'il ne devrait pas y avoir d'artefacts visibles au point où les dents du pignon s'enroulent.
Vous pouvez utiliser n’importe quelle combinaison de couleurs pour la chaîne, les différentes parties du pignon et l’arrière-plan, dans la mesure où elles se distinguent facilement . L'arrière-plan peut être transparent. Les exemples de ce poste s’appliquent #202020
à la chaîne, #868481
à l’axe et au rebord #646361
du pignon et au corps du pignon.
Exigences d'animation
Le premier pignon de la liste d'entrée doit tourner dans le sens des aiguilles d'une montre ; le reste des pignons doit tourner en conséquence. La chaîne devrait se déplacer à une vitesse d'environ 16π (environ 50) unités par seconde; la cadence de prise de vue dépend de vous, mais l'animation doit être suffisamment fluide.
L'animation doit être bouclée de manière transparente .
Conformité
Certains attributs visuels et certaines proportions ne sont spécifiés intentionnellement que grossièrement - vous n'avez pas à les faire correspondre exactement . La sortie de votre programme ne doit pas nécessairement être une réplique, pixel par pixel, des exemples donnés ici, mais elle devrait être similaire. En particulier, les proportions exactes de la chaîne et des pignons, ainsi que la forme exacte des maillons et des dents de la chaîne, sont flexibles.
Les points les plus importants à suivre sont les suivants:
- La chaîne doit passer sur les pignons, dans l'ordre d'entrée, dans le bon sens.
- La chaîne doit être tangente aux pignons à tous les points de contact.
- Les maillons de la chaîne et les dents des pignons doivent être bien enchevêtrés, au moins jusqu’à corriger l’espacement et la phase.
- L'espacement entre les maillons de la chaîne et les dents des pignons doit être tel qu'il n'y ait pas d'artefacts remarquables à l'endroit où ils s'enroulent.
- Les pignons doivent tourner dans le bon sens.
- L'animation doit être bouclée de manière transparente.
Pour terminer, si, techniquement, l'objectif de ce défi est d'écrire le code le plus court, si vous avez envie de faire preuve de créativité et de produire un résultat plus élaboré, ne vous gênez pas!
Défi
Écrivez un programme ou une fonction en prenant une liste de pignons et en produisant une animation du système de transmission par chaîne correspondante, comme décrit ci-dessus.
Entrée et sortie
Vous pouvez utiliser l' entrée via la ligne de commande , via STDIN , sous forme d' arguments de fonction ou à l'aide d'une méthode équivalente . Vous pouvez utiliser n’importe quel format pratique pour l’entrée, mais assurez-vous de le spécifier dans votre message.
En sortie , vous pouvez afficher l'animation directement , créer un fichier d'animation ( un fichier GIF animé, par exemple) ou une séquence de fichiers image (toutefois, il existe une petite pénalité dans ce cas; voir ci-dessous.) assurez-vous que le nombre d'images est raisonnable (les exemples de cet article utilisent très peu d'images;) le nombre d'images ne doit pas nécessairement être minimal, mais vous ne devez pas produire trop d'images superflues. Si vous produisez une séquence d'images, assurez-vous de spécifier la fréquence d'images dans votre message.
But
C'est du code-golf . La réponse la plus courte , en octets, gagne.
+ 10% de pénalité Si votre programme génère une séquence d'images en sortie, au lieu d'afficher l'animation directement ou de générer un seul fichier d'animation, ajoutez 10% à votre score.
Cas de test
Test 1
(0, 0, 26), (120, 0, 26)
Test 2
(100, 100, 60), (220, 100, 14)
Test 3
(100, 100, 16), (100, 0, 24), (0, 100, 24), (0, 0, 16)
Test 4
(0, 0, 60), (44, 140, 16), (-204, 140, 16), (-160, 0, 60), (-112, 188, 12),
(-190, 300, 30), (30, 300, 30), (-48, 188, 12)
Test 5
(0, 128, 14), (46.17, 63.55, 10), (121.74, 39.55, 14), (74.71, -24.28, 10),
(75.24, -103.55, 14), (0, -78.56, 10), (-75.24, -103.55, 14), (-74.71, -24.28, 10),
(-121.74, 39.55, 14), (-46.17, 63.55, 10)
Test 6
(367, 151, 12), (210, 75, 36), (57, 286, 38), (14, 181, 32), (91, 124, 18),
(298, 366, 38), (141, 3, 52), (80, 179, 26), (313, 32, 26), (146, 280, 10),
(126, 253, 8), (220, 184, 24), (135, 332, 8), (365, 296, 50), (248, 217, 8),
(218, 392, 30)