Separation of concerns!

This commit is contained in:
numzero 2024-05-07 15:00:23 +03:00
parent 9997bbabb4
commit 76826b74e2

View File

@ -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<Box<dyn SpacePart>> = 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<Draw>);
fn draw_rays(&self, gc: &mut Vec<Draw>, tracer: &(impl Rayable + ?Sized));
}
trait SpacePart: boundary::Boundary + Metric + SpaceVisual {}
impl<T: boundary::Boundary + Metric + SpaceVisual> SpacePart for T {}
@ -143,12 +146,8 @@ impl<T: Metric> Rayable for T {
}
}
trait Renderable {
fn render(&self, gc: &mut Vec<Draw>);
}
impl Renderable for Coil {
fn render(&self, gc: &mut Vec<Draw>) {
impl Interesting for Coil {
fn draw_background(&self, gc: &mut Vec<Draw>) {
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<Draw>, 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<Draw>) {
impl Interesting for Rect {
fn draw_background(&self, gc: &mut Vec<Draw>) {
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<Draw>, 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);
}
}