46. Curvas de Bézier y trazado de curvas

Las curvas de Bézier convierten interpolaciones lineales encadenadas en trayectorias suaves y controlables. Son esenciales en dibujo vectorial, animación, tipografía, interfaces y movimiento 2D.

46.1 Introducción

Una línea recta queda determinada por dos extremos. Para construir una curva necesitamos además puntos que controlen la dirección y la intensidad con que la trayectoria se aparta del segmento.

Una curva de Bézier interpola los extremos, pero normalmente no pasa por los controles interiores. Estos actúan como imanes que moldean la curva.

46.2 Bézier lineal

El caso de grado uno coincide con la interpolación lineal:

B(t)=(1−t)P₀+tP₁,   0≤t≤1

Al variar t se recorre el segmento desde P₀ hasta P₁.

46.3 Curva cuadrática

Una Bézier cuadrática usa dos extremos P₀, P₂ y un control P₁:

B(t)=(1−t)²P₀+2(1−t)tP₁+t²P₂

La curva comienza orientada hacia P₁ y termina llegando desde la dirección P₁→P₂.

46.4 Construcción de De Casteljau

La fórmula cuadrática puede construirse mediante tres interpolaciones:

A=lerp(P₀,P₁,t)
C=lerp(P₁,P₂,t)
B(t)=lerp(A,C,t)

Este algoritmo es geométrico, estable y se generaliza a cualquier grado.

46.5 Curva cúbica

La curva más usada posee extremos P₀ y P₃, y controles P₁ y P₂:

B(t)=(1−t)³P₀+3(1−t)²tP₁+3(1−t)t²P₂+t³P₃

Dos controles permiten ajustar de manera independiente la salida y la llegada.

46.6 Propiedades fundamentales

Extremos
B(0)=P₀ y B(1)=Pn
Envolvente convexa
la curva queda dentro de sus controles
Transformación afín
transformar controles transforma la curva
Inversión
invertir controles recorre la misma curva al revés

46.7 Tangente y derivada

La derivada de una cúbica es:

B'(t)=3(1−t)²(P₁−P₀)+6(1−t)t(P₂−P₁)+3t²(P₃−P₂)

En los extremos: B'(0)=3(P₁−P₀) y B'(1)=3(P₃−P₂). Normalizar la derivada produce la dirección de movimiento.

46.8 Orientar un objeto sobre la curva

Con la derivada D=(dx,dy), el ángulo visual es:

θ=atan2(dy,dx)

En pantalla, donde y crece hacia abajo, la fórmula coincide con las coordenadas visuales si la curva también fue definida en ese sistema.

46.9 Subdivisión

De Casteljau permite dividir una curva en t sin alterar su forma. En una cuadrática, los controles de las dos mitades son:

izquierda: [P₀,A,B]
derecha: [B,C,P₂]

La subdivisión se usa para recorte, aproximación, edición y renderizado adaptativo.

46.10 Longitud aproximada

La longitud de una Bézier general no posee una fórmula elemental sencilla. Se aproxima tomando muestras:

L≈Σ |B(tᵢ)−B(tᵢ₋₁)|

Más muestras mejoran la precisión. La subdivisión adaptativa concentra trabajo donde la curvatura es mayor.

46.11 Parámetro y velocidad

Incrementar t uniformemente no garantiza velocidad espacial constante. En zonas muy curvas o con controles desiguales, distancias iguales de t pueden recorrer longitudes diferentes.

Para velocidad uniforme se construye una tabla que relaciona t con longitud acumulada y luego se busca el t correspondiente a cada distancia.

46.12 Unir varias curvas

Para continuidad visual entre dos cúbicas:

  • C⁰: comparten el punto extremo.
  • C¹: además, sus tangentes coinciden en dirección y magnitud.
  • G¹: las tangentes son paralelas, aunque puedan tener distinta magnitud.

Alinear el control anterior, el punto de unión y el control siguiente evita una esquina visible.

46.13 Laboratorio interactivo de De Casteljau

Modifica los controles y el parámetro t. Se muestran el polígono de control, las interpolaciones intermedias, la curva y su tangente.

B(t) = (0,0)Tangente = (0,0)Longitud ≈ 0

46.14 Bézier cuadrática en JavaScript

function bezierCuadratica(p0,p1,p2,t) {
  const u=1-t;
  return {
    x:u*u*p0.x+2*u*t*p1.x+t*t*p2.x,
    y:u*u*p0.y+2*u*t*p1.y+t*t*p2.y
  };
}

const punto=bezierCuadratica(
  {x:0,y:0},{x:5,y:8},{x:10,y:0},0.5
);
console.log(punto); // {x:5,y:4}

La función calcula directamente los pesos de Bernstein para el valor de t.

46.15 Bézier cúbica y tangente

function bezierCubica(p0,p1,p2,p3,t) {
  const u=1-t;
  return {
    x:u**3*p0.x+3*u*u*t*p1.x+3*u*t*t*p2.x+t**3*p3.x,
    y:u**3*p0.y+3*u*u*t*p1.y+3*u*t*t*p2.y+t**3*p3.y
  };
}

function tangenteCubica(p0,p1,p2,p3,t) {
  const u=1-t;
  return {
    x:3*u*u*(p1.x-p0.x)+6*u*t*(p2.x-p1.x)+3*t*t*(p3.x-p2.x),
    y:3*u*u*(p1.y-p0.y)+6*u*t*(p2.y-p1.y)+3*t*t*(p3.y-p2.y)
  };
}

const puntos=[{x:0,y:0},{x:3,y:7},{x:8,y:-2},{x:12,y:4}];
console.log(bezierCubica(...puntos,0.4));
console.log(tangenteCubica(...puntos,0.4));

La tangente puede normalizarse para orientar un sprite o calcular una normal perpendicular.

46.16 Longitud aproximada en JavaScript

function bezierCubica(p0,p1,p2,p3,t) {
  const u=1-t;
  return {
    x:u**3*p0.x+3*u*u*t*p1.x+3*u*t*t*p2.x+t**3*p3.x,
    y:u**3*p0.y+3*u*u*t*p1.y+3*u*t*t*p2.y+t**3*p3.y
  };
}

function longitudAproximada(evaluar,pasos=100) {
  let total=0,anterior=evaluar(0);
  for(let i=1;i<=pasos;i++) {
    const actual=evaluar(i/pasos);
    total+=Math.hypot(actual.x-anterior.x,actual.y-anterior.y);
    anterior=actual;
  }
  return total;
}

const evaluar=t=>bezierCubica(
  {x:0,y:0},{x:3,y:7},{x:8,y:-2},{x:12,y:4},t
);
console.log("Longitud:",longitudAproximada(evaluar).toFixed(2));

El bloque es autocontenido. Aumentar los pasos reduce el error a cambio de más evaluaciones.

46.17 Aplicación animada: ruta de mensajería orbital

Una nave recorre una red formada por dos curvas cúbicas unidas con tangentes alineadas. La orientación sigue la derivada y una estela revela la continuidad.

Tramo: 1 · t = 0Orientación:

46.18 Aplicaciones, errores y conclusión

Las curvas de Bézier aparecen en tipografías, iconos, editores vectoriales, carreteras, cámaras, trayectorias, interfaces, gráficos, pinceles y animación de propiedades.

  • Suponer que la curva pasa por todos los controles.
  • Confundir una cuadrática con una cúbica.
  • Orientar un objeto con la posición en lugar de la derivada.
  • Suponer que incrementos iguales de t recorren distancias iguales.
  • Usar muy pocas muestras para aproximar longitud o dibujar.
  • No alinear controles al unir curvas que deben verse suaves.
  • Evaluar fuera de [0,1] sin intención de extrapolar.
  • Normalizar una tangente de longitud casi cero.

Recuerda: los extremos pertenecen a la curva, los controles moldean sus tangentes, De Casteljau construye y subdivide, y la derivada proporciona orientación y velocidad paramétrica.

En el próximo tema integraremos estas herramientas en aplicaciones de animación, interfaces y videojuegos 2D.