2013-05-09 22 views
11

私は3次元配列を持っています。それをレンガと考えてください。このレンガの回転は24回あります(これは、そのエッジを座標軸と平行に保ちます)。対応するすべての3次元配列を生成するにはどうすればよいですか?3次元配列を24回回転させるには?

+0

あなたの試みを自分で作る必要があります... –

+2

@ MitchWheat-これは難しい問題です!私はこれを努力してもかなり早く立ち往生すると思う。 – templatetypedef

答えて

2

回転行列を使用できます。 3D配列をx軸の周りに回転させると、位置(i,j,k)の要素は位置(i,-k,j)にマップされます。もちろん配列が0インデックスの場合は、-ksize-1-kなどに置き換える必要があります。

同様に、y軸の周りを回転すると(i,j,k)~(k,j,-i)となります。これらの2つの回転は行列として表すことができます。

|i'| |1 0 0| |i| 
|j'| = |0 0 -1|*|j| 
|k'| |0 1 0| |k| 

とY軸回転の場合:x軸回転のため

|i'| |0 0 1| |i| 
|j'| = |0 1 0|*|j| 
|k'| |-1 0 0| |k| 

任意の一般的な回転は、これらの2つの回転のシーケンスとして記述することができます。 2つの回転を連続して適用することは、3x3行列を掛けることです。したがって、それらのすべての可能な製品を見つけると、24個の行列(IDを含む)が得られます。それぞれの配列は、配列の有効なローテーションに対応します。通勤しないので、可能なすべての乗算を見つけるのはちょっと難しいです。

私は、AとBが前の2つの行列であり、p,q,r,sがそのべき乗であり、0から3の範囲である(AまたはBを4に累乗すると、単位行列に戻る)。

このようにすると、24個の有効な回転行列をすべて生成し、それらのそれぞれを使用して3D配列を回転させて、負のインデックスをシフトして境界外にアクセスしないように注意します。

3

ダイス(半分のダイス)は、24の異なる向きを観察するのに便利であり、それらを生成するための操作シーケンスを示唆することができる。 6つの顔のいずれかが最上になることができ、下の辺は4つの異なる基本方向に回転することができます。私たちは2つの操作を表してみましょう:「ターン」など、ターンは、次の1人の枢機卿からのz軸の周りの金型を回転させ、ロールがあなたから離れて死ぬ90°回転「ロール」、離れた顔が底面になり、近くの顔が上になる。これらの演算は、Felipe Lopesの解答で述べた回転行列を使って表現するか、与えられた(x、y、z)が(-y、x、z)または(x、 y)である。

いずれにしても、近接面に1、右に2つ、上に3を持つダイを配置すると、次の手順で1,2,3のスポットを持つ12種類の異なる向きが生成されますtop:RTTTRTTTRTTT。次いで、シーケンスRTRは1,2,3が最初に存在する6,4,5を露出し、シーケンスRTTTRTTTRTTTの反復は4,5、または6スポットを上にして12の方向を生成する。上記のシーケンスは、次のPythonコードに組み込まれています。

def roll(v): return (v[0],v[2],-v[1]) 
def turn(v): return (-v[1],v[0],v[2]) 
def sequence (v): 
    for cycle in range(2): 
     for step in range(3): # Yield RTTT 3 times 
      v = roll(v) 
      yield(v)   # Yield R 
      for i in range(3): # Yield TTT 
       v = turn(v) 
       yield(v) 
     v = roll(turn(roll(v))) # Do RTR 

p = sequence((1, 1, 1)) 
q = sequence((-1,-1, 1)) 
for i in sorted(zip(p,q)): 
    print i 

点の形質転換対のソートされたリストをプリントアウトするための理論的根拠は2つある:(I)任意の面方位は、その隅部のうちの2つの場所で指定することができます。 (ii)その後、出力をuniqに配管するなど、各ペアの一意性を確認するのは簡単です。ここで

は、ソートされた出力が始まる方法です:

((-1, -1, -1), (-1, 1, 1)) 
((-1, -1, -1), (1, -1, 1)) 
((-1, -1, -1), (1, 1, -1)) 
((-1, -1, 1), (-1, 1, -1)) 
((-1, -1, 1), (1, -1, -1)) 
((-1, -1, 1), (1, 1, 1)) 
((-1, 1, -1), (-1, -1, 1)) 
((-1, 1, -1), (1, -1, -1)) 
((-1, 1, -1), (1, 1, 1)) 
関連する問題