Gambar kubus sederhana

10

Kami tidak memiliki tantangan tunggal tentang menggambar kubus 3 dimensi yang nyata, jadi begini:

Tantangan

Tugas Anda adalah menggambar kubus yang diputar dengan perspektif. Itu bisa di jendela terpisah atau sebagai gambar.

Memasukkan

Input Anda adalah 3 angka terpisah antara 0 dan 359,99 ... Ini mewakili rotasi di sekitar sumbu x, y dan z dalam derajat.

0 0 0
30 0 40
95 320 12

Keluaran

Anda dapat menampilkannya di jendela terpisah atau menyimpan gambar. Anda dapat menggunakan semua jenis tampilan (berbasis vektor, raster, dll.).

Sunting: ASCII juga diizinkan, untuk memungkinkan bahasa golf dengan hanya keluaran tekstual.

Output untuk grafik rasterisasi atau ASCII harus setidaknya 50 * 50 (piksel untuk rasterisasi, karakter untuk ASCII)

Informasi tambahan

Sumbu z positif menunjuk keluar dari jendela, sumbu x adalah horisontal, dan sumbu y adalah vertikal. Pada dasarnya standar OpenGL.

Rotasi berlawanan arah jarum jam jika Anda melihat kubus ke arah negatif dari sumbu tertentu, misalnya melihat ke bawah untuk sumbu y.

Kamera harus berada pada sumbu z pada jarak yang wajar dari kubus pada arah z negatif, kubus harus pada (0; 0; 0). Itu. kubus juga harus sepenuhnya terlihat, dan mengambil setidaknya 50% dari bingkai gambar. Kamera harus melihat ke arah z positif pada kubus.

Rotasi kubus diterapkan dalam urutan x-> y-> z.

Kubus diputar di sekitar pusatnya, tidak bergerak.

Untuk memproyeksikan kubus dalam ruang 2d, Anda perlu membagi koordinat x dan y kubus dengan jarak yang sejajar dengan sumbu z antara titik dan kamera.

Aturan

Pustaka rendering diperbolehkan, tetapi simpul harus didefinisikan dalam kode. Tidak ada kelas model kubus 3d.

Uji kasus

masukkan deskripsi gambar di sini

Bálint
sumber
1
Apakah harus menggunakan bingkai foto?
Rɪᴋᴇʀ
Mau memasukkan algoritma untuk poin?
Leaky Nun
3
Urutan / arah apa yang dilakukan rotasi? Di mana kamera melihat dari? Proyeksi seperti apa yang harus kita gunakan?
flawr
6
Tapi seperti yang saya katakan, rotasi tidak akan berhasil. Seperti yang Anda definisikan sekarang, kubus akan dipindahkan dari bidang tampilan jika misalnya diputar di sekitar sumbu x. Silakan gunakan kotak pasir .
flawr
6
@ EᴛᴇʀʟʏsᴛᴇʀʟʏIʀᴋ google will tell you the formula. Tidak , tantangan harus mengandung sebanyak mungkin bahan dan informasi yang diperlukan untuk menyelesaikannya, termasuk dalam badan pos . Saya seharusnya tidak harus googling atau Wikipedia-ing hanya untuk mulai memahami.
kucing

Jawaban:

2

Sepatu (Ruby) 235 231

Semuanya dihitung dari awal.

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

Panggil dari commandline misalnya shoes cube3d.rb 0 30 0

Idenya adalah untuk secara bersamaan menghasilkan / memutar empat simpul tetrahedron di 3d. Kemudian, karena ini direduksi menjadi 2d, kami menghasilkan empat simpul dari tetrahedron terbalik (total 8 simpul adalah dari kubus.) Ini memberikan 4 pasang simpul yang sesuai dengan 4 diagonal tubuh. Akhirnya simpul 2d dihubungkan oleh garis: setiap simpul dari tetrahedron asli harus dihubungkan ke setiap simpul dari tetrahedron terbalik yang membentuk 12 tepi dan 4 diagonal tubuh kubus. Pemesanan memastikan diagonal tubuh tidak diplot.

Output kasus uji

Perhatikan bahwa, agar konsisten dengan dua kasus uji terakhir, rotasi tentang sumbu z searah jarum jam dari POV viewer. Namun ini tampaknya bertentangan dengan spek. Arah rotasi dapat dibalik dengan memodifikasi *i**c->/i**c

masukkan deskripsi gambar di sini

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

Perhatikan bahwa untuk alasan historis, faktor skala 90 diterapkan pada baris 9 (dipilih sama dengan 90 derajat pada baris 2 untuk bermain golf), tetapi pada akhirnya tidak ada keuntungan bermain golf dalam menggunakan nilai khusus ini, sehingga telah menjadi pilihan sewenang-wenang.

Level River St
sumber
3

HTML / CSS / JS, 739 byte, mungkin tidak bersaing

Tapi saya hanya ingin memamerkan transformasi CSS 3D.

Neil
sumber
Ini sebenarnya terlihat cukup rapi. Saya pernah mengalami transformasi CSS3 sebelumnya, tapi saya punya masalah dengannya.
Bálint
Anda tampaknya memiliki rotasi dengan urutan yang salah. Itu harus x lalu y lalu z. Anda memiliki z lalu y lalu x. @ Bálint dapat mengkonfirmasi.
Level River St
@LevelRiverSt Ketika saya menulis ini, saya tidak tahu apa urutannya, dan saya tidak bisa mengatasinya dari kotak uji, jadi terima kasih telah memperbarui saya. Saya juga membalik arah rotasi X, jadi sekarang saya cocok dengan semua test case.
Neil
Masih bisakah Anda memberikan hitungan byte? Sekalipun jawaban tidak bersaing, mereka harus selalu memiliki hitungan byte
Downgoat
@Downgoat Golf atau ungolfed
Neil
0

Maple, 130 + 14 (sedang berlangsung)

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

masukkan deskripsi gambar di sini

Ini memplot fungsi konstan di dalam kotak, kemudian menggunakan opsi plot untuk menyembunyikan kutu, label, dan fungsi itu sendiri. Menambahkan projection=.5ke opsi membawa kamera lebih dekat, memungkinkan tampilan perspektif.
Saya menulis ini sebelum spesifikasi diselesaikan dan urutan rotasi x, y', z''bukan x, y, z. Sampai saya memperbaiki sudut, berikut adalah solusi lain

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

membaca input melalui a.txtfile yang seharusnya berisi
#declare R=<xx,yy,zz>;
dengan xx,yy,zzsudut rotasi

masukkan deskripsi gambar di sini

DenDenDo
sumber
1
Ya untuk menggunakan POV-ray, ini adalah program yang bagus. Sayangnya, aturan sekarang menyatakan bahwa tidak ada kelas kubus 3d dapat digunakan.
mil