Quale sarebbe il modo più efficace per ridurre la complessità di un insieme di rotazioni su un cubo?

0

Nonostante il lungo titolo, la mia domanda è abbastanza semplice. Supponiamo di avere un cubo nello spazio 3D e di volerlo ruotare lungo i tre assi in base all'insieme di istruzioni fornite da un utente o altrove nel programma. Come faresti a semplificare, se vuoi, quell'insieme di rotazioni?

Per semplicità, useremo la notazione implicata nella rotazione di un cubo di Rubik. (E anche perché è quello che sto programmando .. Ma non è importante.) Quindi, X sarebbe una rotazione in senso orario lungo l'asse X, X 'sarebbe una rotazione in senso antiorario lungo l'asse X, e X2 sarebbero due rotazioni di rotazione in senso orario lungo l'asse X.

Ora, supponiamo di avere un set di istruzioni X Y X' . Quel set di istruzioni ha fatto la stessa cosa che avrebbe fatto la singola istruzione di Z . Oppure, in un caso più semplice, se avessi X X' o X2 X2 , quelle rotazioni si annullano.

La mia domanda è, qual è il modo migliore - dal punto di vista della programmazione - per semplificare queste serie di istruzioni?

    
posta Steven Fontaine 16.05.2014 - 22:54
fonte

2 risposte

2

Invece di rappresentare una rotazione con "gradi # attorno all'asse", devi utilizzare una matrice di rotazione .

Le matrici di rotazione hanno una buona proprietà che se le hai multiple avrai una matrice di rotazione che ha lo stesso effetto di applicare tutte le rotazioni una dopo l'altra (l'ordine è importante qui!)

Un'altra bella proprietà che potrebbe essere necessaria in seguito è quella se si applica una matrice di rotazione a un vettore di traduzione , applica la matrice di rotazione a un oggetto e quindi il vettore di traslazione ruotato al risultato, avrà lo stesso effetto dell'applicazione del vettore di traduzione originale all'oggetto e quindi dell'applicazione della matrice di rotazione. Ciò significa che se in seguito vorresti aggiungere traduzioni a quel tuo set, potresti facilmente convertire un set in una singola rotazione e una singola traduzione.

    
risposta data 16.05.2014 - 23:55
fonte
0

Dall'esperienza personale, l'utilizzo di un set per tenere traccia di ogni parte rotazionale del cubo funziona bene. Ogni sub cubo si trova in tre set non mater le dimensioni del cubo di rubik. Quindi per trovare un sub cubo in un punto in cui sul cubo del rubik si prende l'intersezione dei tre set (il risultato è un sub cubo). Per eseguire una mossa, rimuovi i cubetti sub effettivi dai set coinvolti nella mossa e poi rimettili nei set che li prendono come risultato del movimento.

Il cubo 4 x 4 avrà 12 serie. 6 set per le 6 facce e 6 set per le sei bande che girano attorno al cubo. Le facce hanno ciascuna 16 sub cubi e le fasce hanno 12 sub-cuccioli. Ci sono un totale di 56 sub cubi. Ogni sub cubo contiene informazioni sul colore e la direzione dei colori. Lo stesso cubo di rubik è un array 4: 4 di 4 con ogni elemento che ha informazioni costituite dai 3 set che definiscono il sub cubo in quella posizione.

Questa struttura dati utilizza l'intersezione di insiemi per definire la posizione di ogni sub-blocco nel cubo. Questo salva il lavoro di dover aggiornare i sub blocchi vicini quando viene apportata una modifica.

    
risposta data 23.09.2016 - 22:04
fonte

Leggi altre domande sui tag