Extract boundary tracing into a function

This commit is contained in:
numzero 2024-09-14 13:35:39 +03:00
parent 241f070769
commit 4b12fcf045

View File

@ -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<Draw>, space: &Space, base: Vec2, dir: Vec2) {
fn trace_to_flat(gc: &mut Vec<Draw>, 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::<Draw>::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);