[WIP] Initial commit
commit
fc8f7775ba
|
@ -0,0 +1 @@
|
||||||
|
/target
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,10 @@
|
||||||
|
[package]
|
||||||
|
name = "sketch-gravity"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
nannou = "0.17.1"
|
||||||
|
rayon = "1.5.1"
|
|
@ -0,0 +1,84 @@
|
||||||
|
use nannou::prelude::*;
|
||||||
|
use rayon::prelude::*;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
nannou::app(model).update(update).simple_window(view).run();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
struct Body {
|
||||||
|
pos: DVec2,
|
||||||
|
vel: DVec2,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Model {
|
||||||
|
bodies: Vec<Body>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn model(_app: &App) -> Model {
|
||||||
|
let mut bodies = Vec::new();
|
||||||
|
|
||||||
|
let mut theta = 0.0;
|
||||||
|
for r in 0..512 {
|
||||||
|
let r = r as f64;
|
||||||
|
let r = 10.0 * r.sqrt();
|
||||||
|
|
||||||
|
bodies.push(Body {
|
||||||
|
pos: (r * theta.cos(), r * theta.sin()).into(),
|
||||||
|
vel: (0.0, 0.0).into(),
|
||||||
|
});
|
||||||
|
|
||||||
|
theta += 1.94161103873;
|
||||||
|
}
|
||||||
|
|
||||||
|
Model { bodies }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn update(app: &App, model: &mut Model, _update: Update) {
|
||||||
|
const G: f64 = 6.67408e-11;
|
||||||
|
|
||||||
|
let bodies = model.bodies.clone();
|
||||||
|
let delta_t = app.duration.since_prev_update.as_secs_f64();
|
||||||
|
|
||||||
|
model
|
||||||
|
.bodies
|
||||||
|
.par_iter_mut()
|
||||||
|
.enumerate()
|
||||||
|
.for_each(|(i, body)| {
|
||||||
|
let mut acc: DVec2 = (0.0, 0.0).into();
|
||||||
|
|
||||||
|
bodies.iter().enumerate().for_each(|(j, other_body)| {
|
||||||
|
if i == j {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let delta = other_body.pos - body.pos;
|
||||||
|
let dist_sq = body.pos.distance_squared(other_body.pos);
|
||||||
|
|
||||||
|
if dist_sq < 1.0 {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let force = G * /* × mass_a × mass_b = */ 1e14 / dist_sq;
|
||||||
|
|
||||||
|
acc += delta * force / dist_sq.sqrt();
|
||||||
|
acc -= 0.5 * delta / (dist_sq * 0.5);
|
||||||
|
});
|
||||||
|
|
||||||
|
body.vel += acc * delta_t;
|
||||||
|
body.pos += body.vel * delta_t;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fn view(app: &App, model: &Model, frame: Frame) {
|
||||||
|
// let t = app.duration.since_start.as_secs_f64();
|
||||||
|
|
||||||
|
let draw = app.draw();
|
||||||
|
draw.background().color(BLACK);
|
||||||
|
|
||||||
|
for body in model.bodies.iter() {
|
||||||
|
draw.ellipse().w_h(10.0, 10.0).xy(body.pos.as_f32());
|
||||||
|
}
|
||||||
|
|
||||||
|
draw.to_frame(app, &frame).unwrap();
|
||||||
|
}
|
Loading…
Reference in New Issue