From 4b12fcf045024abb8e16478fdbe47be1732bcb93 Mon Sep 17 00:00:00 2001 From: numzero Date: Sat, 14 Sep 2024 13:35:39 +0300 Subject: [PATCH] Extract boundary tracing into a function --- src/bin/flat/main.rs | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/bin/flat/main.rs b/src/bin/flat/main.rs index d56aed3..ddab954 100644 --- a/src/bin/flat/main.rs +++ b/src/bin/flat/main.rs @@ -9,6 +9,7 @@ use tube::metric::Tube; use tube::Space; use tube::Subspace::{Boundary, Inner, Outer}; use types::{Location, Object, Ray}; +use crate::types::FlatTraceResult; mod riemann; mod fns; @@ -107,23 +108,26 @@ pub fn main() { } fn draw_ray_2(gc: &mut Vec, space: &Space, base: Vec2, dir: Vec2) { + fn trace_to_flat(gc: &mut Vec, space: &Space, ray: Ray) -> (Ray, FlatTraceResult) { + for ray in space.trace_iter(ray).skip(1) { + gc.line_to(ray.pos.x, ray.pos.y); + match space.which_subspace(ray.pos) { + Inner => return (ray, space.trace_inner(ray)), + Outer => return (ray, space.trace_outer(ray)), + Boundary => continue, + }; + }; + unreachable!("Space::trace_iter terminated!") + } + let mut hits = Vec::::new(); let dir = space.tube.globalize(base, dir); gc.new_path(); gc.move_to(base.x, base.y); let mut ray = Ray { pos: base, dir: space.tube.normalize_vec_at(base, dir) * DT }; - for _ in 0..10000 { - ray = space.trace_step(ray); - gc.line_to(ray.pos.x, ray.pos.y); - if ray.pos.abs().cmpgt(Vec2::splat(1000.0)).any() { - break; - } - let sub = space.which_subspace(ray.pos); - let ret = match sub { - Inner => space.trace_inner(ray), - Outer => space.trace_outer(ray), - Boundary => continue, - }; + for _ in 0..100 { + let ret; + (ray, ret) = trace_to_flat(gc, space, ray); gc.stroke(); gc.new_dash_pattern(); // gc.dash_length(6.0);