私は3次元配列を持っています。それをレンガと考えてください。このレンガの回転は24回あります(これは、そのエッジを座標軸と平行に保ちます)。対応するすべての3次元配列を生成するにはどうすればよいですか?3次元配列を24回回転させるには?
答えて
回転行列を使用できます。 3D配列をx軸の周りに回転させると、位置(i,j,k)
の要素は位置(i,-k,j)
にマップされます。もちろん配列が0インデックスの場合は、-k
をsize-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配列を回転させて、負のインデックスをシフトして境界外にアクセスしないように注意します。
ダイス(半分のダイス)は、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))
- 1. 2次元配列を回転させる方法
- 2. Cで1次元配列のセクションを回転するには?
- 3. Cの2次元配列のような1次元配列を扱い画像を回転させる
- 4. 3次元でのイメージの回転(Matlab)
- 5. 最後の2次元で5D配列を回転する
- 6. 多次元NumPy配列の画像を90度回転する
- 7. 3次元配列をループし、2回スライスをN回追加します
- 8. 半径方向の強度の1次元配列を空間強度の2次元配列に回転
- 9. 3次元の回転を変換する
- 10. matplotlibの3次元回転プロットを保存する
- 11. ピッチとなる回転行列を回転させるオイラー角
- 12. 要素を配列の左に回転させる方法は?
- 13. 3次元テッセレーションのための四面体の回転
- 14. 3次元配列を2次元配列に変換する
- 15. 行列を基にした2次元点の回転
- 16. 2次元numpy配列を3次元配列に配置
- 17. 2次元アレイ円回転アルゴリズム?
- 18. 2D 3 x 3グリッド回転行列の対角線を回転させる必要がありますか?
- 19. 3次元行列をその中心要素の周りに時計回りに90度回転させるにはどうすればよいですか?
- 20. OpenLayers 3:ラベルをラインフィーチャと整列/回転させる
- 21. 3次元配列を1次元配列(PHP)に変更するには
- 22. 行列をN度回転させる
- 23. UiTextFieldは回転しません。iPadを回転させます。
- 24. JavaFX:軸を回転させずにオブジェクトを回転する
- 25. 回転に基づいて3次元モデルを前方に移動
- 26. 回転numpy 2D配列
- 27. JLabelのテキストを回転させずに回転する
- 28. 3次元配列をC#
- 29. Vispyを使用して3次元でキューブを回転する方法
- 30. 2Dピクセル配列を90度回転させる
あなたの試みを自分で作る必要があります... –
@ MitchWheat-これは難しい問題です!私はこれを努力してもかなり早く立ち往生すると思う。 – templatetypedef