Basit bir küp çizin


10

Gerçek bir 3 boyutlu küp çizmekle ilgili tek bir zorluğumuz yok, işte burada:

Meydan okuma

Göreviniz perspektifli döndürülmüş bir küp çizmektir. Ayrı bir pencerede veya görüntü olarak olabilir.

Giriş

Girişiniz 0 ile 359,99 arasında 3 ayrı sayıdır ... Bunlar x, y ve z ekseni etrafındaki dönüşü derece cinsinden gösterir.

0 0 0
30 0 40
95 320 12

Çıktı

Ayrı bir pencerede görüntüleyebilir veya bir görüntüyü kaydedebilirsiniz. Her tür ekranı kullanabilirsiniz (vektör tabanlı, rasterleştirilmiş, vb.).

Düzenleme: ASCII'ye, yalnızca metin çıktısı olan golf dillerine izin vermek için de izin verilir.

Rasterleştirilmiş veya ASCII grafiklerin çıktısı en az 50 * 50 olmalıdır (rasterleştirme pikselleri, ASCII karakterleri)

Ek bilgi

Pozitif z ekseni pencereden dışarı bakar, x ekseni yataydır ve y ekseni dikeydir. Temel olarak OpenGL standardı.

Küpü belirli bir eksenin negatif yönünde bakarsanız, örneğin y eksenine bakarsanız, dönüşler saat yönünün tersidir.

Kameranın z ekseni üzerinde negatif z yönünde küpten makul bir mesafede, küp (0; 0; 0) konumunda olmalıdır. . küpün de tamamen görünür olması ve çizim çerçevesinin en az% 50'sini alması gerekir. Kamera küpte pozitif z yönünde bakmalıdır.

Küpün dönüşleri x-> y-> z sırasıyla uygulanır.

Küp merkezi etrafında döndürülür, hareket etmez.

Bir küpü 2d uzayda yansıtmak için, küpün x ve y koordinatlarını nokta ile kamera arasındaki z eksenine paralel mesafeye bölmeniz gerekir.

kurallar

Oluşturma kitaplıklarına izin verilir, ancak köşe noktalarının kodda tanımlanması gerekir. 3D küp model sınıfı yok.

Test senaryoları

resim açıklamasını buraya girin


1
Tel kafes olmalı mı?
16:15, R21

Noktalar için bir algoritma eklemek ister misiniz?
Leaky Nun

3
Döndürmeler hangi sırada / yönlerde yapılır? Kamera nereden bakıyor? Ne tür bir projeksiyon kullanmalıyız?
flawr

6
Ama dediğim gibi, rotasyonlar işe yaramayacak. Şimdi tanımladığınız gibi, örneğin x ekseni etrafında döndürülmüşse küp görüş alanının dışına taşınır. Lütfen korumalı alanı kullanın .
flawr

6
@ EᴀsᴛᴇʀʟʏIʀᴋ google will tell you the formula. Hayır , zorluklar, gönderinin gövdesinde yer alan, mümkün olduğunca çözmek için gereken materyal ve bilgileri içermelidir . Sadece anlamaya başlamak için Google'a veya Wikipedia'ya gitmem gerekmiyor.
kedi

Yanıtlar:


2

Ayakkabı (Yakut) 235 231

Her şey sıfırdan hesaplandı.

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

Komut satırından arayın, ör. shoes cube3d.rb 0 30 0

Fikir, bir tetrahedronun dört köşesini aynı anda 3d olarak üretmek / döndürmektir. Daha sonra, bunlar 2d'ye indirgenirken, ters tetrahedronun dört köşesini üretiyoruz (toplam 8 köşe küpünkilerdir.) Bu, 4 gövde çaprazlamasına karşılık gelen 4 çift köşe noktası verir. Son olarak, 2d köşeleri çizgilerle bağlanır: orijinal tetrahedronun her bir tepe noktası, küpün 12 kenarını ve 4 gövde köşegenini oluşturan ters tetrahedronun her bir tepe noktasına bağlanmalıdır. Sıralama, vücut köşegenlerinin çizilmemesini sağlar.

Test senaryoları çıktısı

Son iki test durumu ile tutarlı olmak için, z ekseni etrafındaki dönüşün görüntüleyenin POV'sinden saat yönünde olduğunu unutmayın. Ancak bu özellikle çelişiyor gibi görünüyor. Dönme yönü değiştirilerek ters çevrilebilir *i**c->/i**c

resim açıklamasını buraya girin

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

Tarihsel nedenlerden ötürü, 9. çizgide 90'lık bir ölçek faktörünün uygulandığına dikkat edin (golf için 2. çizgide 90 dereceyle aynı olacak şekilde seçilmiştir), ancak sonunda bu belirli değerin kullanılmasında golf avantajı yoktur, bu nedenle keyfi seçim.


3

HTML / CSS / JS, 739 bayt, muhtemelen rekabet etmiyor

Ama sadece CSS 3D dönüşümlerini göstermek istedim.


Bu aslında oldukça düzgün görünüyor. Daha önce CSS3 dönüşümleriyle yaşadım, ancak bununla ilgili sorunlar yaşadım.
Bálint

Dönüşleri yanlış sırada görüyorsunuz. X sonra y sonra z olmalıdır. Z sonra y sonra x var. @ Bálint onaylayabilir.
Level River St

@LevelRiverSt Bunu yazdığımda siparişin ne olması gerektiğini bilmiyordum ve test durumlarından çalışamadım, bu yüzden beni güncellediğiniz için teşekkürler. Ben de X dönüş yönünü çevirdim, bu yüzden şimdi tüm test senaryoları ile eşleşiyorum.
Neil

Hala bir bayt sayımı sağlayabilir misiniz? Cevaplar rakip olmasa bile, her zaman bir bayt sayısı olmalıdır
Downgoat

@Downgoat Golf veya golf oynamadı mı?
Neil

0

Akçaağaç, 130 + 14 (devam ediyor)

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

resim açıklamasını buraya girin

Bu, bir kutunun içinde sabit bir işlev çizer, ardından keneleri, etiketleri ve işlevin kendisini gizlemek için çizim seçeneklerini kullanır. projection=.5Seçeneklere eklemek , fotoğraf makinesini yaklaştırır ve perspektif görünümünü etkinleştirir.
Bunu özellikleri tamamlanmadan ve dönüş sırası x, y', z''yerine yazmadan önce yazdım x, y, z. Açıları sabitleyene kadar, işte başka bir çözüm

POV Işını, 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>}

aracılığıyla girdi okur a.txtiçermelidir dosyası
#declare R=<xx,yy,zz>;
ile xx,yy,zzrotasyon açıları olmak

resim açıklamasını buraya girin


1
POV-ray kullanmak için Yay, harika bir program. Ne yazık ki, kurallar artık hiçbir 3d küp sınıfının kullanılamayacağını belirtiyor.
mil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.