diff --git a/src/main.rs b/src/main.rs index fd2672b..891c1be 100644 --- a/src/main.rs +++ b/src/main.rs @@ -50,7 +50,7 @@ impl App { } } -fn calc_amount(vec: &mut Vec) -> f64 { +fn calc_amount(vec: &Vec) -> f64 { (vec[0].powi(2) + vec[1].powi(2)).sqrt() } @@ -111,8 +111,8 @@ impl Object { fn mouse_attract(&mut self, mouse_pos: [f64; 2]) { let pos: Vec = self.get_pos(); - let mut dist: Vec = vec![pos[0] - mouse_pos[0], pos[1] - mouse_pos[1]]; - let amount = calc_amount(&mut dist); + let dist: Vec = vec![pos[0] - mouse_pos[0], pos[1] - mouse_pos[1]]; + let amount = calc_amount(&dist); for (i, d) in dist.iter().enumerate() { self.vel[i] -= 0.2 * d / amount.max(0.1); self.vel[i] = self.vel[i].min(10.0).max(-10.0); @@ -121,16 +121,22 @@ impl Object { fn attract(&mut self, objs: &mut Vec>) { let this_pos: Vec = self.get_pos(); - let mut distances: Vec> = Vec::new(); - for obj_pos in objs { - let mut dist_vec: Vec = Vec::new(); - for (i, op) in obj_pos.iter().enumerate() { - dist_vec.push(op - this_pos[i]); - } - distances.push(dist_vec); - } - for mut dist in distances { - let amount = calc_amount(&mut dist); + let distances: Vec> = objs + .iter() + .map( + |obj_pos| + { + obj_pos + .iter() + .zip(&this_pos) + .map( + |(obj, this)| + { obj - this } + ).collect() + } + ).collect(); + for dist in distances { + let amount = calc_amount(&dist); for (i, d) in dist.iter().enumerate() { self.vel[i] += 1.0 * (d / amount.max(0.01)); } @@ -144,7 +150,7 @@ impl Object { for i in 0..2 { dist_vec.push(this_pos[i] - pos[i]); } - let amount = calc_amount(&mut dist_vec); + let amount = calc_amount(&dist_vec); for (i, d) in dist_vec.iter().enumerate() { self.vel[i] += 1.5 * d.min(150.0).max(-150.0) / (amount).max(0.01); @@ -170,7 +176,7 @@ impl Object { for (i, d) in new_vel.iter().enumerate() { self.vel[i] = ((self.vel[i] + d) / 2.0).max(-10.0).min(10.0); } - let amount = calc_amount(&mut self.vel); + let amount = calc_amount(&self.vel); for i in 0..2 { self.vel[i] *= 10.0 / amount; } @@ -191,7 +197,7 @@ impl Object { } fn calc_direction(&mut self) -> f64 { - let mut dir = (self.vel[0] / calc_amount(&mut self.vel)).acos(); + let mut dir = (self.vel[0] / calc_amount(&self.vel)).acos(); if self.vel[1].signum() < 0.0 { dir = 2.0 * PI - dir; } @@ -223,7 +229,7 @@ fn main() { let opengl = OpenGL::V3_2; - let num_objs = 12; + let num_objs = 512; let mut window: Window = WindowSettings::new("Test", [200, 200]) .opengl(opengl) @@ -243,16 +249,15 @@ fn main() { .expect("Color failure!"), )) } - - let mut positions: Vec> = Vec::new(); + let mut positions: Vec> = vec![vec![0.0; 2]; objects.len()]; let mut events = Events::new(EventSettings::new()); while let Some(e) = events.next(&mut window) { if let Some(r) = e.render_args() { - for obj in &mut objects { - obj.update_border_dist(&r); - obj.update(); - positions.push(obj.get_pos()); + for i in 0..objects.len() { + objects[i].update_border_dist(&r); + objects[i].update(); + positions[i] = objects[i].get_pos(); } app.render(&objects, &r); } @@ -262,7 +267,7 @@ fn main() { obj.attract(&mut positions); obj.repel(&mut positions); } - positions.clear() + // positions.clear() } if let Some(p) = e.press_args() {