34. Transformaciones geométricas 2D

Transformar una figura significa cambiar la posición de todos sus puntos mediante una regla coherente. Traslación, rotación, escalado y reflexión permiten mover, orientar y redimensionar objetos sin reconstruir su geometría.

34.1 Introducción

Una transformación es una función que recibe un punto P=(x,y) y produce otro P'=(x',y'). Al aplicar la misma función a todos los vértices obtenemos una nueva versión del objeto.

En gráficos 2D estas operaciones controlan sprites, cámaras, interfaces, animaciones, jerarquías y sistemas de coordenadas. Separar la geometría original de su transformación simplifica el programa.

34.2 Qué puede cambiar y qué se conserva

TransformaciónCambiaConserva
TraslaciónPosiciónLongitudes, ángulos y orientación
RotaciónPosición y direcciónLongitudes, ángulos y área
Escalado uniformeTamañoÁngulos y proporciones
Escalado no uniformeTamaño y proporcionesParalelismo
ReflexiónOrientaciónLongitudes, ángulos y área

Traslación, rotación y reflexión son isometrías porque conservan distancias.

34.3 Interpretación visual

Figura original y copias trasladada, rotada, escalada y reflejada, con comparación del orden
Una figura asimétrica permite reconocer con facilidad rotaciones, reflexiones y cambios de escala.

34.4 Transformar puntos, vectores y objetos

Un objeto poligonal se transforma aplicando la regla a cada vértice. Las curvas pueden transformar sus puntos de control o dibujarse dentro de un contexto ya transformado.

Una posición representa un lugar y sí responde a una traslación. Un vector de dirección representa un desplazamiento y no debe recibir esa traslación; solo las partes lineales como rotación y escala.

punto: posición completa
vector: diferencia entre posiciones

34.5 Traslación

Una traslación suma el mismo desplazamiento t=(tx,ty) a todos los puntos:

x'=x+tx
y'=y+ty
P'=P+t

No modifica tamaño, forma ni orientación. Su transformación inversa utiliza (−tx,−ty).

34.6 Rotación

Alrededor del origen y con ángulo θ en radianes:

x'=x cosθ−y senθ
y'=x senθ+y cosθ

Una rotación conserva distancias y áreas. Su inversa usa −θ. En pantalla debe considerarse que el eje y crece hacia abajo.

34.7 Escalado

x'=sx·x
y'=sy·y

Si sx=sy, el escalado es uniforme. Un factor mayor que 1 amplía; entre 0 y 1 reduce; cero aplasta una dimensión; un valor negativo escala y refleja.

El área se multiplica por |sx·sy|. La inversa existe solo si ambos factores son distintos de cero y utiliza 1/sx,1/sy.

34.8 Reflexión y simetría

respecto del eje x: (x,y)→(x,−y)
respecto del eje y: (x,y)→(−x,y)
respecto del origen: (x,y)→(−x,−y)

Una reflexión invierte la orientación de los vértices. Aplicar dos veces la misma reflexión devuelve el objeto original.

34.9 Pivotes y coordenadas locales

Rotar o escalar alrededor de un pivote C requiere tres pasos: llevar C al origen, aplicar la operación y devolverlo a su posición:

P'=C + transformar(P−C)

En coordenadas locales, el objeto se modela alrededor de un origen conveniente. Su transformación lo lleva al espacio global. Esta separación facilita animaciones y jerarquías como brazo-mano o vehículo-rueda.

34.10 Composición y orden de aplicación

Varias transformaciones pueden componerse en una sola secuencia. Sin embargo, generalmente no conmutan:

rotar(trasladar(P)) ≠ trasladar(rotar(P))

Escalar y luego trasladar deja intacto el vector de traslación; trasladar y luego escalar también escala ese desplazamiento. Por eso el orden debe estar explícito.

34.11 Simulación interactiva

Modifica traslación, rotación y escala. El contorno blanco conserva la geometría original; el objeto coloreado muestra el resultado. Cambia el orden para comparar composiciones.

originaltransformada
Orden aplicadoS → R → T
Determinante lineal1.25
Área relativa×1.25
Orientaciónconservada

34.12 Transformar una figura completa

function transformar(p, posicion, escala, angulo) {
  const x = p.x * escala.x;
  const y = p.y * escala.y;
  return {
    x: posicion.x + x*Math.cos(angulo) - y*Math.sin(angulo),
    y: posicion.y + x*Math.sin(angulo) + y*Math.cos(angulo)
  };
}

const figura = [
  { x: 0, y: 0 }, { x: 4, y: 0 }, { x: 2, y: 3 }
];
const posicion = { x: 5, y: 2 };
const escala = { x: 2, y: 1.5 };
const angulo = 30 * Math.PI / 180;

figura.map(p => transformar(p, posicion, escala, angulo))
  .forEach((p, i) =>
    console.log(`V${i}: (${p.x.toFixed(2)}, ${p.y.toFixed(2)})`)
  );

Al presionar Ejecutar, se muestran los vértices después de aplicar escala, rotación y traslación, sin depender de un contexto gráfico.

34.13 Transformación manual reutilizable

function transformarPunto(p,{pos,escala,angulo}) {
  const x=p.x*escala.x;
  const y=p.y*escala.y;
  const cos=Math.cos(angulo);
  const sin=Math.sin(angulo);
  return {
    x:pos.x+x*cos-y*sin,
    y:pos.y+x*sin+y*cos
  };
}

const transformacion = {
  pos: { x: 3, y: 2 },
  escala: { x: 2, y: 0.5 },
  angulo: Math.PI / 2
};
const original = { x: 4, y: 2 };
const resultado = transformarPunto(original, transformacion);

console.log(`Original: (${original.x}, ${original.y})`);
console.log(`Transformado: (${resultado.x.toFixed(2)}, ${resultado.y.toFixed(2)})`);

Al presionar Ejecutar, se muestra el punto transformado. Esta función aplica escala, luego rotación y finalmente traslación.

34.14 Aplicaciones, errores y conclusión

Las transformaciones se utilizan en sprites, cámaras, esqueletos, escenas jerárquicas, herramientas de edición, efectos espejo, zoom y adaptación de interfaces.

Ejemplo animado: robot jerárquico y efecto espejo

El torso actúa como nodo padre. Cabeza, hombros, brazos y manos heredan su transformación, mientras cada articulación agrega su propio giro. La escena también aplica zoom de cámara y una reflexión horizontal completa.

padre → hijo → articulaciónorientación conservada
Jerarquía: 7 nodos

Errores comunes

  • Usar grados donde JavaScript espera radianes.
  • Rotar o escalar alrededor del origen cuando se necesitaba un pivote.
  • Confundir puntos con vectores y trasladar una dirección.
  • Ignorar el orden de composición.
  • Modificar directamente los puntos originales cuando debían conservarse.
  • Intentar invertir una escala con factor cero.
  • No detectar el cambio de orientación producido por una reflexión.

Recuerda: cada transformación es una función de puntos; un pivote se maneja trasladando temporalmente al origen; y el orden de aplicación forma parte del resultado.

En el próximo tema estudiaremos en profundidad la traslación de objetos.