Visualize every routing search step

This commit is contained in:
Mikolaj Wielgus 2023-09-03 01:56:46 +02:00
parent c492bd1dda
commit 73a831ba6d
3 changed files with 63 additions and 21 deletions

View File

@ -24,7 +24,10 @@ mod segbend;
mod shape; mod shape;
use graph::{Tag, TaggedIndex}; use graph::{Tag, TaggedIndex};
use router::DefaultRouteStrategy; use layout::Layout;
use mesh::{MeshEdgeReference, VertexIndex};
use route::Route;
use router::{DefaultRouteStrategy, RouteStrategy};
use sdl2::event::Event; use sdl2::event::Event;
use sdl2::gfx::primitives::DrawRenderer; use sdl2::gfx::primitives::DrawRenderer;
use sdl2::keyboard::Keycode; use sdl2::keyboard::Keycode;
@ -40,12 +43,47 @@ use crate::graph::DotWeight;
use crate::math::Circle; use crate::math::Circle;
use crate::router::Router; use crate::router::Router;
struct DebugRouteStrategy<'a, RS: RouteStrategy> {
strategy: RS,
event_pump: &'a mut sdl2::EventPump,
canvas: &'a mut sdl2::render::Canvas<Window>,
}
impl<'a, RS: RouteStrategy> DebugRouteStrategy<'a, RS> {
pub fn new(
strategy: RS,
event_pump: &'a mut sdl2::EventPump,
canvas: &'a mut sdl2::render::Canvas<Window>,
) -> Self {
Self {
strategy,
event_pump,
canvas,
}
}
}
impl<'a, RS: RouteStrategy> RouteStrategy for DebugRouteStrategy<'a, RS> {
fn route_cost(&mut self, route: &Route, path: &[VertexIndex]) -> u64 {
render_times(self.event_pump, self.canvas, route.layout, None, 25);
self.strategy.route_cost(route, path)
}
fn edge_cost(&mut self, route: &Route, edge: MeshEdgeReference) -> u64 {
self.strategy.edge_cost(route, edge)
}
fn estimate_cost(&mut self, route: &Route, vertex: VertexIndex) -> u64 {
self.strategy.estimate_cost(route, vertex)
}
}
fn main() { fn main() {
let sdl_context = sdl2::init().unwrap(); let sdl_context = sdl2::init().unwrap();
let video_subsystem = sdl_context.video().unwrap(); let video_subsystem = sdl_context.video().unwrap();
let window = video_subsystem let window = video_subsystem
.window("rust-sdl2 demo", 800, 600) .window("Topola demo", 800, 600)
.position_centered() .position_centered()
.build() .build()
.unwrap(); .unwrap();
@ -219,23 +257,27 @@ fn main() {
let head = router.draw_around_dot(head, dot6, false, 5.0).unwrap(); let head = router.draw_around_dot(head, dot6, false, 5.0).unwrap();
let _ = router.draw_finish(head, dot7, 5.0);*/ let _ = router.draw_finish(head, dot7, 5.0);*/
router.enroute(dot1_1, dot1_2, DefaultRouteStrategy::new()); router.enroute(
dot1_1,
dot1_2,
DebugRouteStrategy::new(DefaultRouteStrategy::new(), &mut event_pump, &mut canvas),
);
render_times(&mut event_pump, &mut canvas, &mut router, None, -1); render_times(&mut event_pump, &mut canvas, &router.layout, None, -1);
render_times( render_times(
&mut event_pump, &mut event_pump,
&mut canvas, &mut canvas,
&mut router, &router.layout,
Some(barrier1_dot1.tag()), Some(barrier1_dot1.tag()),
-1, -1,
); );
render_times(&mut event_pump, &mut canvas, &mut router, None, -1); render_times(&mut event_pump, &mut canvas, &router.layout, None, -1);
} }
fn render_times( fn render_times(
event_pump: &mut EventPump, event_pump: &mut EventPump,
canvas: &mut Canvas<Window>, canvas: &mut Canvas<Window>,
router: &mut Router, layout: &Layout,
follower: Option<TaggedIndex>, follower: Option<TaggedIndex>,
times: i64, times: i64,
) { ) {
@ -266,7 +308,7 @@ fn render_times(
} }
let result = panic::catch_unwind(|| { let result = panic::catch_unwind(|| {
for shape in router.layout.shapes() { for shape in layout.shapes() {
match shape { match shape {
Shape::Dot(dot) => { Shape::Dot(dot) => {
let _ = canvas.filled_circle( let _ = canvas.filled_circle(

View File

@ -12,7 +12,7 @@ pub struct Trace {
} }
pub struct Route<'a> { pub struct Route<'a> {
layout: &'a mut Layout, pub layout: &'a mut Layout,
rules: &'a Rules, rules: &'a Rules,
mesh: &'a Mesh, mesh: &'a Mesh,
} }

View File

@ -22,9 +22,9 @@ pub struct Router {
} }
pub trait RouteStrategy { pub trait RouteStrategy {
fn route_cost(&mut self, path: &[VertexIndex]) -> u64; fn route_cost(&mut self, route: &Route, path: &[VertexIndex]) -> u64;
fn edge_cost(&mut self, edge: MeshEdgeReference) -> u64; fn edge_cost(&mut self, route: &Route, edge: MeshEdgeReference) -> u64;
fn estimate_cost(&mut self, vertex: VertexIndex) -> u64; fn estimate_cost(&mut self, route: &Route, vertex: VertexIndex) -> u64;
} }
pub struct DefaultRouteStrategy {} pub struct DefaultRouteStrategy {}
@ -36,15 +36,15 @@ impl DefaultRouteStrategy {
} }
impl RouteStrategy for DefaultRouteStrategy { impl RouteStrategy for DefaultRouteStrategy {
fn route_cost(&mut self, path: &[VertexIndex]) -> u64 { fn route_cost(&mut self, route: &Route, path: &[VertexIndex]) -> u64 {
0 0
} }
fn edge_cost(&mut self, edge: MeshEdgeReference) -> u64 { fn edge_cost(&mut self, route: &Route, edge: MeshEdgeReference) -> u64 {
1 1
} }
fn estimate_cost(&mut self, vertex: VertexIndex) -> u64 { fn estimate_cost(&mut self, route: &Route, vertex: VertexIndex) -> u64 {
0 0
} }
} }
@ -53,16 +53,16 @@ struct RouterAstarStrategy<'a, RS: RouteStrategy> {
route: Route<'a>, route: Route<'a>,
trace: Trace, trace: Trace,
to: VertexIndex, to: VertexIndex,
route_strategy: RS, strategy: RS,
} }
impl<'a, RS: RouteStrategy> RouterAstarStrategy<'a, RS> { impl<'a, RS: RouteStrategy> RouterAstarStrategy<'a, RS> {
pub fn new(route: Route<'a>, trace: Trace, to: VertexIndex, route_strategy: RS) -> Self { pub fn new(route: Route<'a>, trace: Trace, to: VertexIndex, strategy: RS) -> Self {
Self { Self {
route, route,
trace, trace,
to, to,
route_strategy, strategy,
} }
} }
} }
@ -81,16 +81,16 @@ impl<'a, RS: RouteStrategy> AstarStrategy<&Mesh, u64> for RouterAstarStrategy<'a
None None
} else { } else {
self.route.rework_path(&mut self.trace, &new_path, 5.0).ok(); self.route.rework_path(&mut self.trace, &new_path, 5.0).ok();
Some(self.route_strategy.route_cost(&new_path)) Some(self.strategy.route_cost(&self.route, &new_path))
} }
} }
fn edge_cost(&mut self, edge: MeshEdgeReference) -> u64 { fn edge_cost(&mut self, edge: MeshEdgeReference) -> u64 {
self.route_strategy.edge_cost(edge) self.strategy.edge_cost(&self.route, edge)
} }
fn estimate_cost(&mut self, vertex: VertexIndex) -> u64 { fn estimate_cost(&mut self, vertex: VertexIndex) -> u64 {
self.route_strategy.estimate_cost(vertex) self.strategy.estimate_cost(&self.route, vertex)
} }
} }