Disegna un cubo semplice


10

Non abbiamo una sola sfida nel disegnare un cubo tridimensionale reale, quindi eccolo qui:

Sfida

Il tuo compito è disegnare un cubo ruotato con prospettiva. Può essere in una finestra separata o come immagine.

Ingresso

L'immissione è di 3 numeri separati tra 0 e 359,99 ... Questi rappresentano la rotazione attorno agli assi x, ye z in gradi.

0 0 0
30 0 40
95 320 12

Produzione

Puoi visualizzarlo in una finestra separata o salvare un'immagine. È possibile utilizzare qualsiasi tipo di display (basato su vettori, rasterizzato, ecc.).

Modifica: è consentito anche ASCII, per consentire il golf delle lingue con solo output testuale.

L'output per la grafica rasterizzata o ASCII deve essere almeno 50 * 50 (pixel per la rasterizzazione, caratteri per ASCII)

Informazioni aggiuntive

L'asse z positivo indica dalla finestra, l'asse x è orizzontale e l'asse y è verticale. Fondamentalmente lo standard OpenGL.

Le rotazioni sono in senso antiorario se si guarda il cubo nella direzione negativa di un asse specifico, ad esempio guardando verso l'asse y.

La telecamera dovrebbe trovarsi sull'asse z ad una distanza ragionevole dal cubo nella direzione z negativa, il cubo dovrebbe essere a (0; 0; 0). Il. Anche il cubo deve essere completamente visibile e occupa almeno il 50% della cornice di disegno. La fotocamera dovrebbe guardare in direzione z positiva verso il cubo.

Le rotazioni del cubo vengono applicate nell'ordine x-> y-> z.

Il cubo viene ruotato attorno al suo centro, non si muove.

Per proiettare un cubo nello spazio 2d, è necessario dividere le coordinate xey del cubo con la distanza parallela all'asse z tra il punto e la telecamera.

Regole

Le librerie di rendering sono consentite, ma i vertici devono essere definiti nel codice. Nessuna classe di modello cubo 3d.

Casi test

inserisci qui la descrizione dell'immagine


1
Deve essere wireframe?
Rɪᴋᴇʀ

Vuoi includere un algoritmo per i punti?
Leaky Nun,

3
In quale ordine / direzione vengono eseguite le rotazioni? Da dove viene la fotocamera? Che tipo di proiezione dobbiamo usare?
Flawr,

6
Ma come ho detto, le rotazioni non funzioneranno. Come lo hai definito ora, il cubo verrà spostato fuori dal campo visivo se ad esempio ruotato attorno all'asse x. Si prega di utilizzare la sandbox .
Flawr,

6
@ EᴀsᴛᴇʀʟʏIʀᴋ google will tell you the formula. No , le sfide dovrebbero contenere la maggior parte del materiale e delle informazioni necessarie per risolverli il più possibile, inclusi nel corpo del post . Non dovrei andare a cercare su Google o Wikipedia solo per iniziare a capire.
gatto,

Risposte:


2

Scarpe (rubino) 235 231

Tutto calcolato da zero.

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)}}

Chiamata dalla riga di comando ad es shoes cube3d.rb 0 30 0

L'idea è di generare / ruotare simultaneamente i quattro vertici di un tetraedro in 3d. Quindi, poiché questi sono ridotti a 2d, generiamo i quattro vertici del tetraedro inverso (gli 8 vertici totali sono quelli del cubo). Questo dà 4 coppie di vertici corrispondenti alle 4 diagonali del corpo. Infine, i vertici 2d sono collegati da linee: ogni vertice del tetraedro originale deve essere collegato a ciascun vertice del tetraedro inverso formando i 12 bordi e le 4 diagonali del corpo del cubo. L'ordinamento garantisce che le diagonali del corpo non vengano tracciate.

Output dei casi di test

Si noti che, per essere coerenti con gli ultimi due casi di test, la rotazione attorno all'asse z è in senso orario dal punto di vista del visualizzatore. Questo sembra essere in contraddizione con le specifiche comunque. La direzione di rotazione può essere invertita modificando *i**c->/i**c

inserisci qui la descrizione dell'immagine

ungolfed

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.
}

Si noti che per motivi storici viene applicato un fattore di scala di 90 nella riga 9 (scelto per essere uguale a 90 gradi nella riga 2 per il golf) ma alla fine non vi è stato alcun vantaggio nel golf nell'utilizzo di questo particolare valore, quindi è diventato un scelta arbitraria.


3

HTML / CSS / JS, 739 byte, probabilmente non concorrenti

Ma volevo solo mostrare le trasformazioni CSS 3D.


In realtà sembra abbastanza pulito. In precedenza ho sperimentato trasformazioni CSS3, ma ho avuto problemi con esso.
Bálint,

Sembra che le rotazioni siano nell'ordine sbagliato. Dovrebbe essere x quindi y quindi z. Hai z quindi y quindi x. @ Bálint può confermare.
Level River St

@LevelRiverSt Quando ho scritto questo non sapevo quale dovesse essere l'ordine e non sono riuscito a risolverlo dai casi di test, quindi grazie per avermi aggiornato. Ho anche capovolto la direzione della rotazione X, quindi ora abbino tutti i casi di test.
Neil,

Puoi ancora fornire un numero di byte? Anche se le risposte non sono in competizione dovrebbero sempre avere un conteggio di byte
Downgoat

@Downgoat Golf o non golf?
Neil,

0

Maple, 130 + 14 (in corso)

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]);

inserisci qui la descrizione dell'immagine

Questo traccia una funzione costante all'interno di una casella, quindi utilizza le opzioni di trama per nascondere segni di spunta, etichette e la funzione stessa. L'aggiunta projection=.5alle opzioni avvicina la fotocamera, consentendo la vista prospettica.
Ho scritto questo prima che le specifiche fossero finalizzate e l'ordine di rotazione è x, y', z''invece di x, y, z. Fino a quando non aggiusto gli angoli, ecco un'altra soluzione

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>}

legge l'input attraverso il a.txtfile che dovrebbe contenere
#declare R=<xx,yy,zz>;
con l' xx,yy,zzessere gli angoli di rotazione

inserisci qui la descrizione dell'immagine


1
Yay per l'utilizzo di POV-ray, è un ottimo programma. Sfortunatamente, le regole ora affermano che nessuna classe cubo 3d può essere utilizzata.
miglia
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.