summaryrefslogtreecommitdiff
path: root/physics/src/force/spring.rs
blob: 6c2cf67f2bbb65b5ff12451bb8dd7b7697d7fba0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
use crate::algebra::Scalar;

use super::Force;

pub struct Spring {
    pub particle_ids: [usize; 2],
    pub rest_length: Scalar,
    pub spring_constant: Scalar,
    pub damping_constant: Scalar,
}

impl Force for Spring {
    fn apply(&self, particles: &mut Vec<crate::particle_system::Particle>) {
        let a = &particles[self.particle_ids[0]];
        let b = &particles[self.particle_ids[1]];
        let i = a.position - b.position;
        let i_dot = a.velocity - b.velocity;
        let i_norm = i.norm();

        let force = -(self.spring_constant * (i_norm - self.rest_length)
        + (self.damping_constant * i.dot(&i_dot) / i_norm))
        * i
        / i_norm;

        particles[self.particle_ids[0]].apply_force(force);
        particles[self.particle_ids[1]].apply_force(-force);
    }
}