v/examples/pendulum-simulation/modules/sim/sim.v

48 lines
1.1 KiB
V

module sim
pub struct SimState {
mut:
position Vector3D
velocity Vector3D
accel Vector3D
}
pub fn new_state(state SimState) SimState {
return SimState{
...state
}
}
pub fn (mut state SimState) satisfy_rope_constraint(params SimParams) {
mut rope_vector := params.get_rope_vector(state)
rope_vector = rope_vector.scale(params.rope_length / rope_vector.norm())
state.position = vector(z: params.rope_length) + rope_vector
}
pub fn (mut state SimState) increment(delta_t f64, params SimParams) {
// 1. add up all forces
// 2. get an accelleration
// 3. add to velocity
// 4. ensure rope constraint is satisfied
// sum up all forces
forces_sum := params.get_forces_sum(state)
// get the acceleration
accel := forces_sum.scale(1.0 / params.bearing_mass)
state.accel = accel
// update the velocity
state.velocity = state.velocity + accel.scale(delta_t)
// update the position
state.position = state.position + state.velocity.scale(delta_t)
// ensure the position satisfies rope constraint
state.satisfy_rope_constraint(params)
}
pub fn (state SimState) done() bool {
return state.velocity.norm() < 0.05 && state.accel.norm() < 0.01
}