From 70afc5a7d871919776a64782e8b93404e6b0defd Mon Sep 17 00:00:00 2001 From: eug-vs Date: Sun, 15 Dec 2024 13:17:43 +0100 Subject: feat!: add raylib rendering --- physics/src/particle_system.rs | 53 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 physics/src/particle_system.rs (limited to 'physics/src/particle_system.rs') diff --git a/physics/src/particle_system.rs b/physics/src/particle_system.rs new file mode 100644 index 0000000..30255ec --- /dev/null +++ b/physics/src/particle_system.rs @@ -0,0 +1,53 @@ +use crate::{ + algebra::{Point, Scalar, Vector}, + constraint::Constraint, + force::Force, +}; + +#[derive(Debug)] +pub struct Particle { + pub mass: Scalar, + pub position: Point, + pub velocity: Vector, + + /// Force accumulator + pub force: Vector, +} + +impl Particle { + pub fn new(position: Point, mass: Scalar) -> Self { + Self { + mass, + position, + velocity: Vector::zeros(), + force: Vector::zeros(), + } + } + + pub fn apply_force(&mut self, force: Vector) { + self.force += force; + } + pub fn reset_force(&mut self) { + self.force = Vector::zeros() + } +} + +// #[derive(Debug)] +pub struct ParticleSystem { + pub particles: Vec, + pub constraints: Vec>, + pub forces: Vec>, + + /// Simulation clock + pub t: Scalar, +} + +impl ParticleSystem { + pub fn get_kinetic_energy(&self) -> Scalar { + self.particles.iter().fold(0.0, |acc, p| { + let velocity = p.velocity.norm(); + let energy = p.mass * velocity * velocity / 2.0; + acc + energy + }) + } +} -- cgit v1.2.3