Les étoiles en papier sont une grande chose dans ma famille à Noël, alors j'ai pensé qu'une virtuelle serait cool.
Ci-dessous est une image d'un dodécaèdre régulier (de https://en.wikipedia.org/wiki/Dodecahedron , attribué à l'auteur mentionné ici.)
Le processus de stellation (wikipedia) lorsqu'il est appliqué à un polyèdre implique d'étendre les faces jusqu'à ce qu'elles traversent d'autres faces. Ainsi en partant du dodécaèdre régulier, on obtient les formes suivantes:
Petit dodécaèdre étoilé, grand dodécaèdre et grand dodécaèdre étoilé
Image de http://jwilson.coe.uga.edu/emat6680fa07/thrash/asn1/stellations.html
Ce sont les trois stellations possibles du dodécaèdre (Wolfram). Ils forment une progression naturelle du dodécaèdre au petit dodécaèdre étoilé, au grand dodécaèdre et au grand dodécaèdre étoilé, à mesure que nous étendons les faces de plus en plus loin.
Tâche
Votre programme ou fonction doit afficher ou produire dans un fichier image l'un des polyèdres suivants: dodécaèdre ordinaire, petit dodécaèdre étoilé, grand dodécaèdre ou grand dodécaèdre étoilé .
Le jeu de couleurs doit être comme la deuxième image ci-dessus. Chacune des six paires de faces opposées doit être l'une des six couleurs Rouge, Jaune, Vert, Cyan, Bleu et Magenta. Vous pouvez utiliser des couleurs par défaut avec ces noms dans votre langue ou sa documentation, ou utiliser les couleurs FF0000, FFFF00, 00FF00, 00FFFF, 0000FF et FF00FF (vous pouvez les atténuer en réduisant l'intensité à un minimum de 75% si vous le souhaitez, par exemple en réduisant les F à C.)
Notez que nous définissons une "face" comme étant toutes les zones dans le même plan. Ainsi, dans les images au-dessus de la face avant est jaune (et la face arrière parallèle serait également jaune.)
Le fond doit être noir, gris ou blanc. Les bords peuvent être omis, mais doivent être noirs s'ils sont dessinés.
Règles
Le polyèdre affiché doit avoir une largeur comprise entre 500 et 1 000 pixels (la largeur est définie comme la distance maximale entre deux sommets affichés).
Le polyèdre affiché doit être en projection en perspective (point de vue à au moins 5 largeurs du polyèdre), ou en projection orthographique (en fait une projection en perspective avec le point de vue à l'infini).
Le polyèdre doit pouvoir être affiché sous n'importe quel angle. (Il n'est pas acceptable de choisir l'angle le plus simple possible et de créer une forme 2D codée en dur.) L'angle peut être spécifié par l'utilisateur de l'une des manières suivantes:
Saisie de trois angles correspondant à trois rotations, à partir de stdin, ou en tant que paramètres de fonction ou de ligne de commande. Il peut s'agir d'angles d'Euler (où les première et dernière rotations sont sur le même axe) ou d'angles de Tait-Bryan (où il y a une rotation chacun autour des axes x, y et z) https://en.wikipedia.org/ wiki / Euler_angles (en termes simples, tout se passe tant que chaque rotation concerne les axes x, y ou z et que les rotations consécutives concernent les axes perpendiculaires.)
Possibilité pour l'utilisateur de faire pivoter le polyèdre par pas de plus de 10 degrés autour des axes x et y et de rafraîchir l'affichage, un nombre arbitraire de fois (en supposant que l'axe z est perpendiculaire à l'écran).
Le polyèdre doit être solide, pas filaire.
Aucune intégration pour dessiner des polyèdres n'est autorisée (je vous regarde, Mathematica!)
Notation
C'est du codegolf. Le code le plus court en octets gagne.
Bonus
Multipliez votre score par 0,5 si vous n'utilisez pas de fonctions intégrées pour le dessin 3D.
Multipliez votre score par 0,7 si vous pouvez afficher les trois stellations du dodécaèdre, sélectionnables par l'utilisateur par un entier 1-3 entré depuis stdin, ou par fonction ou paramètre de ligne de commande.
Si vous optez pour les deux bonus, votre score sera multiplié par 0,5 * 0,7 = 0,35
Informations utiles (sources comme ci-dessous)
https://en.wikipedia.org/wiki/Regular_dodecahedron
https://en.wikipedia.org/wiki/Regular_icosahedron
Le dodécaèdre a 20 sommets. 8 d'entre eux forment les sommets d'un cube avec les coordonnées cartésiennes (x, y, z) suivantes:
(± 1, ± 1, ± 1)
Les 12 autres sont les suivants (phi est le nombre d'or)
(0, ± 1 / φ, ± φ)
(± 1 / φ, ± φ, 0)
(± φ, 0, ± 1 / φ)
La coque convexe du petit dodécaèdre étoilé et du grand dodécaèdre est évidemment un dodécaèdre régulier. Les sommets extérieurs décrivent un icosaèdre.
Selon Wikipedia, les 12 sommets d'un icosaèdre peuvent être décrits de la même manière que les permutations cycliques de (0, ± 1, ± φ). Les sommets extérieurs du petit dodécahéron étoilé et du grand dodéchaèdre (à la même échelle que le dodécaèdre ci-dessus) forment un icosaèdre plus grand, où les coordonnées des sommets sont des permutations cycliques de (0, ± φ ^ 2, ± φ).
Les angles entre les faces pour le dodécaèdre et l'icosaèdre sont respectivement de 2 arctan (phi) et arccos (- (√5) / 3).
Pour des conseils sur la rotation, voir https://en.wikipedia.org/wiki/Rotation_matrix
EDIT: Par erreur, j'ai autorisé le dodécaèdre régulier, et je ne peux pas le rétracter maintenant. Le bonus x0.7 pour dessiner les trois polyèdres étoilés reste. Le jour du Nouvel An, j'émettrai une prime de 100 pour la réponse qui peut afficher le plus des quatre polyèdres, avec le code le plus court comme bris d'égalité.
Polyhedrondata
n'est pas autorisé car il s'agit clairement d'une fonction intégrée pour dessiner des polyèdres. Si votre réponse n'utilise pas de builtins pour dessiner des polyèdres et est conforme aux autres règles, alors elle est acceptable. Votre point semble être que, étant donné que vous devez colorer les visages correctement, Polyhedrondata
cela ne vous épargnerait pas grand-chose de toute façon, donc cela peut en pratique être une restriction quelque peu arbitraire. Je suis d'accord dans une certaine mesure, mais c'est plus juste pour tous si j'évite de changer les règles après la publication.
dodecahedron
) ne sont pas autorisées. Certaines langues ont des fonctionnalités pour construire des modèles 3D avec des commandes commetriangle[[a,b,c],[p,q,r],[x,y,z]]
. Ces langues ont généralement des fonctions intégrées pour faire pivoter et afficher le modèle, en prenant automatiquement soin de ne pas afficher les faces cachées, etc. Des solutions comme celles-ci sont autorisées mais n'attirent pas le bonus. Le bonus a pour but de permettre aux langues qui ne disposent pas de ces équipements d'être compétitives, et également d'attirer des solutions plus intéressantes.