diff --git a/src/draw.rs b/src/draw.rs index 2bdb60a..9d6cfaa 100644 --- a/src/draw.rs +++ b/src/draw.rs @@ -127,26 +127,21 @@ impl<'a> Draw<'a> { dirs = [false, true]; } - for (i, tangent) in [tangents.0, tangents.1].iter().enumerate() { - match self.segbend_around( - head, - TaggedIndex::Dot(around), - tangent.start_point(), - tangent.end_point(), - dirs[i], - width, - ) { - Ok(head) => { - return Ok(head); - } - Err(err) => { - if i >= 1 { - return Err(err); - } - } - } - } - unreachable!(); + [tangents.0, tangents.1] + .iter() + .enumerate() + .find_map(|(i, tangent)| { + self.segbend_around( + head, + TaggedIndex::Dot(around), + tangent.start_point(), + tangent.end_point(), + dirs[i], + width, + ) + .ok() + }) + .ok_or(()) } #[debug_ensures(ret.is_ok() -> self.layout.node_count() == old(self.layout.node_count() + 4))] @@ -155,21 +150,33 @@ impl<'a> Draw<'a> { &mut self, mut head: Head, around: BendIndex, - cw: bool, width: f64, ) -> Result { - let tangent = self + let mut tangents = self .guide(&Default::default()) - .head_around_bend_segment(&head, around, cw, width); + .head_around_bend_segments(&head, around, width); + let mut dirs = [true, false]; - head = self.extend_head(head, tangent.start_point())?; - self.segbend( - head, - TaggedIndex::Bend(around), - tangent.end_point(), - cw, - width, - ) + if tangents.1.euclidean_length() < tangents.0.euclidean_length() { + tangents = (tangents.1, tangents.0); + dirs = [false, true]; + } + + [tangents.0, tangents.1] + .iter() + .enumerate() + .find_map(|(i, tangent)| { + self.segbend_around( + head, + TaggedIndex::Bend(around), + tangent.start_point(), + tangent.end_point(), + dirs[i], + width, + ) + .ok() + }) + .ok_or(()) } #[debug_ensures(ret.is_ok() -> self.layout.node_count() == old(self.layout.node_count() + 4))] diff --git a/src/guide.rs b/src/guide.rs index 440de09..7200521 100644 --- a/src/guide.rs +++ b/src/guide.rs @@ -34,20 +34,6 @@ impl<'a, 'b> Guide<'a, 'b> { math::tangent_segment(from_circle, from_cw, to_circle, None) } - pub fn head_around_bend_segment( - &self, - head: &Head, - around: BendIndex, - cw: bool, - width: f64, - ) -> Line { - let from_circle = self.head_circle(head, width); - let to_circle = self.bend_circle(around, width); - - let from_cw = self.head_cw(head); - math::tangent_segment(from_circle, from_cw, to_circle, Some(cw)) - } - pub fn head_around_dot_segments( &self, head: &Head, @@ -77,6 +63,35 @@ impl<'a, 'b> Guide<'a, 'b> { math::tangent_segment(from_circle, from_cw, to_circle, Some(cw)) } + pub fn head_around_bend_segments( + &self, + head: &Head, + around: BendIndex, + width: f64, + ) -> (Line, Line) { + let from_circle = self.head_circle(head, width); + let to_circle = self.bend_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_bend_segment( + &self, + head: &Head, + around: BendIndex, + cw: bool, + width: f64, + ) -> Line { + let from_circle = self.head_circle(head, width); + let to_circle = self.bend_circle(around, width); + + let from_cw = self.head_cw(head); + math::tangent_segment(from_circle, from_cw, to_circle, Some(cw)) + } + pub fn head_cw(&self, head: &Head) -> Option { if let Head::Segbend(head) = head { Some(self.layout.primitive(head.segbend.bend).weight().cw) diff --git a/src/main.rs b/src/main.rs index c0d0dd7..b21fc13 100644 --- a/src/main.rs +++ b/src/main.rs @@ -68,7 +68,7 @@ impl<'a> DebugRouterObserver<'a> { impl<'a> RouterObserver for DebugRouterObserver<'a> { fn on_rework(&mut self, tracer: &Tracer, trace: &Trace) { - render_times( + /*render_times( self.event_pump, self.canvas, RouterOrLayout::Layout(tracer.layout), @@ -77,13 +77,13 @@ impl<'a> RouterObserver for DebugRouterObserver<'a> { Some(tracer.mesh.clone()), &trace.path, 20, - ); + );*/ } fn before_probe(&mut self, tracer: &Tracer, trace: &Trace, edge: MeshEdgeReference) { let mut path = trace.path.clone(); path.push(edge.target()); - render_times( + /*render_times( self.event_pump, self.canvas, RouterOrLayout::Layout(tracer.layout), @@ -92,11 +92,11 @@ impl<'a> RouterObserver for DebugRouterObserver<'a> { Some(tracer.mesh.clone()), &path, 5, - ); + );*/ } fn on_probe(&mut self, tracer: &Tracer, trace: &Trace, edge: MeshEdgeReference) { - render_times( + /*render_times( self.event_pump, self.canvas, RouterOrLayout::Layout(tracer.layout), @@ -105,7 +105,7 @@ impl<'a> RouterObserver for DebugRouterObserver<'a> { Some(tracer.mesh.clone()), &trace.path, 5, - ); + );*/ } fn on_estimate(&mut self, _tracer: &Tracer, _vertex: VertexIndex) {} @@ -145,7 +145,18 @@ fn main() { let dot2 = router .layout .add_dot(DotWeight { - net: 1, + net: 15, + circle: Circle { + pos: (100.5, 500.5).into(), + r: 8.0, + }, + }) + .unwrap(); + + let dot_end = router + .layout + .add_dot(DotWeight { + net: 10, circle: Circle { pos: (470.5, 350.5).into(), r: 8.0, @@ -284,16 +295,90 @@ fn main() { }, ); + let dot6 = router + .layout + .add_dot(DotWeight { + net: 2, + circle: Circle { + pos: (530.5, 300.5).into(), + r: 8.0, + }, + }) + .unwrap(); + + let _ = router.layout.add_seg( + dot5, + dot6, + SegWeight { + net: 20, + width: 16.0, + }, + ); + + /*let dot7 = router + .layout + .add_dot(DotWeight { + net: 2, + circle: Circle { + pos: (400.5, 440.5).into(), + r: 8.0, + }, + }) + .unwrap(); + + let _ = router.layout.add_seg( + dot4, + dot7, + SegWeight { + net: 20, + width: 16.0, + }, + );*/ + + render_times( + &mut event_pump, + &mut canvas, + RouterOrLayout::Layout(&router.layout), + None, + None, + None, + &[], + -1, + ); + render_times( &mut event_pump, &mut canvas, RouterOrLayout::Router(&mut router), Some(dot1), - Some(dot2), + Some(dot_end), None, &[], -1, ); + + render_times( + &mut event_pump, + &mut canvas, + RouterOrLayout::Layout(&router.layout), + None, + None, + None, + &[], + -1, + ); + + render_times( + &mut event_pump, + &mut canvas, + RouterOrLayout::Router(&mut router), + Some(dot2), + Some(dot_end), + None, + &[], + -1, + ); + render_times( &mut event_pump, &mut canvas, @@ -338,11 +423,6 @@ fn render_times( if let Some(follower) = follower { let state = event_pump.mouse_state(); - /*let _ = router.layout.move_dot( - follower.into_dot().unwrap(), - (state.x() as f64, state.y() as f64).into(), - );*/ - if let Some(from) = from { mesh = router .reroute( @@ -351,6 +431,10 @@ fn render_times( &mut DebugRouterObserver::new(event_pump, canvas), ) .ok(); + } else { + let _ = router + .layout + .move_dot(follower, (state.x() as f64, state.y() as f64).into()); } } @@ -412,7 +496,7 @@ fn render_times( );*/ } - if let Some(ref mesh) = mesh { + /*if let Some(ref mesh) = mesh { for edge in mesh.edge_references() { let endpoints = (mesh.position(edge.source()), mesh.position(edge.target())); @@ -430,7 +514,7 @@ fn render_times( color, ); } - } + }*/ //}); canvas.present(); diff --git a/src/math.rs b/src/math.rs index 2a5cbfe..caee5c9 100644 --- a/src/math.rs +++ b/src/math.rs @@ -153,7 +153,7 @@ pub fn intersect_circles(circle1: &Circle, circle2: &Circle) -> Vec { let p = circle1.pos + delta * (a / d); let h = (circle1.r * circle1.r - a * a).sqrt(); - if h == 0. { + if h == 0.0 { return [p].into(); } diff --git a/src/primitive.rs b/src/primitive.rs index da18a6f..a8028aa 100644 --- a/src/primitive.rs +++ b/src/primitive.rs @@ -71,7 +71,7 @@ impl<'a, Weight> Primitive<'a, Weight> { .weight() .circle; - core_circle.r + r + 5.0 + core_circle.r + r + 3.0 } pub fn neighbors(&self) -> impl Iterator + '_ { @@ -80,13 +80,15 @@ impl<'a, Weight> Primitive<'a, Weight> { .map(|index| Index::