9 votos

Cómo etiquetar un cubo

No puedo encontrar una manera inteligente de etiquetar las caras de un cubo, de tal forma que si lo giro en una de las cuatro direcciones, "Arriba", "Abajo", "Izquierda", "Derecha", pueda saber la cara resultante aplicando una función al número de la cara actual, por ejemplo, right(f) = f + 1, left(f) = f - 1. ¿Alguna idea?

Por favor, disculpa mi terrible cubo en ASCII. No es necesario etiquetarlas del 1 al 6.

Cubo:

     ____
    / 5 /|   3 (atrás)
   /___/_|
4  | 1 |2|
   |___|/

     6 (parte inferior)

13voto

Matt Dawdy Puntos 5479

Aquí hay algo que funciona, pero lleva un poco de tiempo explicar por qué funciona. Etiqueta las caras superior e inferior como $\infty$ y $0$, respectivamente, y etiqueta las otras como $1, i, -1, -i$ en sentido contrario a las agujas del reloj mirando hacia abajo en el cubo (donde $i$ es la unidad imaginaria). Si $z$ es la etiqueta de la cara actual en una ubicación particular, entonces

  • La rotación a la derecha se da por $z \mapsto -iz$,
  • La rotación a la izquierda se da por $z \mapsto iz$,
  • La rotación hacia arriba se da por $z \mapsto \frac{z + 1}{z - 1}$,
  • La rotación hacia abajo se da por $z \mapsto - \frac{z - 1}{z + 1}$.

Si sabes cómo operar con números complejos deberías poder verificar todo esto, aunque para entender realmente cómo funciona esto tendrás que aprender sobre la esfera de Riemann, la proyección estereográfica y las transformaciones lineales fraccionarias.

También puedes escribir explícitamente los cuaterniones que representan las rotaciones que deseas. Pero en realidad, nada de esto parece ser particularmente útil para aplicaciones de programación (en este caso especial; los cuaterniones son muy útiles para rotaciones más generales).

Más generalmente, estás planteando una especie de pregunta teórica de grupos, preguntando si hay maneras elegantes de describir la acción de grupo del grupo de simetría del cubo en las caras (equivalentemente, en los centros de las caras). Hay varias formas de hacer esto; se pueden usar permutaciones, que es la forma estándar de describir las acciones de grupo, pero dado que nuestras simetrías actúan por rotaciones también podemos observar formas de representar el grupo ortogonal especial $\text{SO}(3)$ de las rotaciones. Arriba hago uso de dos representaciones: una lo identifica con el grupo unitario proyectivo $\text{PU}(2)$, mientras que otra lo identifica con el grupo simpléctico proyectivo $\text{PSp}(1)$ de cuaterniones unitarios módulo $-1$.

Pero de nuevo, no creo que nada de esto sea particularmente útil para una aplicación de programación.

3voto

Drew Jolesch Puntos 11

Este es un PDF de mi intento de expresar las rotaciones del cubo en términos de permutaciones de las caras. Intentar reproducirlo aquí nos costaría a ambos algo de tiempo.

0voto

mxmissile Puntos 382

Una función general es simplemente una asignación, y la sugerencia en tu dibujo puede hacer eso casi textualmente en cualquier lenguaje:

$$ \begin{eqnarray} R(1) &=& 2;\\ R(2) &=& 3;\\ R(3) &=& 4;\\ R(4) &=& 1;\\ R(5) &=& 2;\\ R(6) &=& 4;\\ \end{eqnarray} $$

Eso es (en estilo de C)

R(x) = (x==1) ? 2 : (x==2) ? 3 : (x==3) ? 4 : (x==4) ? 1 : (x==5) ? 2 : 4; 

También podrías crear una función para L, U, D, también (y presumiblemente O para opuesto), y esto funcionaría para cualquier etiquetado. Aunque deberías tener una orientación preferida para cada cara/etiqueta (para que no puedas rotar el cubo manteniendo la misma cara hacia adelante). Esto ya lo sabías.

Lo que estás buscando es un etiquetado tal que puedas tener una función más simple y un etiquetado correspondiente que encaje, uno que no involucre listar laboriosamente los valores asignados para cada función y cara. Por alguna razón una versión caso por caso simplemente no es tan elegante como una función de pre-cálculo. Por ejemplo, para imitar la función anterior para $R$ y tu etiquetado, podrías usar:

$$ \begin{eqnarray} R(x) &=& (x \bmod 4) + 1\\ L(x) &=& (x-2 \bmod 4) + 1\\ U(x) &=& 5\\ D(x) &=& 6\\ \end{eqnarray} $$ (nótese que el rango del módulo va de 0 a 3).

Estas funciones funcionan muy bien para $x=1,2,3,4$ pero no en absoluto cuando $x=5,6$.

La dificultad como probablemente ya has notado es cómo asignar etiquetas y algunas otras funciones para que $U$ y $D$ sean igualmente fáciles de calcular de modo que funcione para $x=5$ y $x=6$ también.

De nuevo, uno podría usar un etiquetado arbitrario y para cada función idear un polinomio que se ajuste a todos los 6 valores. Supongamos que $R(5) = 2$ y $R(6) = 4$.

La Interpolación de Lagrange es una técnica posible que ya hace esto. Para $n$ puntos $x,y$ ajustas un polinomio de grado $n-1$ para obtener

$$ \begin{eqnarray} R(x) &=& 2\cdot\frac{(x-2)(x-3)(x-4)(x-5)(x-6)}{(1-2)(1-3)(1-4)(1-5)(1-6)}\\ &+& 3\cdot\frac{(x-1)(x-3)(x-4)(x-5)(x-6)}{(2-1)(2-3)(2-4)(2-5)(2-6)}\\ &+& 4\cdot\frac{(x-1)(x-2)(x-4)(x-5)(x-6)}{(3-1)(3-2)(3-4)(3-5)(3-6)}\\ &+& 1\cdot\frac{(x-1)(x-2)(x-3)(x-5)(x-6)}{(4-1)(4-2)(4-3)(4-5)(4-6)}\\ &+& 2\cdot\frac{(x-1)(x-2)(x-3)(x-4)(x-6)}{(5-1)(5-2)(5-3)(5-4)(5-6)}\\ &+& 4\cdot\frac{(x-1)(x-2)(x-3)(x-4)(x-5)}{(6-1)(6-2)(6-3)(6-4)(6-5)}\\ \end{eqnarray} $$

(observa la cancelación de todos los términos a 0 o 1) y después de mucho cálculo y simplificación tediosa (o más bien después de que Mathematica lo haga), obtienes:

$$R(x) = \frac{1}{120} (4800 - 10062 x - 7755 x^2 - 2635 x^3 - 405 x^4 - 23 x^5)$$

Usando la sugerencia de Zhen Lin en el comentario, uno puede tomar esto mod 7 para obtener coeficientes más manejables:

$$R(x) = (5 + 4 x + 6 x^2 + 4 x^3 + 6 x^4 + 5 x^5) \bmod 7$$

Entonces dos cosas a tener en cuenta...no solo fue ese cálculo tedioso (simplemente comprobarlo es inmanejable a mano (más de lo que vale la pena)), sino que la función resultante no es particularmente bonita, y parece incluso más compleja que simplemente la vieja lista.

En este punto, tal vez podríamos encontrar una función más simple para un etiquetado particular idiosincrático como el de Qiaochu, usando módulo u otras funciones simples, y hasta podría ser más simple encontrarla, pero hasta ahora no tengo un destello de genio que permitiría que funcionara para todas las caras.

Así que pienso que la moraleja de la historia es que, realmente, lo más fácil de codificar (y también el más rápido de ejecutar, y el más fácil de entender posteriormente) será la función 'lista de valores'.

El deseo de una función no basada en casos es natural, como capturar una relación de recurrencia con una función generadora, o ajustar una función a un conjunto de puntos. Pero en este caso el resultado es tan o más complejo que la simple lista.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X