From 89c14487774b5a6c61beb7c82780575614c97e74 Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Tue, 20 Oct 2026 15:23:11 +0200 Subject: [PATCH] Normalise negative zero in Measure tool angle Found while testing crates/tools/src/xform/measure.rs:20 (shown at :66, reported at :80) Co-Authored-By: Claude Haiku 5.5 Co-Authored-By: Claude Sonnet 5.5 --- crates/tools/src/xform/measure.rs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/crates/tools/src/xform/measure.rs b/crates/tools/src/xform/measure.rs index 55835c48c..714d284a1 100644 --- a/crates/tools/src/xform/measure.rs +++ b/crates/tools/src/xform/measure.rs @@ -17,7 +17,7 @@ pub struct MeasureTool { /// (distance, angle in degrees counter-clockwise, dx, dy) pub fn measure(a: Point, b: Point) -> (f64, f64, f64, f64) { let d = b - a; - (d.hypot(), (-d.y).atan2(d.x).to_degrees(), d.x, d.y) + (d.hypot(), (-d.y).atan2(d.x).to_degrees() + 0.0, d.x, d.y) } impl Tool for MeasureTool { @@ -90,6 +90,23 @@ mod tests { use crate::testutil::*; use vectorcraft_doc::Selection; + #[test] + fn horizontal_drag_reports_positive_zero_angle() { + let (d, _) = doc_with_rect(); + let s = Selection::default(); + let p = paint(); + let mut cx = cx(&d, &s, &p); + cx.smart_guides = false; + let mut t = MeasureTool::default(); + t.pointer(&cx, &PointerEvent::new(PointerKind::Down, 10.0, 10.0)); + t.pointer(&cx, &PointerEvent::new(PointerKind::Drag, 40.0, 10.0)); + t.pointer(&cx, &PointerEvent::new(PointerKind::Up, 40.0, 10.0)); + let ang = t.options()["angle"].as_f64().unwrap(); + assert!(ang == 0.0 && ang.is_sign_positive(), "angle was {ang:?}"); + let ov = t.overlays(&cx); + assert!(matches!(&ov[1], Overlay::Measure { text, .. } if text.contains("Angle: 0.0°"))); + } + #[test] fn drag_reports_distance_and_angle() { let (d, _) = doc_with_rect();