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);
}
}
|