From 7a290c99985190b907a88118bd4950f9e3d8fbd2 Mon Sep 17 00:00:00 2001 From: Raptorox <70806316+Raptorox@users.noreply.github.com> Date: Thu, 15 May 2025 10:13:50 +0200 Subject: [PATCH] gh push for access --- Cargo.lock | 108 ++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 7 ++++ src/link.rs | 29 +++++++++++++ src/main.rs | 108 ++++++++++++++++++++++++++++++++++++++++++++++++ src/particle.rs | 30 ++++++++++++++ 5 files changed, 282 insertions(+) create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 src/link.rs create mode 100644 src/main.rs create mode 100644 src/particle.rs diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..9a6ed36 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,108 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "cc" +version = "1.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04da6a0d40b948dfc4fa8f5bbf402b0fc1a64a28dbf7d12ffd683550f2c1b63a" +dependencies = [ + "shlex", +] + +[[package]] +name = "cmake" +version = "0.1.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +dependencies = [ + "cc", +] + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "libflac-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01b01d08e4f670c184ffe3c3e5efbf0bd6e88c8cca796c278c86bbf49583545c" +dependencies = [ + "cmake", + "libc", +] + +[[package]] +name = "link-cplusplus" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a6f6da007f968f9def0d65a05b187e2960183de70c160204ecfccf0ee330212" +dependencies = [ + "cc", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "sfml" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "941169c8be33fd81c006591c0dff6056f94bca0bff6057a262ba946bdb6dc0ed" +dependencies = [ + "bitflags", + "cc", + "cmake", + "libflac-sys", + "link-cplusplus", + "num-traits", + "pkg-config", + "widestring", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "verlet" +version = "0.1.0" +dependencies = [ + "sfml", +] + +[[package]] +name = "widestring" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..8a5e99c --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "verlet" +version = "0.1.0" +edition = "2024" + +[dependencies] +sfml = "0.24.0" diff --git a/src/link.rs b/src/link.rs new file mode 100644 index 0000000..342e6ee --- /dev/null +++ b/src/link.rs @@ -0,0 +1,29 @@ +use crate::particle::Particle; +use std::rc::Rc; +use std::cell::RefCell; + +pub struct Link { + p1: Rc>, + p2: Rc>, + length: f32 +} + +impl Link { + pub fn new(p1: Rc>, p2: Rc>, length: f32) -> Self { + Link { + p1: p1, + p2: p2, + length: length + } + } + + pub fn solve(&mut self) { + let vec = self.p2.borrow().pos - self.p1.borrow().pos; + let vec_len = (vec.x*vec.x + vec.y*vec.y).sqrt(); + let vec_norm = vec/vec_len; + let vec_scaled = vec_norm * (self.length-vec_len) * 9.; + + self.p1.borrow_mut().apply_force(-vec_scaled); + self.p2.borrow_mut().apply_force(vec_scaled); + } +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..2864e67 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,108 @@ +use sfml::graphics::*; +use sfml::window::*; +use sfml::SfResult; +use sfml::system::{Vector2f, Clock}; +use std::rc::Rc; +use std::cell::RefCell; + +mod particle; +use particle::Particle; + +mod link; +use link::Link; + +//const GRAVITY: f32 = 100.; + +fn populate_particles(particles: Vec) { + +} + +fn populate_links(links: Vec) { + +} + +fn apply_forces(particles: Vec) { + +} + +fn update_particles(particles: Vec) { + +} + +fn solve_links(links: Vec) { + +} + +fn update_positions(circles: Vec) { + +} + +fn main() -> SfResult<()> { + let mut window = RenderWindow::new( + (800, 600), + "Verlet", + Style::CLOSE, + &Default::default() + )?; + window.set_framerate_limit(60); + + let mut clock = Clock::start()?; + + let mut particles: Vec = vec![]; + populate_particles(particles); + let particle1 = Rc::new(RefCell::new(Particle::new(Vector2f::new(200., 300.)))); + let particle2 = Rc::new(RefCell::new(Particle::new(Vector2f::new(300., 300.)))); + let particle3 = Rc::new(RefCell::new(Particle::new(Vector2f::new(400., 300.)))); + + let mut link1 = Link::new(Rc::clone(&particle1), Rc::clone(&particle2), 100.); + let mut link2 = Link::new(Rc::clone(&particle2), Rc::clone(&particle3), 100.); + let mut link3 = Link::new(Rc::clone(&particle1), Rc::clone(&particle3), 200.); + + let radius = 32.; + let mut circle1 = CircleShape::new(radius, 100); + let mut circle2 = CircleShape::new(radius, 100); + let mut circle3 = CircleShape::new(radius, 100); + circle1.set_origin((radius, radius)); + circle2.set_origin((radius, radius)); + circle3.set_origin((radius, radius)); + + while window.is_open() { + while let Some(event) = window.poll_event() { + match event { + Event::Closed => window.close(), + _ => {} + } + } + + if mouse::Button::is_pressed(mouse::Button::Left) { + let mouse_pos = window.mouse_position(); + let mouse_coords = window.map_pixel_to_coords_current_view(mouse_pos); + let p_pos = particle1.borrow().pos; + particle2.borrow_mut().apply_force(mouse_coords - p_pos); + } + + let dt = clock.restart().as_seconds(); + + //particle.apply_force(Vector2f::new(0., GRAVITY)); + + particle1.borrow_mut().update(dt); + particle2.borrow_mut().update(dt); + particle3.borrow_mut().update(dt); + + link1.solve(); + link2.solve(); + link3.solve(); + + circle1.set_position(particle1.borrow().pos); + circle2.set_position(particle2.borrow().pos); + circle3.set_position(particle3.borrow().pos); + + window.clear(Color::BLACK); + window.draw(&circle1); + window.draw(&circle2); + window.draw(&circle3); + window.display(); + } + + Ok(()) +} \ No newline at end of file diff --git a/src/particle.rs b/src/particle.rs new file mode 100644 index 0000000..0998294 --- /dev/null +++ b/src/particle.rs @@ -0,0 +1,30 @@ +use sfml::system::Vector2f; + +pub struct Particle { + pub pos: Vector2f, + prev_pos: Vector2f, + accel: Vector2f +} + +impl Particle { + pub fn new(pos: Vector2f) -> Self { + Particle { + pos: pos, + prev_pos: pos, + accel: Vector2f::default() + } + } + + pub fn apply_force(&mut self, force: Vector2f) { + self.accel += force; + } + + pub fn update(&mut self, dt: f32) { + let vel = (self.pos - self.prev_pos) * 0.99; + let new_pos = self.pos + vel + self.accel * (dt * dt); + + self.prev_pos = self.pos; + self.pos = new_pos; + self.accel = Vector2f::default(); + } +} \ No newline at end of file