38. Proyecto integrador: laboratorio de movimiento circular, rotación y rodadura

El proyecto final reúne modelos físicos, integración temporal, representación gráfica y verificaciones automáticas en una única aplicación interactiva.

38.1 Objetivo del proyecto

Construiremos un laboratorio capaz de ejecutar tres experiencias relacionadas: una partícula en movimiento circular uniforme, un cuerpo rígido acelerado por un torque y una rueda en rodadura sin deslizamiento. El objetivo no es solamente animar figuras, sino conservar el significado y las unidades de cada variable.

Movimiento circular

Relaciona radio, ángulo, velocidad tangencial y aceleración centrípeta.

Rotación con torque

Integra α = τ/I y verifica el cambio del momento angular.

Rodadura

Combina traslación y giro imponiendo vCM + ωR = 0.

38.2 Requisitos funcionales

  • seleccionar uno de los tres modelos sin recargar la página;
  • modificar los parámetros físicos relevantes;
  • iniciar, pausar, reiniciar y avanzar un único paso;
  • usar un paso físico fijo independiente del ritmo de dibujo;
  • mostrar magnitudes derivadas con unidades;
  • dibujar vectores y estados de manera coherente;
  • comprobar automáticamente una ecuación característica de cada modo;
  • mantener accesibles los controles y los resultados textuales.

38.3 Una arquitectura común

La aplicación se organiza en cuatro responsabilidades:

entradas → estado → actualización física → renderizado y verificación

El selector cambia el modelo activo. El motor temporal llama a una función de actualización común, que delega en el modo elegido. El dibujo y los resultados se regeneran a partir del estado, sin convertirse en una segunda fuente de verdad.

38.4 Estado compartido

Todos los modos necesitan tiempo, ángulo acumulado, velocidad angular y una indicación de ejecución:

const estado = {
  modo: "circular",
  ejecutando: false,
  tiempo: 0,
  angulo: 0,
  omega: 2,
  posicionX: 0,
  parametros: {}
};
console.log(estado);

Cada modo añade parámetros específicos, pero el bucle no necesita conocer todos los detalles.

38.5 Convenciones y unidades

El laboratorio usa segundos, metros, kilogramos, radianes y newtons. En el plano, +x apunta a la derecha, +y hacia arriba y los ángulos positivos son antihorarios. La conversión al eje y descendente de SVG ocurre únicamente al dibujar.

Contrato del modelo: toda función física recibe y devuelve unidades SI. Los píxeles y los grados pertenecen exclusivamente a la interfaz.

38.6 Motor temporal

El dibujo usa requestAnimationFrame, mientras un acumulador avanza la física con un paso constante h:

let acumulado = 0;
const paso = 1 / 120;
const dtReal = 0.025;
let tiempoSimulado = 0;
let cuadrosRenderizados = 0;

function actualizarFisica(dt) {
  tiempoSimulado += dt;
}

function renderizar() {
  cuadrosRenderizados++;
}

acumulado += Math.min(dtReal, 0.1);
while (acumulado >= paso) {
  actualizarFisica(paso);
  acumulado -= paso;
}
renderizar();
console.log({ tiempoSimulado, acumulado, cuadrosRenderizados });

Limitar el tiempo real evita una ráfaga de pasos después de una pausa larga. El botón “Un paso” llama directamente a actualizarFisica(paso).

38.7 Modelo de movimiento circular

La partícula describe una circunferencia de radio R con ω constante:

θ ← θ + ωΔt
x = Rcosθ     y = Rsenθ

Las magnitudes principales son:

v = R|ω|     ac = Rω²     L = mR²ω

38.8 Vectores del modo circular

La velocidad es tangente y la aceleración centrípeta apunta al centro:

v = (−Rωsenθ, Rωcosθ)
ac = (−Rω²cosθ, −Rω²senθ)

La verificación utiliza |r·v| ≈ 0: radio y velocidad deben ser perpendiculares.

38.9 Modelo de rotación con torque

Un cuerpo rígido de momento de inercia I recibe un torque neto constante:

α = τ/I

El laboratorio usa Euler semimplícito:

ω ← ω + αΔt     θ ← θ + ωΔt

Las magnitudes mostradas son L = Iω, K = ½Iω² y P = τω.

38.10 Verificación del impulso angular

Desde el reinicio, el torque constante debe satisfacer:

L(t) − L₀ = τt

El residuo numérico se define como:

εL = [L(t) − L₀] − τt

La actualización de ω es exacta para α constante salvo redondeo, por lo que este residuo debe permanecer muy próximo a cero.

38.11 Modelo de rodadura

La rueda avanza con velocidad constante vCM. Con +x hacia la derecha y ω positiva antihoraria:

ω = −vCM/R
xCM ← xCM + vCMΔt     θ ← θ + ωΔt

La posición horizontal se envuelve visualmente al abandonar el escenario, pero la distancia acumulada permanece en metros.

38.12 Verificación del contacto

La velocidad tangencial del punto inferior respecto del suelo es:

vcontacto,x = vCM + ωR

En rodadura sin deslizamiento debe ser cero dentro de una tolerancia. También se comprueba que la distancia recorrida y el ángulo cumplan:

ΔxCM = −RΔθ

38.13 Magnitudes derivadas, no duplicadas

Rapidez, aceleración, energía y momento angular se calculan al mostrar cada cuadro. No se almacenan como estado independiente, porque podrían quedar desincronizados con R, ω, m o I.

function datosCirculares(estado, parametros) {
  const { radio, masa } = parametros;
  return {
    rapidez: radio * Math.abs(estado.omega),
    aceleracion: radio * estado.omega ** 2,
    momentoAngular: masa * radio ** 2 * estado.omega
  };
}

const estado = { omega: 2 };
const parametros = { radio: 1.5, masa: 3 };
console.log(datosCirculares(estado, parametros));

38.14 Cambiar de modo y reiniciar

Cambiar de modelo invalida parte del estado anterior. La aplicación pausa, reconstruye el estado inicial del nuevo modo y actualiza los controles visibles. Esto evita heredar, por ejemplo, una velocidad angular producida por torque dentro del modo de rodadura.

cambio de modo → pausar → crear estado inicial → renderizar

38.15 Normalización visual

El ángulo acumulado se conserva para medir vueltas, impulso y distancia. Al dibujar se utiliza:

const estado = { angulo: -Math.PI / 2 };
const vuelta = 2 * Math.PI;
const anguloVisual = ((estado.angulo % vuelta) + vuelta) % vuelta;
console.log({ anguloAcumulado: estado.angulo, anguloVisual });

De este modo la física conserva el historial y la representación opera con un valor compacto.

38.16 Escalas para vectores

Los vectores físicos pueden tener módulos muy diferentes. Una escala visual fija podría hacerlos invisibles o sacarlos del escenario. El laboratorio limita la longitud dibujada, pero conserva el valor real en los resultados textuales.

longitudpx = min(escala·|vector|, longitudmáxima)

Una flecha limitada comunica dirección y sentido; la etiqueta comunica el módulo exacto.

38.17 Controles y ciclo de vida

“Iniciar” activa la evolución, “Pausar” conserva el estado, “Reiniciar” vuelve a las condiciones seleccionadas y “Un paso” permite inspeccionar una actualización. Al modificar un parámetro, el laboratorio se reinicia para que las verificaciones mantengan una referencia clara.

Los botones usan elementos HTML nativos y los resultados se encuentran dentro de una región con aria-live="polite".

38.18 Estados límite

ω = 0

La partícula circular o el cuerpo rotatorio quedan quietos; las fórmulas deben seguir entregando valores finitos.

τ = 0

En rotación, ω y L se conservan; el residuo del impulso continúa en cero.

v = 0

En rodadura, ω = 0 y la rueda permanece en reposo sin violar la condición de contacto.

Probar valores nulos y signos negativos revela divisiones incorrectas y supuestos ocultos.

38.19 Estrategia de pruebas

ModoCaso de referenciaComprobación
CircularR = 2 m, ω = 3 rad/sv = 6 m/s, ac = 18 m/s²
CircularCualquier θr·v ≈ 0
RotaciónI = 4 kg·m², τ = 8 N·mα = 2 rad/s²
Rotaciónτ constanteL − L₀ − τt ≈ 0
RodaduraR = 0,5 m, v = 4 m/sω = −8 rad/s
RodaduraCualquier instantev + ωR ≈ 0

38.20 Mejoras posibles

Una vez verificada la versión básica pueden incorporarse:

  • torques dependientes del tiempo o del ángulo;
  • fricción y transición entre deslizamiento y rodadura;
  • gráficos de θ, ω, energía y momento angular;
  • exportación de muestras a CSV;
  • varios cuerpos y colisiones;
  • métodos de integración de orden superior;
  • pruebas automatizadas separadas de la interfaz.
Cada ampliación debe agregar primero una ecuación, una condición de validez y una prueba. La complejidad visual no reemplaza la verificación física.

38.21 Actividad interactiva: laboratorio integrador

Seleccioná un modo, ajustá sus parámetros y controlá la simulación. La tarjeta violeta informa la verificación característica. Los cambios de parámetros reinician el tiempo para mantener una referencia reproducible.

Laboratorio final de movimiento circular y rotaciones

Motor temporal de paso fijo, estado en unidades SI y verificaciones en cada cuadro.

1,5 m
2,0 kg
+2,0 rad/s
0,020 s
Laboratorio en modo movimiento circularUna partícula recorre una circunferencia con velocidad tangencial y aceleración centrípeta. Movimiento circular uniforme va꜀ Estado del modelot = 0,00 sθ = 0,00 radω = +2,00 rad/sR = 1,50 mv = 3,00 m/sa꜀ = 6,00 m/s²L = 9,00 kg·m²/sK = 9,00 J Verificación: r · v = 0,000000Pausado
estado y geometríavelocidadaceleración o torqueverificación
Tiempo0,00 s
Ángulo acumulado0,00 rad
Velocidad angular+2,00 rad/s
Magnitud principal 13,00 m/s
Magnitud principal 26,00 m/s²
Residuo de verificación0,000000

El radio y la velocidad son perpendiculares. La aceleración centrípeta apunta hacia el centro y no cambia la rapidez.

38.22 Implementación del núcleo

function actualizarFisica(estado, parametros, dt) {
  switch (estado.modo) {
    case "circular":
      estado.angulo += estado.omega * dt;
      break;

    case "rotation": {
      const alfa = parametros.torque / parametros.inercia;
      estado.omega += alfa * dt;
      estado.angulo += estado.omega * dt;
      break;
    }

    case "rolling":
      estado.omega = -parametros.velocidad / parametros.radio;
      estado.posicionX += parametros.velocidad * dt;
      estado.angulo += estado.omega * dt;
      break;
  }
  estado.tiempo += dt;
}

function verificar(estado, parametros) {
  if (estado.modo === "circular") {
    const r = {
      x: parametros.radio * Math.cos(estado.angulo),
      y: parametros.radio * Math.sin(estado.angulo)
    };
    const v = { x: -estado.omega * r.y, y: estado.omega * r.x };
    return r.x * v.x + r.y * v.y;
  }
  if (estado.modo === "rotation") {
    const L = parametros.inercia * estado.omega;
    return (L - estado.momentoAngularInicial)
      - parametros.torque * estado.tiempo;
  }
  return parametros.velocidad + estado.omega * parametros.radio;
}

const casos = [
  {
    estado: { modo: "circular", tiempo: 0, angulo: 0, omega: 2 },
    parametros: { radio: 1.5 }
  },
  {
    estado: {
      modo: "rotation",
      tiempo: 0,
      angulo: 0,
      omega: 1,
      momentoAngularInicial: 2
    },
    parametros: { torque: 3, inercia: 2 }
  },
  {
    estado: { modo: "rolling", tiempo: 0, angulo: 0, omega: 0, posicionX: 0 },
    parametros: { velocidad: 3, radio: 0.5 }
  }
];

const resultados = casos.map(({ estado, parametros }) => {
  actualizarFisica(estado, parametros, 0.1);
  return { modo: estado.modo, estado, residuo: verificar(estado, parametros) };
});
console.log(resultados);

La función de verificación devuelve un residuo que idealmente vale cero. Mantenerla separada permite ejecutarla en pruebas sin dibujar la interfaz.

38.23 Desafíos y criterios de evaluación

Desafíos propuestos

  1. Agregá un control de velocidad temporal sin cambiar el paso físico.
  2. Dibujá la trayectoria reciente de la partícula circular.
  3. Incorporá torque variable por tramos en el modo rotación.
  4. Mostrá un gráfico de L y comprobá que su pendiente sea τ.
  5. Permití rodadura con v y ω independientes y detectá deslizamiento.
  6. Agregá fricción cinética hasta alcanzar rodadura pura.
  7. Exportá tiempo, θ y ω como CSV.
  8. Escribí pruebas para parámetros nulos y negativos.
  9. Compará Euler explícito, semimplícito y solución exacta.
  10. Guardá y restaurá una configuración mediante JSON.
Ver orientaciones para resolverlos
  1. Multiplicá el tiempo acumulado por un factor, pero conservá subpasos de igual tamaño.
  2. Guardá una cola limitada de posiciones y renderizala como polyline.
  3. Definí etapas con torque y duración; seleccioná la etapa usando el tiempo.
  4. Registrá pares (t, L) y calculá (Lf − Li)/(tf − ti).
  5. Calculá vcontacto = v + ωR y clasificá usando una tolerancia.
  6. Aplicá F = ±μkN y τ = fR con signos opuestos al deslizamiento.
  7. Acumulá filas numéricas y creá un Blob de tipo text/csv.
  8. Verificá que no aparezcan NaN y que las excepciones sean intencionales.
  9. Ejecutá los tres métodos con idénticas condiciones y compará errores finales.
  10. Serializá solo parámetros y estado físico; no guardes referencias del DOM.

Criterios de evaluación

  • coherencia de unidades y signos;
  • separación entre modelo, integración y vista;
  • independencia entre física y frecuencia de cuadros;
  • manejo de estados límite;
  • verificaciones numéricas reproducibles;
  • claridad de controles, resultados y código.

38.24 Cierre del curso

A lo largo del curso pasamos de describir ángulos y velocidades a modelar fuerzas, torques, energía, momento angular y rodadura. El proyecto integrador muestra que programar física no consiste en copiar fórmulas aisladas: requiere declarar supuestos, mantener unidades, elegir un integrador y verificar cada resultado.

  • Las magnitudes angulares complementan, no sustituyen, a las lineales.
  • El radio y la distribución de masa conectan traslación y rotación.
  • Fuerzas y torques explican cómo cambia el estado.
  • Energía y momento angular ofrecen verificaciones independientes.
  • La rodadura une la velocidad del centro con el giro.
  • Un paso temporal explícito hace reproducible la simulación.
  • El estado físico debe mantenerse separado del dibujo.
  • Las tolerancias convierten leyes físicas en pruebas de software.

Con estas herramientas ya podés ampliar el laboratorio, construir nuevos modelos y evaluar críticamente la precisión de una simulación rotacional.