diff options
| author | Martin Haug <mhaug@live.de> | 2022-05-03 23:07:19 +0200 |
|---|---|---|
| committer | Martin Haug <mhaug@live.de> | 2022-05-03 23:43:56 +0200 |
| commit | 51d0de09c6f7e2af4db3b65c3fe9595c501b82c9 (patch) | |
| tree | 938f58a8e0faa4f5216920fc3e82d86301d2f094 /src/geom/rect.rs | |
| parent | 6a8a0ec6ec8bb8cf346ee0dd2c45ddcfbee7fbe6 (diff) | |
Code Review: Relax, it's much worse than you think
Diffstat (limited to 'src/geom/rect.rs')
| -rw-r--r-- | src/geom/rect.rs | 75 |
1 files changed, 34 insertions, 41 deletions
diff --git a/src/geom/rect.rs b/src/geom/rect.rs index aa670f0a..34160b04 100644 --- a/src/geom/rect.rs +++ b/src/geom/rect.rs @@ -112,52 +112,45 @@ fn draw_side( radius_right: Length, connection: Connection, ) { - let reversed = |angle: Angle, radius, rotate, mirror_x, mirror_y| { - let [a, b, c, d] = bezier_arc(angle, radius, rotate, mirror_x, mirror_y); - [d, c, b, a] - }; - let angle_left = Angle::deg(if connection.prev { 90.0 } else { 45.0 }); let angle_right = Angle::deg(if connection.next { 90.0 } else { 45.0 }); - let (arc1, arc2) = match side { - Side::Top => { - let arc1 = reversed(angle_left, radius_left, true, true, false) - .map(|x| x + Point::with_x(radius_left)); - let arc2 = bezier_arc(-angle_right, radius_right, true, true, false) - .map(|x| x + Point::with_x(size.x - radius_right)); - - (arc1, arc2) - } - Side::Right => { - let arc1 = reversed(-angle_left, radius_left, false, false, false) - .map(|x| x + Point::new(size.x, radius_left)); - - let arc2 = bezier_arc(angle_right, radius_right, false, false, false) - .map(|x| x + Point::new(size.x, size.y - radius_right)); - - (arc1, arc2) - } - Side::Bottom => { - let arc1 = reversed(-angle_left, radius_left, true, false, false) - .map(|x| x + Point::new(size.x - radius_left, size.y)); - - let arc2 = bezier_arc(angle_right, radius_right, true, false, false) - .map(|x| x + Point::new(radius_right, size.y)); - - (arc1, arc2) - } - Side::Left => { - let arc1 = reversed(angle_left, radius_left, false, false, true) - .map(|x| x + Point::with_y(size.y - radius_left)); - - let arc2 = bezier_arc(-angle_right, radius_right, false, false, true) - .map(|x| x + Point::with_y(radius_right)); - - (arc1, arc2) - } + let length = size.get(side.axis()); + + // The arcs for a border of the rectangle along the x-axis, starting at (0,0). + let p1 = Point::with_x(radius_left); + let mut arc1 = bezier_arc( + p1 + Point::new( + -angle_left.sin() * radius_left, + (1.0 - angle_left.cos()) * radius_left, + ), + Point::new(radius_left, radius_left), + p1, + ); + + let p2 = Point::with_x(length - radius_right); + let mut arc2 = bezier_arc( + p2, + Point::new(length - radius_right, radius_right), + p2 + Point::new( + angle_right.sin() * radius_right, + (1.0 - angle_right.cos()) * radius_right, + ), + ); + + let transform = match side { + Side::Left => Transform::rotate(Angle::deg(-90.0)) + .post_concat(Transform::translate(Length::zero(), size.y)), + Side::Bottom => Transform::rotate(Angle::deg(180.0)) + .post_concat(Transform::translate(size.x, size.y)), + Side::Right => Transform::rotate(Angle::deg(90.0)) + .post_concat(Transform::translate(size.x, Length::zero())), + _ => Transform::identity(), }; + arc1 = arc1.map(|x| x.transform(transform)); + arc2 = arc2.map(|x| x.transform(transform)); + if !connection.prev { path.move_to(if radius_left.is_zero() { arc1[3] } else { arc1[0] }); } |
