Voy a describir un sistema natural (llamado jefe de la serie para la algebraists en los aleros) para enumerar las simetrías del cubo (y casualmente, al mismo tiempo simetrías de otros objetos relacionados). El final tiene un código para aplicar las simetrías.
Necesito dos concesiones: algunos valores no utilizados (bits 2,3 no pueden ser 1), y que realmente se aplique la transformación, más que la representan como una gran matriz. La primera parte no es la gran cosa ya que solo bucle i en {0,1}, j más de {0,1}, entonces k más de {0,1,...,11} y el uso de 32*i + 16*j + k. La segunda parte debe también ser no es gran cosa, como escribir la matriz es aproximadamente el mismo que la aplicación de la transformación en tres de las esquinas del cubo.
Ahora la descripción de la numeración:
Los números de 0 a 3 se utilizan para el Klein cuatro del grupo que consta de 180 grados de rotación. Sugiero:
- 0 es la matriz identidad
- 1 es el plano XY rotación de 180 grados, (x,y,z) → (d−x,d−y,z)
- 2 es el plano YZ rotación de 180 grados, (x,y,z) → (x,d−a,d−z)
- 3 es el plano XZ rotación de 180 grados, (x,y,z) → (d−x,y,d−z)
La composición de estas simetrías es simplemente XOR.
Los números del 4 al 11 se utilizan para las 120 grados de rotación de la tetraedro sentado en el interior del cubo. En otras palabras, tomar una "diagonal principal" de el cubo, y giran a su alrededor. Tiene 3 ejes de simetría, de 120 grados de rotación. Tomando la diagonal de (0,0,0) a (d,d,d) se obtiene una particularmente fácil de transformación: (x,y,z) → (y,z,x). En cualquier caso, de la 4 a la 7 son hacer que 120 grados de rotación y, a continuación, hacer la rotación de 180 grados de 0 a 3. 8 a 11 hacer que 120 rotación de dos veces, por lo que (x,y,z) → (z,x,y), y, a continuación, la rotación de 180 grados de 0 a 3. La composición es una molestia (agregar el alto nibble mod 3, pero tomar uno de los aperitivos y el uso que se arremolina la baja nibble).
Los números del 16 al 27 se utiliza para la rotación de las simetrías del cubo que cambiar el interior de tetraedros. Esto también es muy fácil de describir como una transformación: si el bit 8 se establece, a continuación, aplicar la rotación se obtiene mediante la celebración de enfrente de los bordes verticales del cubo y girar 180: (x,y,z) → (y,x,d,−z).
Los números 32 a 43 y 48 a 59 se utilizan para el reflectiva simetrías del cubo (el primer lote de ser simetrías de los dos tetraedros, y el segundo lote de intercambio de dos tetraedros). Me gusta usar las coordenadas de intercambio de las dos primeras coordenadas: x,y,z) → (y,x,z).
Aquí es real código de buena ole javascript para hacerlo:
applySymmetry = function( which, d, x, y, z ) {
var t;
// Peel off the "are we a reflection?" bit
if( which & 32 ) { t=x; x=y; y=t; }
// Peel off the "do we swap the tetrahedrons?" bit
if( which & 16 ) { t=x; x=y; y=t; z=d-z; }
// Now we are in tetrahedral group, peel off the "120-ness"
switch( (which & (4+8) ) >> 2 ) {
case 0: break;
case 1: t=x; x=y; y=z; z=t; break;
case 2: t=z; z=y; y=x; x=t; break;
case 3: alert('Not cool dude'); break;
}
// Now we are in the Klein four group, peel off the "180-ness"
switch( which & (1+2) ) {
case 0: break;
case 1: x=d-x; y=d-y; break;
case 2: y=d-y; z=d-z; break;
case 3: z=d-z; x=d-x; break;
}
return [x,y,z];
}
applyAllSymmetries = function( d, x, y, z ) { // return the orbit
var i, j, k, ret;
ret = [];
for( i = 0 ; i < 2 ; i++ ) {
for( j = 0 ; j < 2 ; j++ ) {
for( k = 0 ; k < 12 ; k++ ) {
ret.push( applySymmetry( 32*i+16*j+k, d, x, y, z ) );
}
}
}
return ret;
}
Este código está pensado para exhibir el jefe de la serie. Usted podría optimizar el applySymmetry
función de la combinación de la manipulación de los bits de 16 y 32, y se podría optimizar applyAllSymmetries
mediante el uso de un "pie en el grafo de Cayley" (en lugar de utilizar coset representantes como estoy).
También se puede intercambiar el orden de los bits 4 y 5 si quería centrarse en el "tetraedro frente cubo" en lugar de "rotación frente a la reflexión".