Incular logoIncular
API ReferencePainting & Animation

Physics Simulations

Springs, friction, gravity, and clamped simulations with completion rules.

All simulations expose position(t), velocity(t), is_done(t).

SimulationMotionDone when
SpringSimulationDamped spring to targetWithin distance + velocity tolerance
FrictionSimulationExponential decayVelocity below tolerance
GravitySimulationConstant accelerationPast the end in fall direction
ClampedSimulationInner sim with hard boundsInner done

Spring

use incular::prelude::*;

fn main() {
    let spring =
        SpringDescription::with_damping_ratio(1.0, 100.0, 0.7);
    println!("spring: {:?}", spring.spring_type());
    let sim = SpringSimulation::new(spring, 0.0, 100.0, 0.0, Tolerance::DEFAULT);
    let at = std::time::Duration::from_millis(100);
    println!("pos: {}, done: {}", sim.position(at), sim.is_done(at));
    let fall = GravitySimulation::new(980.0, 0.0, 500.0, 0.0);
    println!("fall done: {}", fall.is_done(at));
}

SpringSimulation::new(spring, 0.0, 100.0, 0.0, Tolerance::DEFAULT) ScrollSpringSimulation::new(..) // scroll-tuned variant ClampedSimulation::new(inner, min, max) BoundedFrictionSimulation::new(..)

Invalid mass/stiffness/damping fall back to 1 / 100 / 10. Done when |pos - end| <= distance and |vel| <= velocity tolerance. SpringType: CriticallyDamped / UnderDamped / OverDamped.

Friction and gravity

Exponential decay (FrictionSimulation::new(drag, start, velocity, tolerance); invalid drag falls back to 0.135) and constant acceleration (GravitySimulation::new(acceleration, start, end, velocity)) — the gravity case runs in the program above.

Tolerance

Tolerance::DEFAULT (distance 0.001, time 1ms, velocity 0.001) or Tolerance::new(distance, time, velocity).

Related: AnimationController, ScrollController.

On this page