Dibuja un cubo simple

10

No tenemos el único desafío de dibujar un cubo tridimensional real, así que aquí va:

Desafío

Su tarea es dibujar un cubo girado con perspectiva. Puede estar en una ventana separada o como una imagen.

Entrada

Su entrada es 3 números separados entre 0 y 359.99 ... Estos representan la rotación alrededor de los ejes x, y y z en grados.

0 0 0
30 0 40
95 320 12

Salida

Puede mostrarlo en una ventana separada o guardar una imagen. Puede usar cualquier tipo de visualización (basada en vectores, rasterizada, etc.).

Editar: ASCII también está permitido, para permitir idiomas de golf con solo salida de texto.

La salida para gráficos rasterizados o ASCII debe ser de al menos 50 * 50 (píxeles para rasterización, caracteres para ASCII)

Información Adicional

El eje z positivo señala desde la ventana, el eje x es horizontal y el eje y es vertical. Básicamente el estándar OpenGL.

Las rotaciones son en sentido antihorario si observa el cubo en la dirección negativa de un eje específico, por ejemplo, mirando hacia abajo para el eje y.

La cámara debe estar en el eje z a una distancia razonable del cubo en la dirección negativa de z, el cubo debe estar en (0; 0; 0). Los. el cubo también debe ser completamente visible y ocupar al menos el 50% del marco de dibujo. La cámara debe mirar en la dirección z positiva hacia el cubo.

Las rotaciones del cubo se aplican en el orden x-> y-> z.

El cubo gira alrededor de su centro, no se mueve.

Para proyectar un cubo en el espacio 2d, debe dividir las coordenadas x e y del cubo con la distancia paralela al eje z entre el punto y la cámara.

Reglas

Las bibliotecas de representación están permitidas, pero los vértices deben definirse en el código. No hay clase de modelo de cubo 3d.

Casos de prueba

ingrese la descripción de la imagen aquí

Bálint
fuente
1
¿Tiene que ser alambre?
Rɪᴋᴇʀ
¿Quieres incluir un algoritmo para los puntos?
Leaky Nun
3
¿En qué orden / dirección se realizan las rotaciones? ¿Desde dónde mira la cámara? ¿Qué tipo de proyección tenemos que usar?
flawr
66
Pero como dije, las rotaciones no funcionarán. Como lo definió ahora, el cubo se moverá fuera del campo de visión si, por ejemplo, se gira alrededor del eje x. Por favor, use la caja de arena .
flawr
66
@ EᴀsᴛᴇʀʟʏIʀᴋ google will tell you the formula. No , los desafíos deben contener la mayor cantidad de material e información necesaria para resolverlos, incluido en el cuerpo de la publicación . No debería tener que buscar en Google o Wikipedia para comenzar a entender.
gato

Respuestas:

2

Zapatos (Ruby) 235 231

Todo se calculó desde cero.

Shoes.app{p,a,b,c=ARGV.map{|j|j.to_f/90}
k=1+i="i".to_c
p=(0..3).map{|j|y,z=(k*i**(j+a)).rect
x,z=(((-1)**j+z*i)*i**b).rect
q=(x+y*i)*i**c
[90*(k+q/(z-4)),90*(k+q/(4+z))]}
4.upto(15){|j|line *(p[j%4][0].rect+p[(j+j/4)%4][1].rect)}}

Llamar desde la línea de comandos, por ejemplo shoes cube3d.rb 0 30 0

La idea es generar / rotar simultáneamente los cuatro vértices de un tetraedro en 3d. Luego, a medida que se reducen a 2d, generamos los cuatro vértices del tetraedro inverso (los 8 vértices totales son los del cubo). Esto da 4 pares de vértices correspondientes a las 4 diagonales del cuerpo. Finalmente, los vértices 2D están conectados por líneas: cada vértice del tetraedro original debe estar conectado a cada vértice del tetraedro inverso que forma los 12 bordes y las 4 diagonales del cuerpo del cubo. El pedido asegura que las diagonales del cuerpo no se tracen.

Salida de casos de prueba

Tenga en cuenta que, para ser coherente con los dos últimos casos de prueba, la rotación sobre el eje z es en sentido horario desde el punto de vista del espectador. Sin embargo, esto parece estar en contradicción con la especificación. La dirección de rotación se puede revertir modificando *i**c->/i**c

ingrese la descripción de la imagen aquí

sin golf

Shoes.app{
  p,a,b,c=ARGV.map{|j|j.to_f/90}   #Throw away first argument (script name) and translate next three to fractions of a right angle.
  k=1+i="i".to_c                   #set up constants i=sqrt(-1) and k=1+i

  p=(0..3).map{|j|                 #build an array p of 4 elements (each element wil be a 2-element array containing the ends of a body diagonal in complex number format)
    y,z=(k*i**(j+a)).rect          #generate 4 sides of square: 1+i,i-1,-1-i,-i+1, rotate about x axis by a, and store in y and z as reals 
    x,z=(((-1)**j+z*i)*i**b).rect  #generate x axis displacements 1,-1,1,-1, rotate x and z about y axis by b, store in x and z as reals
    q=(x+y*i)*i**c                 #rotate x and y about z axis, store result in q as complex number
  [90*(k+q/(z-4)),90*(k+q/(4+z))]} #generate "far" vertex q/(4+z) and "near" vertex q/-(4-z) opposite ends of body diagonal in 2d format.

  4.upto(15){|j|                   #iterate through 12 edges, use rect and + to convert the two complex numbers into a 4 element array for line method
    line *(p[j%4][0].rect+         #cycle through 4 vertices of the "normal" tetrahedron
     p[(j+j/4)%4][1].rect)         #draw to three vertices of the "inverted" tetrahedron. j/4=1,2,3, never 0
  }                                #so the three edges are drawn but the body diagonal is not.
}

Tenga en cuenta que, por razones históricas, se aplica un factor de escala de 90 en la línea 9 (elegido para ser igual a 90 grados en la línea 2 para jugar al golf), pero al final no hubo ninguna ventaja en el uso de este valor en particular, por lo que se ha convertido en un elección arbitraria

Level River St
fuente
3

HTML / CSS / JS, 739 bytes, probablemente no competitivos

Pero solo quería mostrar transformaciones CSS 3D.

Neil
fuente
Esto en realidad se ve muy bien. Experimenté transformaciones CSS3 antes, pero tuve problemas con eso.
Bálint
Parece que tienes las rotaciones en el orden incorrecto. Debe ser x luego y luego z. Tienes z, entonces y luego x. @ Bálint puede confirmar.
Level River St
@LevelRiverSt Cuando escribí esto, no sabía cuál debería ser el pedido, y no pude resolverlo a partir de los casos de prueba, así que gracias por actualizarme. También cambié la dirección de la rotación X, así que ahora coincido con todos los casos de prueba.
Neil
¿Todavía puede proporcionar un recuento de bytes? Incluso si las respuestas no son competitivas, siempre deben tener un conteo de bytes
Downgoat
@Downgoat ¿Golfó o no golfó?
Neil
0

Arce, 130 + 14 (en progreso)

with(plots):f:=(X,Y,Z)->plot3d(0,x=0..1,y=0..1,style=contour,tickmarks=[0,0,0],labels=["","",""],axes=boxed,orientation=[Z,-X,Y]);

ingrese la descripción de la imagen aquí

Esto traza una función constante dentro de un cuadro, luego usa las opciones de trazado para ocultar las marcas, las etiquetas y la función misma. Agregar projection=.5a las opciones acerca la cámara, permitiendo la vista en perspectiva.
Escribí esto antes de que se finalizaran las especificaciones y el orden de rotación es en x, y', z''lugar de x, y, z. Hasta que arregle los ángulos, aquí hay otra solución

POV-Ray, 182

#include"a.txt"
#include"shapes.inc"
camera{location 9*z look_at 0}
light_source{9*z color 1}
object{Wire_Box(<-2,-2,-2>,<2,2,2>,.01,0)texture{pigment{color rgb 1}}rotate<R.x,-R.y,-R.z>}

lee la entrada a través del a.txtarchivo que debería contener
#declare R=<xx,yy,zz>;
con xx,yy,zzser los ángulos de rotación

ingrese la descripción de la imagen aquí

DenDenDo
fuente
1
Sí, por usar POV-ray, es un gran programa. Desafortunadamente, las reglas ahora establecen que no se puede usar ninguna clase de cubo 3d.
millas