diff --git a/Cargo.lock b/Cargo.lock index cdce5ea..deae01a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1721,6 +1721,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itertools-num" version = "0.1.3" @@ -3101,6 +3110,7 @@ dependencies = [ "flo_draw", "glam 0.27.0", "glium", + "itertools 0.13.0", "itertools-num", "rand", "rand_pcg", diff --git a/Cargo.toml b/Cargo.toml index 778b9ef..3b60290 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,6 +23,7 @@ flo_canvas = "0.3.1" itertools-num = "0.1.3" glium = "0.35.0" winit = "0.30.5" +itertools = "0.13.0" [dev-dependencies] approx = "0.5.1" diff --git a/src/bin/wireframe/scene.rs b/src/bin/wireframe/scene.rs index b71a685..9c67ed3 100644 --- a/src/bin/wireframe/scene.rs +++ b/src/bin/wireframe/scene.rs @@ -1,4 +1,5 @@ use glam::*; +use itertools::{chain, iproduct}; use refraction::ifaces::{DebugTraceable, Traceable}; use refraction::tube::metric::Tube; @@ -30,6 +31,18 @@ fn draw_rect(center: Vec3, u: Vec3, v: Vec3) -> Line { ]) } +fn draw_ellipse(center: Vec3, u: Vec3, v: Vec3) -> Line { + let segments = 47; + let step = 2. * std::f32::consts::PI / segments as f32; + Line::Loop( + (0..segments) + .map(|k| k as f32 * step) + .map(Vec2::from_angle) + .map(|d| center + d.x * u + d.y * v) + .collect(), + ) +} + pub fn build() -> Vec { let tube = Tube { inner_radius: 30.0, @@ -113,17 +126,18 @@ trait Renderable { impl Renderable for Tube { fn render(&self) -> Vec { - vec![ - draw_rect( - vec3(0., 0., 0.), - vec3(self.outer_radius, 0., 0.), - vec3(0., self.external_halflength, 0.), - ), - draw_rect( - vec3(0., 0., 0.), - vec3(self.inner_radius, 0., 0.), - vec3(0., self.external_halflength, 0.), - ), - ] + let lines = 17; + let step = 2. * std::f32::consts::PI / lines as f32; + let r = 0.5 * (self.outer_radius + self.inner_radius); + let w = 0.5 * (self.outer_radius - self.inner_radius); + let l = vec3(0., self.external_halflength, 0.); + let along = (0..lines) + .map(|k| k as f32 * step) + .map(Vec2::from_angle) + .map(|d| vec3(d.x, 0., d.y)) + .map(|d| draw_rect(r * d, w * d, l)); + let caps = iproduct!([self.inner_radius, self.outer_radius], [-l, l]) + .map(|(r, l)| draw_ellipse(l, vec3(r, 0., 0.), vec3(0., 0., r))); + chain!(along, caps).collect() } }