diff --git a/src/bin/flat.rs b/src/bin/flat.rs index f80add0..a13b80f 100644 --- a/src/bin/flat.rs +++ b/src/bin/flat.rs @@ -25,7 +25,8 @@ pub fn main() { let canvas = create_drawing_window("Refraction"); canvas.draw(|gc| { gc.canvas_height(1000.0); - space.render(gc); + space.draw_background(gc); + space.draw_rays(gc, &space); let space = Rc::new(space); let parts: Vec> = vec![ @@ -33,14 +34,16 @@ pub fn main() { Box::new(Wall { space: space.clone() }), Box::new(Inside { space: space.clone() }), ]; - - parts.draw_fan(gc, vec2(-500.0, 0.0), vec2(1.0, 0.0), 1.0); - // parts.draw_fan(gc, vec2(-20.0, -500.0), vec2(0.1, 0.9), 1.0); - //parts.draw_ray(gc, vec2(-20.0, -500.0), vec2(0.1, 0.9)); + space.draw_rays(gc, parts.as_slice()); }); }); } +trait Interesting { + fn draw_background(&self, gc: &mut Vec); + fn draw_rays(&self, gc: &mut Vec, tracer: &(impl Rayable + ?Sized)); +} + trait SpacePart: boundary::Boundary + Metric + SpaceVisual {} impl SpacePart for T {} @@ -143,12 +146,8 @@ impl Rayable for T { } } -trait Renderable { - fn render(&self, gc: &mut Vec); -} - -impl Renderable for Coil { - fn render(&self, gc: &mut Vec) { +impl Interesting for Coil { + fn draw_background(&self, gc: &mut Vec) { gc.new_path(); gc.circle(0.0, 0.0, self.r + self.w + self.m); gc.circle(0.0, 0.0, self.r + self.w); @@ -157,29 +156,35 @@ impl Renderable for Coil { gc.winding_rule(WindingRule::EvenOdd); gc.fill_color(Color::Rgba(0.8, 0.8, 0.8, 1.0)); gc.fill(); + } + + fn draw_rays(&self, gc: &mut Vec, tracer: &(impl Rayable + ?Sized)) { gc.line_width(0.5); gc.stroke_color(Color::Rgba(1.0, 0.5, 0.0, 1.0)); - self.draw_fan(gc, vec2(-500.0, 0.0), vec2(1.0, 0.0), 1.0); + tracer.draw_fan(gc, vec2(-500.0, 0.0), vec2(1.0, 0.0), 1.0); gc.stroke_color(Color::Rgba(0.0, 0.5, 1.0, 1.0)); - self.draw_fan(gc, vec2(0.0, self.r), vec2(1.0, 0.0), 1.0); + tracer.draw_fan(gc, vec2(0.0, self.r), vec2(1.0, 0.0), 1.0); } } -impl Renderable for Rect { - fn render(&self, gc: &mut Vec) { +impl Interesting for Rect { + fn draw_background(&self, gc: &mut Vec) { gc.new_path(); gc.rect(-self.outer_radius, -self.external_halflength, self.outer_radius, self.external_halflength); gc.rect(-self.inner_radius, -self.external_halflength, self.inner_radius, self.external_halflength); gc.winding_rule(WindingRule::EvenOdd); gc.fill_color(Color::Rgba(0.8, 0.8, 0.8, 1.0)); gc.fill(); + } + + fn draw_rays(&self, gc: &mut Vec, tracer: &(impl Rayable + ?Sized)) { gc.line_width(0.5); gc.stroke_color(Color::Rgba(1.0, 0.5, 0.0, 1.0)); - self.draw_fan(gc, vec2(-500.0, 0.0), vec2(1.0, 0.0), 1.0); + tracer.draw_fan(gc, vec2(-500.0, 0.0), vec2(1.0, 0.0), 1.0); gc.stroke_color(Color::Rgba(0.0, 0.5, 1.0, 1.0)); - // self.draw_fan(gc, vec2(0.0, -0.5 * self.external_halflength), vec2(1.0, 1.0), 1.0); + tracer.draw_fan(gc, vec2(0.0, -0.5 * self.external_halflength), vec2(1.0, 1.0), 1.0); gc.stroke_color(Color::Rgba(0.2, 0.7, 0.0, 1.0)); - // self.draw_fan(gc, vec2(-0.5 * self.inner_radius, -1.2 * self.external_halflength), vec2(0.0, 1.0), 1.0); + tracer.draw_fan(gc, vec2(-0.5 * self.inner_radius, -1.2 * self.external_halflength), vec2(0.0, 1.0), 1.0); } }