Transformaciones Lineales en el Plano con Python.

Hola y bienvenidos una vez más a vuestro blog sobre programación en Python en el que, siguiendo con nuestra línea de artículos sobre simulaciones y aplicación de conceptos matemáticos, hoy hablaremos de las Transformaciones Lineales en el Plano con Python. Estas constituyen una de las herramientas más potentes del álgebra lineal, ya que permiten modificar un conjunto de puntos del plano aplicando operaciones como rotaciones, escalados, cizallamientos y reflexiones. Transformaciones, las cuales, representaremos mediante matrices y cuya aplicación se realiza mediante la multiplicación matricial. En este artículo exploraremos cómo usar Python, junto a las librerías Numpy y Matplotlib, para simular y visualizar dichas transformaciones lineales en 2D, utilizando figuras geométricas simples.

CONCEPTO MATEMÁTICO:

En matemáticas, una transformación lineal en el plano es una función que toma puntos de un espacio bidimensional y los mapea en otros puntos del mismo espacio, preservando la linealidad. Esto significa que las líneas rectas permanecen rectas y el origen (0, 0) se mantiene fijo. Una forma muy útil de representar este tipo de transformaciones es mediante matrices, específicamente matrices de 2×2 cuando se trabaja en el plano.

Esta transformación se define mediante una matriz:

Donde los valores a, b, c, y d, determinan la naturaleza de la transformación. Esta matriz actúa sobre un vector columna que representa un punto del plano:

De modo que podremos aplicar la transformación T al vector v mediante el producto matricial:

IMPLEMENTACIÓN EN PYTHON:

A continuación nos disponemos a aplicar este tipo de transformaciones en Python sobre los vértices de una figura cuadrada definida en un plano 2D valiéndonos de las librerías numpy (para definir la figura) y matplotlib (para su representación). Dichos vértices los definiremos en un array al que hemos dado el sencillo nombre de figura. En dicho array, definiremos dos veces el punto (0,0) para que la figure quede correctamente cerrada en la representación:

OUTPUT:

Esta es la figura sobre la que aplicaremos las transformaciones.

MATRIZ IDENTIDAD.

A continuación, partiendo de la teoría vista, iremos aplicando cada una de las siguientes transformaciones lineales: Rotación, reflexión, escalado y cizallamiento, no sin antes, hacer notar que las 4 matrices de transformación podrían considerarse versiones alteradas de la matriz identidad que multiplicada por cada vértice de la figura original, nos da, precisamente esa misma figura y en la misma posición y forma en el plano, sin producir ningún cambio (por algo la llamamos matriz identidad).

Matriz Identidad de 2 dimensiones.

Para comprobarlo, realizaremos la aplicación de esta matriz en código Python (ahora más adelante, explicaremos, mas en detalle, el código):

OUTPUT:

Como se ve, el resultado de la transformación (en rojo) coincide exactamente con la original que queda oculta tras ella.

Pasemos, ahora sí, a ver las distintas transformaciones. Empezando por la más compleja de ellas.

ROTACIÓN.

Para aplicar una rotación (de 45º en este caso) introduciremos algunas modificaciones en nuestro código. Siendo la primera de ellas, la definición de la matriz de rotación que crearemos usando la librería numpy:

Dado que nuestra intención es aplicar una rotación de 45º a nuestro cuadrado, aplicaremos las operaciones de seno y coseno sobre el resultado de dividir pi (obtenido con np.pi) por 4. Una vez definida la matriz de rotación deberemos multiplicarla por la que contiene los vertices de nuestra figura. Para ello definiremos una función transformar() que tomará como argumentos, ambas matrices y empleará el método .dot() para realizar dicha operación. Esta figura devolverá una nueva matriz con cada uno de los vértices de la figura original, transformados. Una vez definida, haremos la llamada a dicha función, pasándole las referidas matrices:

Una vez aplicada la transformación, pasaremos a su representación en el plano, con matplotlib, incluyendo ahora la figura resultante de la multiplicación de matrices:

OUTPUT:

Obtenemos así la representación de nuestra figura original junto a la versión rotada 45º, respecto al punto 0,0, de la misma. Para recapitular el código completo que hemos ejecutado sería el que sigue:

A continuación y para el resto de transformaciones, la explicación es muy sencilla, ya que basta con definir la concreta matriz de transformación que vamos a multiplicar por nuestra matriz original, dejando intacta la función de multiplicación. Modificando, eso si, la matriz transformada a representar gráficamente.

ESCALADO.

En este caso, nos disponemos a realizar cambios en la escala, tanto para el eje x (0.5) como para el eje y (de 0.5). Estos valores aplicados sobre la matriz original, dará como resultado una nueva figura mas achatada por el eje x y alargada por el eje y, con respecto a la original. De este modo el código quedaría así:

OUTPUT:

Si eligiéramos el mismo valor para ambos ejes (por ejemplo 1.5):

OUTPUT:

Obtendríamos una versión de mayor tamaño, a la original, pero guardando las mismas proporciones.

REFLEXIÓN.

Aplicamos esta transformación para obtener un reflejo de la figura original, en el eje x, y o en ambos, mediante el cambio de signo del valor 1 en el eje correspondiente de la matriz identidad. Así, si lo que queremos es generar una versión refleja de nuestra figura justo debajo de ella, realizaremos el cambio de signo (a negativo) del valor correspondiente al eje y:

OUTPUT:

CIZALLAMIENTO.

En la última transformación que vamos a ver, lo que hacemos es desplazar uno de los lados respecto al otro siguiendo uno de los ejes (el x en este caso) provocando una deformación respecto de la figura original. Para ello, simplemente cambiaremos el valor del 0 original de la matriz identidad. para dicho eje, tal y como se puede ver en el código:

OUTPUT:

CONCLUSIÓN:

En el presente artículo hemos visto, de forma muy gráfica, en que consisten y como pueden realizarse las distintas transformaciones lineales en un plano 2D, utilizando el lenguaje Python. A partir de este punto, el lector puede probar a combinar más de una transformación, empleando una misma matriz, e ir comprobando el resultado en la gráfica. Lo que sin duda le ayudará a entender la naturaleza y aplicación de este interesante concepto matemático.

Saludos.