Zeichne einen einfachen Würfel

10

Wir haben keine einzige Herausforderung beim Zeichnen eines echten dreidimensionalen Würfels.

Herausforderung

Ihre Aufgabe ist es, einen gedrehten Würfel mit Perspektive zu zeichnen. Es kann in einem separaten Fenster oder als Bild sein.

Eingang

Ihre Eingabe besteht aus 3 separaten Zahlen zwischen 0 und 359,99 ... Diese repräsentieren die Drehung um die x-, y- und z-Achse in Grad.

0 0 0
30 0 40
95 320 12

Ausgabe

Sie können es entweder in einem separaten Fenster anzeigen oder ein Bild speichern. Sie können jede Art von Anzeige verwenden (vektorbasiert, gerastert usw.).

Bearbeiten: ASCII ist ebenfalls zulässig, um Golfsprachen nur mit Textausgabe zuzulassen.

Die Ausgabe für gerasterte oder ASCII-Grafiken muss mindestens 50 * 50 betragen (Pixel für die Rasterung, Zeichen für ASCII).

Zusätzliche Information

Die positive z-Achse zeigt aus dem Fenster, die x-Achse ist horizontal und die y-Achse ist vertikal. Grundsätzlich der OpenGL-Standard.

Drehungen erfolgen gegen den Uhrzeigersinn, wenn Sie den Würfel in der negativen Richtung einer bestimmten Achse betrachten, z. B. nach unten auf die y-Achse.

Die Kamera sollte sich in negativer z-Richtung auf der z-Achse in einem angemessenen Abstand vom Würfel befinden, der Würfel sollte sich auf (0; 0; 0) befinden. Das. Der Würfel muss außerdem vollständig sichtbar sein und mindestens 50% des Zeichenrahmens einnehmen. Die Kamera sollte in positiver z-Richtung auf den Würfel schauen.

Die Rotationen des Würfels werden in der Reihenfolge x-> y-> z angewendet.

Der Würfel wird um seine Mitte gedreht, er bewegt sich nicht.

Um einen Würfel im 2D-Raum zu projizieren, müssen Sie die x- und y-Koordinaten des Würfels durch den Abstand parallel zur z-Achse zwischen dem Punkt und der Kamera teilen.

Regeln

Rendering-Bibliotheken sind zulässig, die Eckpunkte müssen jedoch im Code definiert werden. Keine 3D-Würfel-Modellklasse.

Testfälle

Geben Sie hier die Bildbeschreibung ein

Bálint
quelle
1
Muss es ein Drahtmodell sein?
Rɪᴋᴇʀ
Möchten Sie einen Algorithmus für die Punkte einfügen?
Undichte Nonne
3
In welcher Reihenfolge / Richtung werden die Rotationen ausgeführt? Woher schaut die Kamera? Welche Art von Projektion müssen wir verwenden?
Fehler
6
Aber wie gesagt, die Rotationen werden nicht funktionieren. Wie Sie es jetzt definiert haben, wird der Würfel aus dem Sichtfeld verschoben, wenn er z. B. um die x-Achse gedreht wird. Bitte benutzen Sie den Sandkasten .
Fehler
6
@ EᴀsᴛᴇʀʟᴛᴇʀʟIʀᴋ google will tell you the formula. Nein , Herausforderungen sollten so viel Material und Informationen wie möglich enthalten, die zur Lösung erforderlich sind und im Hauptteil des Beitrags enthalten sind . Ich sollte nicht googeln oder Wikipedia gehen müssen, um zu verstehen.
Katze

Antworten:

2

Schuhe (Rubin) 235 231

Alles von Grund auf neu berechnet.

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

Anruf von der Kommandozeile zB shoes cube3d.rb 0 30 0

Die Idee ist, gleichzeitig die vier Eckpunkte eines Tetraeders in 3d zu erzeugen / zu drehen. Wenn diese dann auf 2d reduziert werden, erzeugen wir die vier Eckpunkte des inversen Tetraeders (die insgesamt 8 Eckpunkte sind die des Würfels). Dies ergibt 4 Eckpunktpaare, die den 4 Körperdiagonalen entsprechen. Schließlich werden die 2d-Eckpunkte durch Linien verbunden: Jeder Scheitelpunkt des ursprünglichen Tetraeders muss mit jedem Scheitelpunkt des inversen Tetraeders verbunden werden, der die 12 Kanten und 4 Körperdiagonalen des Würfels bildet. Die Bestellung stellt sicher, dass die Körperdiagonalen nicht aufgezeichnet werden.

Ausgabe von Testfällen

Beachten Sie, dass die Drehung um die z-Achse vom POV des Betrachters aus im Uhrzeigersinn erfolgt, um mit den letzten beiden Testfällen übereinzustimmen. Dies scheint jedoch im Widerspruch zur Spezifikation zu stehen. Die Drehrichtung kann durch Ändern von *i**c-> umgekehrt werden/i**c

Geben Sie hier die Bildbeschreibung ein

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

Beachten Sie, dass aus historischen Gründen in Zeile 9 ein Skalierungsfaktor von 90 angewendet wird (der für das Golfen mit 90 Grad in Zeile 2 identisch ist), aber am Ende gab es keinen Golfvorteil bei der Verwendung dieses bestimmten Werts, so dass er zu einem geworden ist willkürliche Wahl.

Level River St.
quelle
3

HTML / CSS / JS, 739 Byte, wahrscheinlich nicht konkurrierend

Aber ich wollte nur CSS 3D-Transformationen zeigen.

Neil
quelle
Das sieht eigentlich ganz ordentlich aus. Ich habe bereits Erfahrungen mit CSS3-Transformationen gemacht, hatte aber Probleme damit.
Bálint
Sie scheinen die Rotationen in der falschen Reihenfolge zu haben. Es sollte x dann y dann z sein. Sie haben z dann y dann x. @ Bálint kann bestätigen.
Level River St
@LevelRiverSt Als ich dies schrieb, wusste ich nicht, wie die Reihenfolge lauten sollte, und ich konnte es aus den Testfällen nicht herausfinden. Vielen Dank, dass Sie mich aktualisiert haben. Ich habe auch die Richtung der X-Drehung umgedreht, sodass ich jetzt alle Testfälle abgleichen kann.
Neil
Können Sie noch eine Byteanzahl angeben? Selbst wenn die Antworten nicht konkurrieren, sollten sie immer eine
Byteanzahl
@ Downgoat Golf oder ungolfed?
Neil
0

Ahorn, 130 + 14 (in Bearbeitung)

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

Geben Sie hier die Bildbeschreibung ein

Dies zeichnet eine konstante Funktion in einem Feld und verwendet dann Plotoptionen, um Häkchen, Beschriftungen und die Funktion selbst auszublenden. Durch Hinzufügen projection=.5zu den Optionen wird die Kamera näher gebracht und die perspektivische Ansicht ermöglicht.
Ich habe dies geschrieben, bevor die Spezifikationen fertiggestellt wurden und die Rotationsreihenfolge x, y', z''statt ist x, y, z. Bis ich die Winkel fixiere, ist hier eine andere Lösung

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

liest Eingabe über die a.txtDatei , die enthalten sollte ,
#declare R=<xx,yy,zz>;
mit xx,yy,zzwobei der Drehwinkel

Geben Sie hier die Bildbeschreibung ein

DenDenDo
quelle
1
Ja, für die Verwendung von POV-ray ist es ein großartiges Programm. Leider besagen die Regeln jetzt, dass keine 3D-Würfelklasse verwendet werden kann.
Meilen