From 30f8ac10b744d7c3d07e8157ac2f820458b7496f Mon Sep 17 00:00:00 2001 From: Walter Werner SCHNEIDER Date: Mon, 28 Jul 2025 22:08:34 +0300 Subject: [PATCH] internal/stroke: fix point normalization for unit length. This fixes the cases where the unit length matches the hypotenuse. Signed-off-by: Walter Werner SCHNEIDER --- internal/stroke/stroke.go | 6 +++++- internal/stroke/stroke_test.go | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/internal/stroke/stroke.go b/internal/stroke/stroke.go index 6a6b3877..fccbad2d 100644 --- a/internal/stroke/stroke.go +++ b/internal/stroke/stroke.go @@ -342,7 +342,11 @@ func normPt(p f32.Point, l float32) f32.Point { d := math.Hypot(float64(p.X), float64(p.Y)) l64 := float64(l) if math.Abs(d-l64) < 1e-10 { - return f32.Point{} + if math.Signbit(float64(l)) { + return f32.Point{X: -p.X, Y: -p.Y} + } else { + return f32.Point{X: p.X, Y: p.Y} + } } n := float32(l64 / d) return f32.Point{X: p.X * n, Y: p.Y * n} diff --git a/internal/stroke/stroke_test.go b/internal/stroke/stroke_test.go index 8e6630bd..f43fb740 100644 --- a/internal/stroke/stroke_test.go +++ b/internal/stroke/stroke_test.go @@ -91,6 +91,16 @@ func TestNormPt(t *testing.T) { {l: -20, ptIn: f32.Point{X: -20, Y: +20}, ptOut: f32.Point{X: +14.142136, Y: -14.142136}}, {l: -20, ptIn: f32.Point{X: -30, Y: +30}, ptOut: f32.Point{X: +14.142136, Y: -14.142136}}, {l: -20, ptIn: f32.Point{X: -90, Y: +90}, ptOut: f32.Point{X: +14.142137, Y: -14.142137}}, + + // l!=0 && Hypot=l + {l: 5, ptIn: f32.Point{X: 3, Y: 4}, ptOut: f32.Point{X: 3, Y: 4}}, + {l: 5, ptIn: f32.Point{X: 3, Y: -4}, ptOut: f32.Point{X: 3, Y: -4}}, + {l: 5, ptIn: f32.Point{X: -3, Y: -4}, ptOut: f32.Point{X: -3, Y: -4}}, + {l: 5, ptIn: f32.Point{X: -3, Y: 4}, ptOut: f32.Point{X: -3, Y: 4}}, + {l: -5, ptIn: f32.Point{X: 3, Y: 4}, ptOut: f32.Point{X: -3, Y: -4}}, + {l: -5, ptIn: f32.Point{X: 3, Y: -4}, ptOut: f32.Point{X: -3, Y: 4}}, + {l: -5, ptIn: f32.Point{X: -3, Y: -4}, ptOut: f32.Point{X: 3, Y: 4}}, + {l: -5, ptIn: f32.Point{X: -3, Y: 4}, ptOut: f32.Point{X: 3, Y: -4}}, } for i, s := range scenarios {