Skip to content

physics

The physics module provides types and step functions for common Newtonian mechanics systems: projectiles, spring-mass oscillators, n-body gravitational systems, and AABB collision detection.

from std::physics::types use { Particle, OscillatorState, ProjectileState }
from std::physics::mechanics use { projectile_step, spring_mass_step, n_body_step }
from std::physics::simulation use { simulate_projectile, simulate_oscillator, simulate_n_body }
from std::physics::collision use { aabb, aabb_overlaps, find_collisions_sweep }

State for an n-body gravitational particle:

FieldTypeDescription
position[number, number, number]Position vector [x, y, z]
velocity[number, number, number]Velocity vector [vx, vy, vz]
massnumberParticle mass

State for a 1D spring-mass oscillator:

FieldTypeDescription
xnumberDisplacement from equilibrium
vnumberVelocity

State for a 2D ballistic projectile:

FieldTypeDescription
xnumberHorizontal position
ynumberVertical position
vxnumberHorizontal velocity
vynumberVertical velocity
tnumberElapsed time

These functions advance a system by one time step dt:

  • projectile_step(state, dt, g?) — Advance a projectile (no drag). Default gravity: 9.81 m/s^2.
  • spring_mass_step(state, k, m, dt, damping?) — Advance a spring-mass oscillator.
  • n_body_step(particles, dt, G?) — Advance an n-body gravitational system by one step. Uses pairwise acceleration with softening.

Convenience functions that iterate step functions over time:

  • simulate_projectile(initial_state, t_end, dt, g?) — Run projectile until t_end or y < 0. Returns array of states.
  • simulate_oscillator(initial_state, k, m, t_end, dt, damping?) — Run oscillator for a fixed duration.
  • simulate_n_body(particles, steps, dt, G?) — Run n-body system for a number of steps.
from std::physics::simulation use { simulate_projectile }
let trajectory = simulate_projectile(
{ x: 0.0, y: 0.0, vx: 10.0, vy: 20.0, t: 0.0 },
5.0, // t_end
0.01 // dt
)
for state in trajectory {
print(f"t={state.t:fixed(2)} x={state.x:fixed(2)} y={state.y:fixed(2)}")
}

Collision Detection (std::physics::collision)

Section titled “Collision Detection (std::physics::collision)”

AABB (Axis-Aligned Bounding Box) collision detection primitives:

  • aabb(min_x, min_y, max_x, max_y) — Create from min/max corners.
  • aabb_centered(cx, cy, hw, hh) — Create centered at (cx, cy) with half-extents.
  • aabb_from_pos(x, y, w, h) — Create from position and size.
  • aabb_overlaps(a, b) -> bool — Test if two AABBs overlap.
  • aabb_contains(a, b) -> bool — Test if a fully contains b.
  • aabb_contains_point(box, px, py) -> bool — Test if point is inside AABB.
  • aabb_overlap_area(a, b) -> number — Compute overlap area (0 if none).
  • aabb_union(a, b) — Smallest enclosing AABB.
  • aabb_intersection(a, b) — Intersection AABB or None.
  • aabb_expand(box, margin) — Expand by margin on all sides.
  • aabb_center(box) — Center point { x, y }.
  • aabb_size(box) — Dimensions { width, height }.
  • aabb_separation(a, b) — Minimum separation vector or None.
  • find_collisions_brute(boxes) -> Array<{i, j}> — Brute force O(n^2) pair detection.
  • find_collisions_sweep(boxes) -> Array<{i, j}> — Sort-and-sweep broad-phase (more efficient for sparse scenes).
  • elastic_response(body_a, body_b) — Elastic collision response. Bodies are { aabb, vx, vy, mass }. Returns post-collision velocities.