diff --git a/src/draw.rs b/src/draw.rs
index 7d18551..177057b 100644
--- a/src/draw.rs
+++ b/src/draw.rs
@@ -1,4 +1,4 @@
-use geo::Point;
+use geo::{EuclideanLength, Point};
use crate::{
graph::{BendIndex, BendWeight, DotIndex, DotWeight, Ends, SegIndex, SegWeight, TaggedIndex},
@@ -88,7 +88,21 @@ impl<'a> Draw<'a> {
) -> Result
{
let tangent = self
.guide(&Default::default())
- .head_around_dot_segment(&head, around, cw, width);
+ .head_around_dot_segments(&head, around, width)
+ .1;
+ /*.into_iter()
+ .max_by(|x, y| x.euclidean_length().total_cmp(&y.euclidean_length()))
+ .unwrap();*/
+
+ /*let tangents = self
+ .guide(&Default::default())
+ .head_around_dot_segments(&head, around, width);
+
+ let tangent = if tangents.0.euclidean_length() <= tangents.1.euclidean_length() {
+ tangents.0
+ } else {
+ tangents.1
+ };*/
head = self.extend_head(head, tangent.start_point())?;
self.segbend(
diff --git a/src/guide.rs b/src/guide.rs
index b1f2f7e..5493411 100644
--- a/src/guide.rs
+++ b/src/guide.rs
@@ -48,6 +48,21 @@ impl<'a, 'b> Guide<'a, 'b> {
math::tangent_segment(from_circle, from_cw, to_circle, Some(cw))
}
+ pub fn head_around_dot_segments(
+ &self,
+ head: &Head,
+ around: DotIndex,
+ width: f64,
+ ) -> (Line, Line) {
+ let from_circle = self.head_circle(&head, width);
+ let to_circle = self.dot_circle(around, width);
+
+ let from_cw = self.head_cw(&head);
+ let tangents: Vec =
+ math::tangent_segments(from_circle, from_cw, to_circle, None).collect();
+ (tangents[0], tangents[1])
+ }
+
pub fn head_around_dot_segment(
&self,
head: &Head,
diff --git a/src/main.rs b/src/main.rs
index 61544de..53338e8 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -239,7 +239,7 @@ fn main() {
.add_dot(DotWeight {
net: 20,
circle: Circle {
- pos: (480.5, 700.5).into(),
+ pos: (480.5, 550.5).into(),
r: 8.0,
},
})
diff --git a/src/route.rs b/src/route.rs
index 2e84255..e347ce9 100644
--- a/src/route.rs
+++ b/src/route.rs
@@ -60,8 +60,11 @@ impl<'a> Route<'a> {
}
pub fn path(&mut self, trace: &mut Trace, path: &[VertexIndex], width: f64) -> Result<(), ()> {
- for vertex in path {
- self.step(trace, *vertex, width)?;
+ for (i, vertex) in path.iter().enumerate() {
+ if let Err(err) = self.step(trace, *vertex, width) {
+ self.undo_path(trace, i)?;
+ return Err(err);
+ }
}
Ok(())
}
diff --git a/src/router.rs b/src/router.rs
index a03569f..05852ad 100644
--- a/src/router.rs
+++ b/src/router.rs
@@ -71,17 +71,6 @@ impl<'a, RS: RouteStrategy> AstarStrategy<&Mesh, u64> for RouterAstarStrategy<'a
fn reroute(&mut self, vertex: VertexIndex, tracker: &PathTracker<&Mesh>) -> Option {
let new_path = tracker.reconstruct_path_to(vertex);
- /*if vertex == self.to {
- self.route
- .rework_path(&mut self.trace, &new_path[..new_path.len() - 1], 5.0)
- .ok();
- self.route
- .finish(&mut self.trace, new_path[new_path.len() - 1], 5.0)
- .ok();
- None
- } else {*/
- //}
-
self.route.rework_path(&mut self.trace, &new_path, 5.0).ok();
if self.route.finish(&mut self.trace, self.to, 5.0).is_ok() {