Route to goal immediately if a straight path exists at any vertex

This commit is contained in:
Mikolaj Wielgus 2023-09-03 05:41:21 +02:00
parent 73a831ba6d
commit 7d76051cbf
3 changed files with 18 additions and 13 deletions

View File

@ -23,7 +23,7 @@ mod rules;
mod segbend; mod segbend;
mod shape; mod shape;
use graph::{Tag, TaggedIndex}; use graph::{SegWeight, Tag, TaggedIndex};
use layout::Layout; use layout::Layout;
use mesh::{MeshEdgeReference, VertexIndex}; use mesh::{MeshEdgeReference, VertexIndex};
use route::Route; use route::Route;
@ -224,7 +224,7 @@ fn main() {
}) })
.unwrap(); .unwrap();
let _barrier2_dot1 = router let barrier2_dot1 = router
.layout .layout
.add_dot(DotWeight { .add_dot(DotWeight {
net: 20, net: 20,
@ -234,7 +234,7 @@ fn main() {
}, },
}) })
.unwrap(); .unwrap();
let _barrier2_dot2 = router let barrier2_dot2 = router
.layout .layout
.add_dot(DotWeight { .add_dot(DotWeight {
net: 20, net: 20,
@ -244,20 +244,20 @@ fn main() {
}, },
}) })
.unwrap(); .unwrap();
/*let _ = router.layout.add_seg( let _ = router.layout.add_seg(
barrier2_dot1, barrier2_dot1,
barrier2_dot2, barrier2_dot2,
SegWeight { SegWeight {
net: 20, net: 20,
width: 16.0, width: 16.0,
}, },
);*/ );
/*let head = router.draw_start(dot5); /*let head = router.draw_start(dot5);
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( let _ = router.enroute(
dot1_1, dot1_1,
dot1_2, dot1_2,
DebugRouteStrategy::new(DefaultRouteStrategy::new(), &mut event_pump, &mut canvas), DebugRouteStrategy::new(DefaultRouteStrategy::new(), &mut event_pump, &mut canvas),

View File

@ -71,7 +71,7 @@ impl<'a, RS: RouteStrategy> AstarStrategy<&Mesh, u64> for RouterAstarStrategy<'a
fn reroute(&mut self, vertex: VertexIndex, tracker: &PathTracker<&Mesh>) -> Option<u64> { fn reroute(&mut self, vertex: VertexIndex, tracker: &PathTracker<&Mesh>) -> Option<u64> {
let new_path = tracker.reconstruct_path_to(vertex); let new_path = tracker.reconstruct_path_to(vertex);
if vertex == self.to { /*if vertex == self.to {
self.route self.route
.rework_path(&mut self.trace, &new_path[..new_path.len() - 1], 5.0) .rework_path(&mut self.trace, &new_path[..new_path.len() - 1], 5.0)
.ok(); .ok();
@ -79,10 +79,16 @@ impl<'a, RS: RouteStrategy> AstarStrategy<&Mesh, u64> for RouterAstarStrategy<'a
.finish(&mut self.trace, new_path[new_path.len() - 1], 5.0) .finish(&mut self.trace, new_path[new_path.len() - 1], 5.0)
.ok(); .ok();
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.strategy.route_cost(&self.route, &new_path))
if self.route.finish(&mut self.trace, self.to, 5.0).is_ok() {
return None;
} }
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 {

View File

@ -2,7 +2,6 @@ use enum_as_inner::EnumAsInner;
use geo::{point, polygon, EuclideanDistance, Intersects, Point, Polygon, Rotate}; use geo::{point, polygon, EuclideanDistance, Intersects, Point, Polygon, Rotate};
use rstar::{RTreeObject, AABB}; use rstar::{RTreeObject, AABB};
use crate::math::{self, Circle}; use crate::math::{self, Circle};
#[derive(Debug, Clone, Copy, PartialEq)] #[derive(Debug, Clone, Copy, PartialEq)]
@ -101,8 +100,8 @@ impl Shape {
fn priority(&self) -> i64 { fn priority(&self) -> i64 {
match self { match self {
Shape::Dot(..) => 3, Shape::Dot(..) => 3,
Shape::Bend(..) => 2, Shape::Seg(..) => 2,
Shape::Seg(..) => 1, Shape::Bend(..) => 1,
} }
} }