4 votos

Java Tetris - Uso de las matemáticas de la matriz de rotación para girar la pieza

Estoy trabajando en la construcción de tetris ahora en Java y estoy en el punto de rotaciones...

Originalmente codifiqué todas las rotaciones, pero descubrí que el álgebra lineal (rotaciones matriciales) era la mejor manera de hacerlo.

Estoy intentando utilizar una matriz de rotación para girar mis piezas, y he descubierto que necesito un buen conocimiento de la trigonometría.

No entiendo cómo R(90 grados) equivale a una matriz de rotación de R(-theta) = $$\begin{bmatrix}cos0 &sin0 \\-sin0 & cos0\end{bmatrix}$$ , alias $$\begin{bmatrix} 0 & 1 \\ -1& 0 \end{bmatrix}$$ (btw, si sabes cómo hacer una matriz en stackoverflow, por favor házmelo saber). ¿Cómo equivale eso a una rotación de 90 grados? ¿De dónde salen esos ceros y unos? Además, ¿cómo se traduciría eso en código? No estoy buscando a alguien que lo codifique por mí, estoy buscando un concepto con tal vez un fragmento de pseudocódigo.

Estoy intentando visualizarlo con este dibujo poniendo la rejilla y las fichas en un gráfico y dibujando los ángulos... pero sigo sin entenderlo.

enter image description here

¿Alguien puede ayudar?

Gracias.


Transponiendo

enter image description here

2 votos

Para obtener información básica sobre la escritura de las matemáticas en este sitio, consulte, por ejemplo aquí , aquí , aquí y aquí . En particular, la primera respuesta a la pregunta del primer enlace le ayudará a componer las matrices.

0 votos

Muy útil. Gracias

0 votos

Tu matriz de rotación es una matriz de rotación del espacio vectorial y quieres una transformación afín, no una lineal.

1voto

gsiegman Puntos 674

Las operaciones que desea realizar pueden implementarse fácilmente sin la necesidad de matrices de rotación, ya que las transformaciones que desea se limitan a rotaciones de ángulo recto y reflejos.

Suponiendo que $B$ es una matriz bidimensional que representa un bloque y $B[i,j]$ es el $i^{\text{th}}$ fila y $j^{\text{th}}$ columna del bloque que toma los valores de 1 para un segmento de bloque único y 0 para un espacio vacío.

La primera operación que necesitas es una transposición, que es efectivamente una rotación de 90 grados en el sentido de las agujas del reloj:

B T(B b)
    B b' <- new B[b.columns, b.rows]

    for i = 0 to b.rows - 1
        for j = 0 to b.columns -1
            b'[j,i] <- b[i, j]

    return b'

La segunda operación consiste en reflejar un bloque en torno al eje Y:

B Y(B b)
    B b' <- new B[b.rows, B.columns]

    for i = 0 to b.rows - 1
        for j = 0 to b.columns - 1
            b'[i,j] <- b[i, b.columns - 1 - j]

    return b'

Y, por último, reflejar un bloque en torno al eje x:

B X(B b)
    B b' <- new B[b.rows, B.columns]

    for i = 0 to b.rows - 1
        for j = 0 to b.columns - 1
            b'[i,j] <- b[b.rows - 1 - i, j]

    return b'

Dado un bloque $B$ en posición neutra, un giro de 90 grados en el sentido de las agujas del reloj es $T(B)$ 180 es $T(X(T(B)))$ , 270 es $Y(T(B))$ y 360 es simplemente $B$ . las rotaciones en sentido contrario a las agujas del reloj son simplemente 360 menos las rotaciones complementarias en sentido de las agujas del reloj.

Además, como señaló @StevenStadnicki en los comentarios, puedes codificar mucho de esto y encontrarás que si estás replicando el Tetris original, te encontrarás con más cosas que requieren una solución codificada que no.

0 votos

De acuerdo, pero así es como empecé a hacerlo (ver aquí: stackoverflow.com/questions/15884051/java-tetris-rotations ), pero me pareció bastante peliagudo tener que calcular cada rotación de cada bloque para las rotaciones a la izquierda o a la derecha... ¿a no ser que lo esté haciendo mal?

0 votos

Ahh... finalmente entiendo por qué lo estabas reflejando... Una vez que se transpone ... usted tiene su 0 grados y 90 grados de rotación ... entonces usted puede reflejar tanto de los que para obtener su falta 2 rotaciones (180 y 270 grados). Inteligente... jaja

0 votos

¿Es mi gráfico de arriba la representación correcta de lo que has dicho?

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