autorouter: fix off-by-one error when walking over ratlines

This commit is contained in:
Mikolaj Wielgus 2024-05-11 05:00:53 +02:00
parent 2cd33dac60
commit 36bc606401
3 changed files with 19 additions and 31 deletions

View File

@ -24,8 +24,7 @@ use crate::{
pub struct Autoroute { pub struct Autoroute {
edge_indices: EdgeIndices<usize>, edge_indices: EdgeIndices<usize>,
cur_edge: EdgeIndex<usize>, navmesh: Option<Navmesh>, // Useful for debugging.
navmesh: Navmesh, // Useful for debugging.
} }
impl Autoroute { impl Autoroute {
@ -39,11 +38,10 @@ impl Autoroute {
let (from, to) = Self::edge_from_to(autorouter, cur_edge); let (from, to) = Self::edge_from_to(autorouter, cur_edge);
let layout = autorouter.layout.lock().unwrap(); let layout = autorouter.layout.lock().unwrap();
let navmesh = Navmesh::new(&layout, from, to).ok()?; let navmesh = Some(Navmesh::new(&layout, from, to).ok()?);
let this = Self { let this = Self {
edge_indices, edge_indices,
cur_edge,
navmesh, navmesh,
}; };
@ -54,33 +52,23 @@ impl Autoroute {
&mut self, &mut self,
autorouter: &mut Autorouter<R>, autorouter: &mut Autorouter<R>,
observer: &mut impl RouterObserverTrait<R>, observer: &mut impl RouterObserverTrait<R>,
) -> Option<()> { ) -> bool {
let navmesh = { let new_navmesh = if let Some(cur_edge) = self.edge_indices.next() {
let (from, to) = self.from_to(autorouter); let (from, to) = Self::edge_from_to(autorouter, cur_edge);
let layout = autorouter.layout.lock().unwrap(); let layout = autorouter.layout.lock().unwrap();
Navmesh::new(&layout, from, to).ok()? Some(Navmesh::new(&layout, from, to).ok()?)
} else {
None
}; };
let router = Router::new_from_navmesh( let router = Router::new_from_navmesh(
&mut autorouter.layout, &mut autorouter.layout,
std::mem::replace(&mut self.navmesh, navmesh), std::mem::replace(&mut self.navmesh, new_navmesh).unwrap(),
); );
router.unwrap().route_band(100.0, observer); router.unwrap().route_band(100.0, observer);
if let Some(cur_edge) = self.edge_indices.next() { self.navmesh.is_some()
self.cur_edge = cur_edge;
} else {
return None;
}
Some(())
}
pub fn from_to<R: RulesTrait>(
&self,
autorouter: &Autorouter<R>,
) -> (FixedDotIndex, FixedDotIndex) {
Self::edge_from_to(autorouter, self.cur_edge)
} }
fn edge_from_to<R: RulesTrait>( fn edge_from_to<R: RulesTrait>(
@ -115,7 +103,7 @@ impl Autoroute {
(from_dot, to_dot) (from_dot, to_dot)
} }
pub fn navmesh(&self) -> &Navmesh { pub fn navmesh(&self) -> &Option<Navmesh> {
&self.navmesh &self.navmesh
} }
} }
@ -132,14 +120,14 @@ impl<R: RulesTrait> Autorouter<R> {
} }
pub fn autoroute(&mut self, layer: u64, observer: &mut impl RouterObserverTrait<R>) { pub fn autoroute(&mut self, layer: u64, observer: &mut impl RouterObserverTrait<R>) {
if let Some(mut it) = self.autoroute_iter() { if let Some(mut autoroute) = self.autoroute_walk() {
while let Some(()) = it.next(self, observer) { while autoroute.next(self, observer) {
// //
} }
} }
} }
pub fn autoroute_iter(&mut self) -> Option<Autoroute> { pub fn autoroute_walk(&mut self) -> Option<Autoroute> {
Autoroute::new(self.ratsnest.graph().edge_indices(), self) Autoroute::new(self.ratsnest.graph().edge_indices(), self)
} }

View File

@ -202,7 +202,7 @@ impl eframe::App for App {
execute(async move { execute(async move {
let mut autorouter = Autorouter::new(layout).unwrap(); let mut autorouter = Autorouter::new(layout).unwrap();
if let Some(mut autoroute) = autorouter.autoroute_iter() { if let Some(mut autoroute) = autorouter.autoroute_walk() {
let from_to = autoroute.from_to(&autorouter); let from_to = autoroute.from_to(&autorouter);
{ {

View File

@ -289,8 +289,8 @@ fn main() -> Result<(), anyhow::Error> {
); );
let mut autorouter = Autorouter::new(layout.clone()).unwrap(); let mut autorouter = Autorouter::new(layout.clone()).unwrap();
if let Some(mut autoroute) = autorouter.autoroute_iter() { if let Some(mut autoroute) = autorouter.autoroute_walk() {
while let Some(()) = autoroute.next( while autoroute.next(
&mut autorouter, &mut autorouter,
&mut DebugRouterObserver::new( &mut DebugRouterObserver::new(
&mut event_pump, &mut event_pump,
@ -298,7 +298,7 @@ fn main() -> Result<(), anyhow::Error> {
&mut renderer, &mut renderer,
&font_context, &font_context,
&mut view, &mut view,
Some(autoroute.navmesh().clone()), autoroute.navmesh().clone(),
), ),
) { ) {
// //