diff --git a/src/bin/flat/main.rs b/src/bin/flat/main.rs index ddab954..ee853a4 100644 --- a/src/bin/flat/main.rs +++ b/src/bin/flat/main.rs @@ -107,6 +107,18 @@ pub fn main() { }); } +fn rel_to_abs(space: &impl Metric, base: &Location, rel: Vec2, steps: usize) -> Vec2 { + let c = 1.0 / (steps as f32); + trace_iter(space, base.pos, base.rot * rel, c * rel.length()).nth(steps - 1).unwrap() +} + +fn draw_cross(gc: &mut Vec, pos: Vec2, r: f32) { + gc.move_to(pos.x - r, pos.y - r); + gc.line_to(pos.x + r, pos.y + r); + gc.move_to(pos.x - r, pos.y + r); + gc.line_to(pos.x + r, pos.y - r); +} + 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) { @@ -135,21 +147,15 @@ fn draw_ray_2(gc: &mut Vec, space: &Space, base: Vec2, dir: Vec2) { gc.move_to(ray.pos.x, ray.pos.y); for hit in ret.objects { let obj = space.objs[hit.id as usize]; - hits.move_to(obj.loc.pos.x, obj.loc.pos.y); - for pt in trace_iter(&space.tube, obj.loc.pos, obj.loc.rot * hit.rel.pos, hit.rel.pos.length() / 100.0).take(100) { - hits.line_to(pt.x, pt.y); - } - hits.circle(hit.pos.x, hit.pos.y, 1.5); + let apx_hit_pos = rel_to_abs(&space.tube, &obj.loc, hit.rel.pos, 128); + // assert_abs_diff_eq!(apx_hit_pos, hit.pos, epsilon=1.0); let Ray { pos: rel, dir } = hit.rel; let diff = rel.dot(dir).powi(2) - dir.length_squared() * (rel.length_squared() - obj.r.powi(2)); assert!(diff >= 0.0); let t = (-rel.dot(dir) + diff.sqrt()) / dir.length_squared(); let rel2 = hit.rel.forward(t).pos; - let pos2 = trace_iter(&space.tube, obj.loc.pos, obj.loc.rot * rel2, rel2.length() / 100.0).nth(100).unwrap(); - hits.move_to(pos2.x - 1.0, pos2.y - 1.0); - hits.line_to(pos2.x + 1.0, pos2.y + 1.0); - hits.move_to(pos2.x - 1.0, pos2.y + 1.0); - hits.line_to(pos2.x + 1.0, pos2.y - 1.0); + let pos2 = rel_to_abs(&space.tube, &obj.loc, rel2, 128); + draw_cross(&mut hits, pos2, 1.0); } let a = ray.pos; if let Some(r) = ret.end {