Draw the tube better
This commit is contained in:
parent
df2134a8a5
commit
7b90bbac65
10
Cargo.lock
generated
10
Cargo.lock
generated
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user