単純な立方体を描く


10

実際の3次元の立方体を描画することについての単一の課題はないので、ここに進みます。

チャレンジ

あなたの仕事は、遠近法で回転した立方体を描くことです。別のウィンドウまたは画像として表示できます。

入力

入力は、0〜359.99の3つの異なる数値です...これらは、x、y、z軸を中心とした回転を度単位で表します。

0 0 0
30 0 40
95 320 12

出力

別のウィンドウに表示するか、画像を保存できます。任意のタイプのディスプレイを使用できます(ベクターベース、ラスタライズなど)。

編集:ASCIIも許可され、テキスト出力のみでゴルフ言語を使用できます。

ラスタライズされたグラフィックまたはASCIIグラフィックの出力は、少なくとも50 * 50(ラスタライズのピクセル、ASCIIの文字)である必要があります。

追加情報

正のz軸はウィンドウの外を指し、x軸は水平、y軸は垂直です。基本的にはOpenGL標準です。

特定の軸の負の方向に立方体を見る場合、たとえばy軸を見下ろすと、回転は反時計回りになります。

カメラはz軸上にあり、立方体から負のz方向に適切な距離にあります。立方体は(0; 0; 0)にある必要があります。。立方体も完全に表示され、描画フレームの少なくとも50%を占める必要があります。カメラは立方体で正のz方向を向いている必要があります。

立方体の回転は、x-> y-> zの順序で適用されます。

立方体はその中心を中心に回転し、動かない。

2次元空間に立方体を投影するには、点とカメラの間のz軸に平行な距離で立方体のx座標とy座標を分割する必要があります。

ルール

ライブラリのレンダリングは許可されていますが、頂点はコードで定義する必要があります。3Dキューブモデルクラスはありません。

テストケース

ここに画像の説明を入力してください


1
ワイヤーフレームである必要がありますか?
Rɪᴋᴇʀ

ポイントのアルゴリズムを含めることに注意してください。
Leaky Nun

3
ローテーションはどの順序/方向で行われますか?カメラはどこから見ていますか?どのような投影法を使用する必要がありますか?
flawr 2016

6
しかし、私が言ったように、ローテーションはうまくいきません。ここで定義したように、たとえばx軸を中心に回転すると、立方体が視野の外に移動します。サンドボックスをご利用ください。
flawr 2016

6
@EᴀsᴛᴇʀʟʏIʀᴋ google will tell you the formula. いいえ、チャレンジには、それらを解決するために必要な資料と情報をできるだけ多く含め、投稿の本文に含める必要があります。私は理解を始めるためだけにグーグルやウィキペディアに行く必要はありません。

回答:


2

シューズ(ルビー)235 231

すべてがゼロから計算されます。

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

コマンドラインなどから呼び出す shoes cube3d.rb 0 30 0

アイデアは、3Dで四面体の4つの頂点を同時に生成/回転することです。次に、これらが2dに削減されると、逆四面体の4つの頂点が生成されます(合計8つの頂点は立方体の頂点です)。これにより、4つの対角線に対応する4組の頂点のペアが得られます。最後に、2d頂点は線で接続されます。元の四面体の各頂点は、立方体の12のエッジと4つの対角線を形成する逆四面体の各頂点に接続する必要があります。順序付けにより、ボディの対角線がプロットされなくなります。

テストケース出力

最後の2つのテストケースと一致するように、z軸を中心とした回転は、ビューアのPOVから時計回りです。しかし、これは仕様と矛盾しているようです。修正することで回転方向を逆にすることができます*i**c->/i**c

ここに画像の説明を入力してください

ない

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

歴史的な理由により、9行目で90のスケールファクターが適用されていることに注意してください(ゴルフの場合、2行目で90度と同じになるように選択されています)。任意の選択。


3

HTML / CSS / JS、739バイト、おそらく競合しない

しかし、CSS 3D変換を自慢して見せたかっただけです。


これは実際にはかなりきれいに見えます。以前にCSS3変換を経験しましたが、問題がありました。
バーリント

回転の順序が間違っているようです。x、y、zの順になります。z、y、xの順になります。@Bálintが確認する場合があります。
Level River St

@LevelRiverStこれを書いたとき、注文がどうなるかわからなかったので、テストケースからそれを解決できなかったので、更新してくれてありがとう。X回転の方向も反転したので、すべてのテストケースに一致します。
ニール、

それでもバイト数を提供できますか?回答が競合しない場合でも、常にバイト数が必要です
Downgoat

@Downgoatゴルフかゴルフか?
Neilは

0

メイプル、130 + 14(進行中)

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

ここに画像の説明を入力してください

これはボックス内に定数関数をプロットし、プロットオプションを使用して目盛り、ラベル、および関数自体を非表示にします。projection=.5オプションに追加すると、カメラが近くなり、透視図が可能になります。
これは、仕様が確定する前に書いたもので、ローテーション順はのx, y', z''代わりになっていx, y, zます。角度を修正するまで、別の解決策があります

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

回転角度 でa.txtある必要があるファイルから入力を読み取ります
#declare R=<xx,yy,zz>;
xx,yy,zz

ここに画像の説明を入力してください


1
POV-rayを使用してくれてうれしいです。素晴らしいプログラムです。残念ながら、ルールには3Dキューブクラスを使用できないことが記載されています。
マイル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.