Estrelas de papel são uma coisa importante em minha família no Natal, então pensei que uma virtual seria legal.
Abaixo está uma imagem de um dodecaedro regular (de https://en.wikipedia.org/wiki/Dodecahedron , atribuído ao autor mencionado lá.)
O processo de stellation (wikipedia) quando aplicado a um poliedro envolve estender as faces até cruzar outras faces. Assim, começando com o dodecaedro regular, obtemos as seguintes formas:
Dodecaedro estrelado pequeno, dodecaedro grande e dodecaedro estrelado grande
Imagem de http://jwilson.coe.uga.edu/emat6680fa07/thrash/asn1/stellations.html
Estas são as três stellations possíveis do dodecaedro (Wolfram). Eles formam uma progressão natural do dodecaedro para o pequeno dodecaedro estrelado, o grande dodecaedro e o dodecaedro estrelado, à medida que estendemos as faces cada vez mais.
Tarefa
Seu programa ou função deve exibir ou imprimir em um arquivo de imagem um dos seguintes poliedros: dodecaedro regular, dodecaedro estrelado pequeno, dodecaedro ótimo ou dodecaedro estrelado grande .
O esquema de cores deve ser como a segunda imagem acima. Cada um dos seis pares de faces opostas deve ser uma das seis cores vermelho, amarelo, verde, ciano, azul e magenta. Você pode usar cores padrão com esses nomes em seu idioma ou em sua documentação ou usar as cores FF0000, FFFF00, 00FF00, 00FFFF, 0000FF e FF00FF (você pode diminuir o tom reduzindo a intensidade para um mínimo de 75%, se desejar, por exemplo, reduzindo os Fs para os Cs.)
Observe que definimos uma "face" como sendo todas as áreas no mesmo plano. Assim, nas imagens acima, a face frontal é amarela (e a face traseira paralela também seria amarela.)
O plano de fundo deve ser preto, cinza ou branco. As arestas podem ser omitidas, mas devem ser pretas se desenhadas.
Regras
O poliedro exibido deve ter entre 500 e 1000 pixels de largura (largura é definida como a distância máxima entre dois vértices exibidos).
O poliedro exibido deve estar em projeção em perspectiva (ponto de vista a pelo menos 5 larguras do poliedro) ou projeção ortográfica (efetivamente uma projeção em perspectiva com o ponto de vista no infinito).
O poliedro deve ser exibido de qualquer ângulo. (Não é aceitável escolher o ângulo mais fácil possível e criar uma forma 2D codificada.) O ângulo pode ser especificado pelo usuário de uma das seguintes maneiras:
Entrada de três ângulos correspondentes a três rotações, a partir de stdin, ou como parâmetros de função ou linha de comando. Podem ser ângulos de Euler (onde a primeira e a última rotação são sobre o mesmo eixo) ou ângulos de Tait-Bryan (onde há uma rotação cada um sobre o eixo x, ye z) https://en.wikipedia.org/ wiki / Euler_angles (simplesmente, qualquer coisa vale desde que cada rotação seja sobre o eixo x, y ou z e as rotações consecutivas sejam sobre eixos perpendiculares.)
Facilidade para o usuário girar o poliedro em etapas não superiores a 10 graus sobre os eixos xey e atualizar a exibição, qualquer número arbitrário de vezes (assumindo o eixo z perpendicular à tela).
O poliedro deve ser sólido, não com estrutura de arame.
Não são permitidos componentes internos para desenhar poliedros (estou olhando para você, Mathematica!)
Pontuação
Isso é codegolf. O menor código em bytes vence.
Bónus
Multiplique sua pontuação por 0,5 se você não usar os recursos internos para desenho 3D.
Multiplique sua pontuação por 0,7 se conseguir exibir todas as três estrelações do dodecaedro, selecionáveis pelo usuário por um número inteiro 1-3 digitado a partir de stdin ou por função ou parâmetro de linha de comando.
Se você optar pelos dois bônus, sua pontuação será multiplicada por 0,5 * 0,7 = 0,35
Informações úteis (fontes como abaixo)
https://en.wikipedia.org/wiki/Regular_dodecahedron
https://en.wikipedia.org/wiki/Regular_icosahedron
O dodecaedro possui 20 vértices. 8 deles formam os vértices de um cubo com as seguintes coordenadas cartesianas (x, y, z):
(± 1, ± 1, ± 1)
Os 12 restantes são os seguintes (phi é a proporção áurea)
(0, ± 1 / φ, ± φ)
(± 1 / φ, ± φ, 0)
(± φ, 0, ± 1 / φ)
O casco convexo do pequeno dodecaedro estrelado e do grande dodecaedro é obviamente um dodecaedro regular. Os vértices externos descrevem um icosaedro.
De acordo com a Wikipedia, os 12 vértices de um icosaedro podem ser descritos de maneira semelhante às permutações cíclicas de (0, ± 1, ± φ). Os vértices externos do pequeno dodecaheron estrelado e do grande dodecedro (na mesma escala do dodecaedro acima) formam um icosaedro maior, onde as coordenadas dos vértices são permutações cíclicas de (0, ± φ ^ 2, ± φ).
Os ângulos entre as faces do dodecaedro e do icosaedro são 2 arctan (phi) e arccos (- (√5) / 3), respectivamente.
Para obter dicas sobre rotação, consulte https://en.wikipedia.org/wiki/Rotation_matrix
EDIT: Por engano, eu permiti o dodecaedro regular e não posso retirá-lo agora. O bônus x0,7 para desenhar todos os três poliedros estrelados permanece. No dia de Ano Novo, emitirei uma recompensa de 100 pela resposta que pode exibir a maioria dos quatro poliedros, com o menor código possível no desempate.
Polyhedrondata
não é permitido, pois é claramente um componente interno para o desenho de poliedros. Se a sua resposta não usar os componentes internos para desenhar poliedros e cumprir as outras regras, será aceitável. Parece que seu argumento é que, dado que você precisa colorir os rostos corretamente, Polyhedrondata
isso não pouparia muito, de modo que, na prática, pode ser uma restrição um tanto arbitrária. Eu concordo até certo ponto, mas é mais justo para todos se eu evitar alterar as regras após a postagem.
dodecahedron
) não são permitidos. Alguns idiomas têm recursos para a construção de modelos 3D com comandos comotriangle[[a,b,c],[p,q,r],[x,y,z]]
. Esses idiomas geralmente têm recursos internos para girar e exibir o modelo, cuidando automaticamente para não exibir faces ocultas, etc. Soluções como essas são permitidas, mas não atrairão o bônus. O objetivo do bônus é permitir que idiomas que não possuem essas facilidades sejam competitivos e também atrair soluções mais interessantes.