67. Funciones en gráficos 2D

67.1 Introducción

Los gráficos 2D se construyen ubicando puntos, líneas, curvas y figuras sobre un plano. Las funciones matemáticas permiten calcular esas posiciones y transformar los objetos de forma precisa.

En programación, una función puede convertir datos en coordenadas, dibujar una curva, escalar una figura, rotar un punto o decidir si un objeto está dentro de una región.

67.2 El plano 2D

Un gráfico 2D trabaja con pares ordenados (x, y). Cada punto se identifica mediante una posición horizontal y una posición vertical.

const punto = { x: 30, y: 80 };

console.log("Coordenada x:", punto.x);
console.log("Coordenada y:", punto.y);
console.log("Punto:", `(${punto.x}, ${punto.y})`);

Las operaciones gráficas suelen recibir puntos como entrada y devolver nuevos puntos como resultado.

67.3 Sistema de coordenadas de pantalla

En matemática, el eje y suele crecer hacia arriba. En muchas pantallas y lienzos 2D, y crece hacia abajo.

function convertirYMatematicaAPantalla(y, alto) {
  return alto - y;
}

const altoLienzo = 300;
const yMatematica = 75;
const yPantalla = convertirYMatematicaAPantalla(yMatematica, altoLienzo);

console.log("y matemática:", yMatematica);
console.log("y en pantalla:", yPantalla);

Esta conversión es común cuando se quiere dibujar una función matemática en un canvas o área gráfica.

67.4 Funciones que generan puntos

Una función puede devolver un punto calculado a partir de un parámetro. Esto permite construir trayectorias, curvas y patrones.

function puntoEnRecta(t) {
  return {
    x: t,
    y: 2 * t + 1
  };
}

for (let t = 0; t <= 4; t++) {
  console.log(puntoEnRecta(t));
}

67.5 Mapear valores a píxeles

Los datos de un programa no siempre están en la misma escala que la pantalla. Una función de mapeo convierte un valor de un intervalo a otro.

function mapear(valor, minOrigen, maxOrigen, minDestino, maxDestino) {
  const proporcion = (valor - minOrigen) / (maxOrigen - minOrigen);
  return minDestino + proporcion * (maxDestino - minDestino);
}

const temperatura = 25;
const x = mapear(temperatura, 0, 50, 0, 400);

console.log("Temperatura:", temperatura);
console.log("Posición x:", x);

Esta técnica se usa para construir gráficos de barras, líneas, indicadores y visualizaciones de datos.

67.6 Dibujar una línea

Una línea entre dos puntos puede representarse con una función que interpola entre ambos extremos.

function interpolarPunto(a, b, t) {
  return {
    x: a.x + (b.x - a.x) * t,
    y: a.y + (b.y - a.y) * t
  };
}

const inicio = { x: 10, y: 20 };
const fin = { x: 90, y: 60 };

for (let i = 0; i <= 4; i++) {
  const t = i / 4;
  console.log("t =", t, interpolarPunto(inicio, fin, t));
}

67.7 Rectángulos

Un rectángulo se puede describir mediante su posición, ancho y alto. A partir de esos datos se calculan sus vértices.

function verticesRectangulo(x, y, ancho, alto) {
  return [
    { x, y },
    { x: x + ancho, y },
    { x: x + ancho, y: y + alto },
    { x, y: y + alto }
  ];
}

console.log(verticesRectangulo(20, 10, 80, 40));

67.8 Círculos

Los puntos de un círculo se calculan con seno y coseno. El ángulo indica la dirección desde el centro.

function puntoEnCirculo(centro, radio, angulo) {
  return {
    x: centro.x + radio * Math.cos(angulo),
    y: centro.y + radio * Math.sin(angulo)
  };
}

const centro = { x: 100, y: 100 };

for (let i = 0; i < 4; i++) {
  const angulo = i * Math.PI / 2;
  console.log(puntoEnCirculo(centro, 30, angulo));
}

67.9 Curvas de funciones

Para graficar una función matemática, se calculan muchos puntos y se unen visualmente.

function f(x) {
  return x * x;
}

const puntos = [];

for (let x = -3; x <= 3; x++) {
  puntos.push({ x, y: f(x) });
}

console.log(puntos);

Cuantos más puntos se calculen, más suave parecerá la curva.

67.10 Curvas paramétricas

Una curva paramétrica calcula x e y a partir de un mismo parámetro. Es útil para órbitas, espirales y trayectorias.

function espiral(t) {
  const radio = 4 * t;

  return {
    x: radio * Math.cos(t),
    y: radio * Math.sin(t)
  };
}

for (let i = 0; i <= 6; i++) {
  const t = i * 0.5;
  console.log("t =", t.toFixed(1), espiral(t));
}

67.11 Trasladar puntos

Trasladar consiste en sumar un desplazamiento a las coordenadas de un punto.

function trasladar(punto, dx, dy) {
  return {
    x: punto.x + dx,
    y: punto.y + dy
  };
}

const punto = { x: 15, y: 25 };
const movido = trasladar(punto, 10, -5);

console.log("Original:", punto);
console.log("Movido:", movido);

67.12 Escalar figuras

Escalar cambia el tamaño de una figura. Si se escala un punto respecto del origen, se multiplican sus coordenadas por un factor.

function escalar(punto, factor) {
  return {
    x: punto.x * factor,
    y: punto.y * factor
  };
}

const triangulo = [
  { x: 0, y: 0 },
  { x: 4, y: 0 },
  { x: 2, y: 3 }
];

const trianguloGrande = triangulo.map(p => escalar(p, 2));
console.log(trianguloGrande);

67.13 Rotar puntos

La rotación usa seno y coseno. Para rotar un punto alrededor del origen se aplica una transformación trigonométrica.

function rotar(punto, angulo) {
  return {
    x: punto.x * Math.cos(angulo) - punto.y * Math.sin(angulo),
    y: punto.x * Math.sin(angulo) + punto.y * Math.cos(angulo)
  };
}

const punto = { x: 10, y: 0 };
const rotado = rotar(punto, Math.PI / 2);

console.log(rotado);

67.14 Rotación alrededor de un centro

Para rotar alrededor de un centro distinto del origen, primero se traslada el punto al origen, se rota y luego se vuelve a trasladar.

function rotarAlrededor(punto, centro, angulo) {
  const dx = punto.x - centro.x;
  const dy = punto.y - centro.y;

  return {
    x: centro.x + dx * Math.cos(angulo) - dy * Math.sin(angulo),
    y: centro.y + dx * Math.sin(angulo) + dy * Math.cos(angulo)
  };
}

const punto = { x: 8, y: 5 };
const centro = { x: 5, y: 5 };

console.log(rotarAlrededor(punto, centro, Math.PI));

67.15 Distancia entre puntos

La distancia euclidiana permite medir separación entre objetos, detectar cercanía y construir interacciones.

function distancia(a, b) {
  const dx = b.x - a.x;
  const dy = b.y - a.y;
  return Math.sqrt(dx * dx + dy * dy);
}

const jugador = { x: 20, y: 30 };
const moneda = { x: 25, y: 42 };

console.log("Distancia:", distancia(jugador, moneda).toFixed(2));

67.16 Colisión con círculo

Una forma simple de detectar si un punto está dentro de un círculo es comparar la distancia con el radio.

function puntoDentroDeCirculo(punto, centro, radio) {
  const dx = punto.x - centro.x;
  const dy = punto.y - centro.y;
  return dx * dx + dy * dy <= radio * radio;
}

const punto = { x: 12, y: 14 };
const centro = { x: 10, y: 10 };

console.log(puntoDentroDeCirculo(punto, centro, 5));

Se comparan cuadrados para evitar calcular la raíz cuadrada innecesariamente.

67.17 Colisión con rectángulo

Para saber si un punto está dentro de un rectángulo alineado a los ejes, se revisan sus límites horizontales y verticales.

function puntoDentroDeRectangulo(punto, rect) {
  return punto.x >= rect.x &&
         punto.x <= rect.x + rect.ancho &&
         punto.y >= rect.y &&
         punto.y <= rect.y + rect.alto;
}

const rect = { x: 10, y: 20, ancho: 80, alto: 40 };
const punto = { x: 50, y: 30 };

console.log(puntoDentroDeRectangulo(punto, rect));

67.18 Funciones para animación

En gráficos 2D, una animación puede interpretarse como una función del tiempo. El tiempo entra como parámetro y la posición sale como resultado.

function posicionAnimada(tiempo) {
  return {
    x: 50 + 30 * Math.cos(tiempo),
    y: 50 + 30 * Math.sin(tiempo)
  };
}

for (let i = 0; i <= 5; i++) {
  const tiempo = i * 0.4;
  console.log(posicionAnimada(tiempo));
}

67.19 Curvas de suavizado

Las funciones de suavizado cambian la velocidad aparente de una animación. En vez de avanzar linealmente, permiten comenzar lento, acelerar o frenar.

function suavizado(t) {
  return t * t * (3 - 2 * t);
}

for (let i = 0; i <= 5; i++) {
  const t = i / 5;
  console.log("t:", t.toFixed(2), "suave:", suavizado(t).toFixed(3));
}

67.20 Normalizar vectores

Un vector normalizado conserva su dirección, pero tiene longitud 1. Esto es útil para mover objetos a velocidad constante en una dirección.

function normalizar(vector) {
  const longitud = Math.sqrt(vector.x * vector.x + vector.y * vector.y);

  if (longitud === 0) {
    return { x: 0, y: 0 };
  }

  return {
    x: vector.x / longitud,
    y: vector.y / longitud
  };
}

console.log(normalizar({ x: 3, y: 4 }));

67.21 Aplicaciones en programación

Las funciones en gráficos 2D se usan en:

  • Videojuegos con mapas, personajes y proyectiles.
  • Interfaces con animaciones y transiciones.
  • Gráficos de datos y tableros de control.
  • Editores de imágenes, diagramas y mapas.
  • Simulaciones visuales de fenómenos físicos.
  • Detección de colisiones y selección con el mouse.

67.22 Errores comunes

Al trabajar con gráficos 2D conviene prestar atención a estos errores:

  • Confundir el eje y matemático con el eje y de pantalla.
  • No separar los datos del dibujo.
  • Usar escalas inconsistentes entre datos y píxeles.
  • Olvidar convertir grados a radianes en funciones trigonométricas.
  • Repetir cálculos geométricos en lugar de encapsularlos en funciones.

67.23 Conclusión

Los gráficos 2D dependen de funciones que convierten números en posiciones, formas y movimientos. Con operaciones como mapear, interpolar, trasladar, escalar y rotar, se pueden construir dibujos, animaciones y visualizaciones de forma ordenada.

El objetivo no es memorizar fórmulas aisladas, sino reconocer qué transformación necesita el programa y expresarla como una función clara.

Volver al índice