Ho una matrice numpy 3d che descrive un polycube (immagina un pezzo di tetris 3d). Come posso calcolare tutte le 24 rotazioni?Come calcolare tutte le 24 rotazioni dell'array 3d?
Numpy's array manipulation routines include un metodo rot90, che fornisce 4 dei 24, ma non ho capito come calcolare il resto. La mia unica idea è di convertire l'array 3d in una matrice 2d di coordinate, moltiplicare per una matrice di rotazione e riconvertire. Ma preferirei lavorare direttamente con l'array 3d.
Esempio 2x2x2 matrice:
>>> from numpy import array
>>> polycube
array([[[1, 0],
[1, 0]],
[[1, 1],
[0, 0]]])
Esempio 3x3x3 matrice:
array([[[1, 1, 0],
[1, 1, 0],
[0, 0, 0]],
[[0, 0, 0],
[1, 0, 0],
[1, 0, 0]],
[[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]])
Edit: voglio solo i 24 isometrie orientamento conservativi, non tutte le 48 rotazioni e riflessioni (anche se sarebbe interessante per sapere come farli anche loro). Se aiuta a testare, credo che l'esempio 3x3x3 non abbia simmetria rotazionale ed è chirale (quindi i 48 sono distinti).
Motivazione: Sto scrivendo un risolutore per uno stile Soma cube.
È possibile utilizzare i metodi fliplr e flipud per generare le altre rotazioni, in combinazione con il rot90, credo che sia – tobspr
. 'fliplr' e' flipud' stanno invertendo l'orientamento, quindi so che non posso usarli da soli. Voglio solo isometrie che preservano l'orientamento (24 non 48). –
Proprio come esercizio mentale: è importante notare come questo sia diverso da una nozione più comune di "rotazione 3D". Di solito, si prende una serie di N punti di punti 3D (matrice Nx3) e si moltiplica per una matrice di rotazione 3D (matrice 3x3), ottenendo come risultato un'altra matrice Nx3, dove ogni colonna sarebbe la colonna precedente (un singolo punto 3D) ruotato. Ciò che viene chiesto è molto diverso, poiché la matrice originale è MxNxO (tre assi anziché uno o due dal caso più comune). – heltonbiker