Las estrellas de papel son una gran cosa en mi familia en Navidad, así que pensé que una virtual sería genial.
A continuación se muestra una imagen de un dodecaedro regular (de https://en.wikipedia.org/wiki/Dodecahedron , atribuido al autor mencionado allí).
El proceso de estelación (wikipedia) cuando se aplica a un poliedro implica extender las caras hasta que crucen otras caras. Comenzando así con el dodecaedro regular, obtenemos las siguientes formas:
Pequeño dodecaedro estrellado, gran dodecaedro y gran dodecaedro estrellado
Imagen de http://jwilson.coe.uga.edu/emat6680fa07/thrash/asn1/stellations.html
Estas son las tres posibles Stellations del dodecaedro (Wolfram). Forman una progresión natural desde el dodecaedro hasta el pequeño dodecaedro estrellado, el gran dodecaedro y el gran dodecaedro estrellado, a medida que extendemos las caras cada vez más.
Tarea
Su programa o función debe mostrar o generar en un archivo de imagen uno de los siguientes poliedros: dodecaedro regular, dodecaedro estrellado pequeño, gran dodecaedro o gran dodecaedro estrellado .
El esquema de color debe ser como la segunda imagen de arriba. Cada uno de los seis pares de caras opuestas será uno de los seis colores rojo, amarillo, verde, cian, azul y magenta. Puede usar colores predeterminados con estos nombres en su idioma o en su documentación, o usar los colores FF0000, FFFF00, 00FF00, 00FFFF, 0000FF y FF00FF (puede atenuarlos reduciendo la intensidad a un mínimo del 75% si lo desea, por ejemplo reduciendo las F a C).
Tenga en cuenta que definimos una "cara" como todas las áreas en el mismo plano. Por lo tanto, en las imágenes de arriba la cara frontal es amarilla (y la cara posterior paralela también sería amarilla).
El fondo debe ser negro, gris o blanco. Los bordes pueden omitirse, pero deben ser negros si se dibujan.
Reglas
El poliedro mostrado debe tener entre 500 y 1000 píxeles de ancho (el ancho se define como la distancia máxima entre dos vértices mostrados).
El poliedro visualizado debe estar en proyección en perspectiva (punto de vista al menos a 5 anchos del poliedro), o en proyección ortográfica (efectivamente, una proyección en perspectiva con el punto de vista en el infinito).
El poliedro debe poder visualizarse desde cualquier ángulo. (No es aceptable elegir el ángulo más fácil posible y hacer una forma 2D codificada). El usuario puede especificar el ángulo de cualquiera de las siguientes maneras:
Introducción de tres ángulos correspondientes a tres rotaciones, desde stdin, o como parámetros de función o línea de comando. Estos pueden ser ángulos de Euler (donde las primeras y últimas rotaciones son sobre el mismo eje) o ángulos de Tait-Bryan (donde hay una rotación cada uno sobre los ejes x, y y z) https://en.wikipedia.org/ wiki / Euler_angles (en pocas palabras, todo vale siempre que cada rotación sea sobre el eje x, y o z y las rotaciones consecutivas sean sobre ejes perpendiculares).
Facilidad para que el usuario gire el poliedro en pasos de no más de 10 grados alrededor de los ejes x e y y actualice la pantalla, cualquier número arbitrario de veces (suponiendo que el eje z sea perpendicular a la pantalla).
El poliedro debe ser sólido, no estructura metálica.
No se permiten construcciones para dibujar poliedros (¡te estoy mirando, Mathematica!)
Puntuación
Esto es codegolf. El código más corto en bytes gana.
Bonos
Multiplique su puntaje por 0.5 si no usa los colores incorporados para dibujar en 3D.
Multiplique su puntaje por 0.7 si puede mostrar las tres stellations del dodecaedro, seleccionable por el usuario por un entero 1-3 ingresado desde stdin, o por función o parámetro de línea de comando.
Si elige ambos bonos, su puntaje se multiplicará por 0.5 * 0.7 = 0.35
Información útil (fuentes como abajo)
https://en.wikipedia.org/wiki/Regular_dodecahedron
https://en.wikipedia.org/wiki/Regular_icosahedron
El dodecaedro tiene 20 vértices. 8 de ellos forman los vértices de un cubo con las siguientes coordenadas cartesianas (x, y, z):
(± 1, ± 1, ± 1)
Los 12 restantes son los siguientes (phi es la proporción áurea)
(0, ± 1 / φ, ± φ)
(± 1 / φ, ± φ, 0)
(± φ, 0, ± 1 / φ)
El casco convexo del pequeño dodecaedro estrellado y el gran dodecaedro es obviamente un dodecaedro regular. Los vértices exteriores describen un icosaedro.
Según Wikipedia, los 12 vértices de un icosaedro se pueden describir de manera similar a las permutaciones cíclicas de (0, ± 1, ± φ). Los vértices exteriores del pequeño dodecaherón estrellado y el gran dodecaedro (en la misma escala que el dodecaedro anterior) forman un icosaedro más grande, donde las coordenadas de los vértices son permutaciones cíclicas de (0, ± φ ^ 2, ± φ).
Los ángulos entre las caras del dodecaedro y el icosaedro son 2 arctan (phi) y arccos (- (√5) / 3) respectivamente.
Para obtener consejos sobre la rotación, consulte https://en.wikipedia.org/wiki/Rotation_matrix
EDITAR: Por error he permitido el dodecaedro regular, y no puedo retraerlo ahora. La bonificación x0.7 por dibujar los tres poliedros estrellados permanece. El día de Año Nuevo emitiré una recompensa de 100 por la respuesta que puede mostrar la mayor parte de los cuatro poliedros, con el código más corto como el desempate.
Polyhedrondata
no está permitido, ya que es claramente una construcción para dibujar poliedros. Si su respuesta no usa los componentes incorporados para dibujar poliedros y cumple con las otras reglas, entonces es aceptable. Su punto parece ser que, dado el hecho de que tiene que colorear las caras correctamente, de Polyhedrondata
todos modos no le ahorraría mucho, por lo que en la práctica puede ser una restricción algo arbitraria. Estoy de acuerdo en cierta medida, pero es más justo para todos si evito cambiar las reglas después de publicar.
dodecahedron
. Ej. ) No están permitidas. Algunos idiomas tienen facilidades para construir modelos 3D con comandos comotriangle[[a,b,c],[p,q,r],[x,y,z]]
. Estos lenguajes generalmente tienen incorporados para rotar y mostrar el modelo, cuidando automáticamente de no mostrar caras ocultas, etc. Se permiten soluciones como estas, pero no atraerán la bonificación. El propósito del bono es permitir que los idiomas que no tienen estas instalaciones sean competitivos, y también atraer soluciones más interesantes.