Draw the tube better

This commit is contained in:
numzero 2024-09-23 20:01:43 +03:00
parent df2134a8a5
commit 7b90bbac65
3 changed files with 37 additions and 12 deletions

10
Cargo.lock generated
View File

@ -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",

View File

@ -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"

View File

@ -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<FancyLine> {
let tube = Tube {
inner_radius: 30.0,
@ -113,17 +126,18 @@ trait Renderable {
impl Renderable for Tube {
fn render(&self) -> Vec<Line> {
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()
}
}