jsb-gravity/src/quadtree.rs
2023-12-23 18:07:16 +01:00

42 lines
850 B
Rust

use bevy::prelude::*;
pub trait Body {
fn mass(&self) -> f32;
fn center_of_mass(&self) -> (f32, Vec2);
}
pub enum Node<L: Body> {
Node([Node; 4]),
Leaf(Vec<L>),
}
impl<L: Body> Body for Node<L> {
fn mass(&self) -> f32 {
match self {
Node::Node([n1, n2, n3, n4]) => n0.mass() + n1.mass() + n2.mass() + n3.mass(),
Node::Leaf(v) => v.iter().map(Body::mass).sum(),
}
}
fn center_of_mass(&self) {
match self {
Node::Node([n1, n2, n3, n4]) => n0.mass() + n1.mass() + n2.mass() + n3.mass(),
Node::Leaf(v) => {
let mut mass = 0.0;
let mut center_of_mass = Vec2::zero();
for(n in v) {
let (n_mass, n_center) = n.center_of_mass();
mass += n_mass;
center_of_mass += mass * n_center;
}
(mass, center_of_mass / mass)
},
}
}
}
impl<L: Body> Node<L> {
fn add_body(&mut self, body: L) {
}
}