Não temos um único desafio em desenhar um cubo tridimensional real, então aqui vai:
Desafio
Sua tarefa é desenhar um cubo girado com perspectiva. Pode estar em uma janela separada ou como uma imagem.
Entrada
Sua entrada é 3 números separados entre 0 e 359,99 ... Eles representam a rotação em torno dos eixos x, ye z em graus.
0 0 0
30 0 40
95 320 12
Resultado
Você pode exibi-lo em uma janela separada ou salvar uma imagem. Você pode usar qualquer tipo de exibição (baseada em vetor, rasterizada etc.).
Edit: ASCII também é permitido, para permitir idiomas de golfe com apenas saída de texto.
A saída para gráficos rasterizados ou ASCII deve ser de pelo menos 50 * 50 (pixels para rasterização, caracteres para ASCII)
Informação adicional
O eixo z positivo aponta para fora da janela, o eixo x é horizontal e o eixo y é vertical. Basicamente, o padrão OpenGL.
As rotações são no sentido anti-horário se você olhar o cubo na direção negativa de um eixo específico, por exemplo, olhando para o eixo y.
A câmera deve estar no eixo z a uma distância razoável do cubo na direção z negativa, o cubo deve estar em (0; 0; 0). O. O cubo também precisa estar totalmente visível e ocupar pelo menos 50% da moldura de desenho. A câmera deve olhar na direção z positiva no cubo.
As rotações do cubo são aplicadas na ordem x-> y-> z.
O cubo é girado em torno de seu centro, não se move.
Para projetar um cubo no espaço 2D, é necessário dividir as coordenadas xey do cubo com a distância paralela ao eixo z entre o ponto e a câmera.
Regras
Bibliotecas de renderização são permitidas, mas os vértices precisam ser definidos no código. Nenhuma classe de modelo de cubo 3d.
Casos de teste
fonte
google will tell you the formula.
Não , os desafios devem conter o máximo possível de material e informações necessárias para resolvê-los, incluídos no corpo do post . Eu não deveria ter que pesquisar no Google ou pesquisar na Wikipedia apenas para começar a entender.Respostas:
Shoes (rubi)
235231Tudo computado do zero.
Ligar da linha de comando, por exemplo
shoes cube3d.rb 0 30 0
A idéia é gerar / girar simultaneamente os quatro vértices de um tetraedro em 3d. Então, como estes são reduzidos a 2d, geramos os quatro vértices do tetraedro inverso (o total de 8 vértices são os do cubo.) Isso fornece 4 pares de vértices correspondentes às 4 diagonais do corpo. Finalmente, os 2d vértices são conectados por linhas: cada vértice do tetraedro original deve ser conectado a cada vértice do tetraedro inverso, formando as 12 arestas e as 4 diagonais do corpo do cubo. A ordem garante que as diagonais do corpo não sejam plotadas.
Saída de casos de teste
Observe que, para ser consistente com os dois últimos casos de teste, a rotação em torno do eixo z é no sentido horário a partir do ponto de vista do visualizador. No entanto, isso parece estar em contradição com as especificações. A direção da rotação pode ser revertida modificando
*i**c
->/i**c
destroçado
Observe que, por razões históricas, um fator de escala de 90 é aplicado na linha 9 (escolhido como o mesmo que 90 graus na linha 2 para o golfe), mas no final não havia vantagem no uso desse valor em particular, então ele se tornou um fator de escala. escolha arbitrária.
fonte
HTML / CSS / JS, 739 bytes, provavelmente não concorrente
Mas eu só queria mostrar as transformações CSS 3D.
Mostrar snippet de código
fonte
Maple,
130 + 14(em andamento)Isso cria uma função constante dentro de uma caixa e, em seguida, usa opções de plotagem para ocultar marcações, rótulos e a própria função. A adição
projection=.5
das opções aproxima a câmera, permitindo a visualização em perspectiva.Eu escrevi isso antes das especificações serem finalizadas e a ordem de rotação é em
x, y', z''
vez dex, y, z
. Até eu corrigir os ângulos, aqui está outra soluçãoPOV-Ray, 182
lê a entrada através do
a.txt
arquivo que deve conter#declare R=<xx,yy,zz>;
com
xx,yy,zz
sendo os ângulos de rotaçãofonte