From b5e58e731a06778138a3b9f5a7f98960e9009b88 Mon Sep 17 00:00:00 2001 From: numzero Date: Sun, 28 Apr 2024 23:01:15 +0300 Subject: [PATCH] More drawing --- src/bin/flat.rs | 43 ++++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/src/bin/flat.rs b/src/bin/flat.rs index d42ded8..23f4965 100644 --- a/src/bin/flat.rs +++ b/src/bin/flat.rs @@ -5,7 +5,7 @@ use num_traits::identities::Zero; pub fn main() { let space = Coil { - coil_scale: 2.0, + coil_scale: 3.0, coil_r: 300.0, coil_w: 50.0, coil_m: 10.0, @@ -24,26 +24,32 @@ pub fn main() { gc.fill_color(Color::Rgba(0.8, 0.8, 0.8, 1.0)); gc.fill(); - gc.line_width(1.0); + gc.line_width(0.5); gc.stroke_color(Color::Rgba(1.0, 0.5, 0.0, 1.0)); for y in itertools_num::linspace(-1.0, 1.0, 101) { - let base = vec2(-500.0, 0.0); - let dir = vec2(1.0, y); - let path = trace_iter(&space, base, dir, 1.0); - gc.new_path(); - gc.move_to(base.x, base.y); - for pt in path.take(10000) { - gc.line_to(pt.x, pt.y); - if any(greaterThan(abs(pt), Vec2::from_s(1000.0))) { - break - } - } - gc.stroke(); + draw_ray(gc, &space, vec2(-500.0, 0.0), vec2(1.0, y)); + } + gc.stroke_color(Color::Rgba(0.0, 0.5, 1.0, 1.0)); + for y in itertools_num::linspace(-1.0, 1.0, 101) { + draw_ray(gc, &space, vec2(0.0, space.coil_r), vec2(1.0, y)); } }); }); } +fn draw_ray(gc: &mut Vec, space: &impl Metric, base: Vec2, dir: Vec2) { + let dir = space.globalize(base, dir); + gc.new_path(); + gc.move_to(base.x, base.y); + for pt in trace_iter(space, base, dir, 1.0).take(10000) { + gc.line_to(pt.x, pt.y); + if any(greaterThan(abs(pt), Vec2::from_s(1000.0))) { + break + } + } + gc.stroke(); +} + struct Coil { coil_m: f32, coil_scale: f32, @@ -88,6 +94,13 @@ trait Metric { part_deriv(|p| self.metric(p), pos, 1.0e-3) } + fn length(&self, at: Vec2, v: Vec2) -> f32 { + sqrt(dot(v, self.metric(at) * v)) + } + + fn normalize(&self, at: Vec2, v: Vec2) -> Vec2 { + v / self.length(at, v) + } fn globalize(&self, at: Vec2, v: Vec2) -> Vec2 { let h = self.halfmetric(at); transpose(&h.ortho) * diagonal( Vec2::from_s(1.0) / h.diag) * h.ortho * v @@ -130,7 +143,7 @@ fn trace_iter(space: &M, base: Vec2, dir: Vec2, dt: f32) -> TraceIter TraceIter{ space: space, p: base, - v: normalize(dir), + v: space.normalize(base, dir), dt: dt, } }