From 176570527ded6aeeb2335fe01e412a263cfa9ff5 Mon Sep 17 00:00:00 2001 From: Walter Werner SCHNEIDER Date: Mon, 28 Jul 2025 22:08:33 +0300 Subject: [PATCH] internal/stroke: handle zero-length points Fixes the edge case where a zero point would be normalized to NaN. Signed-off-by: Walter Werner SCHNEIDER --- internal/stroke/stroke.go | 3 +++ internal/stroke/stroke_test.go | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/internal/stroke/stroke.go b/internal/stroke/stroke.go index 4073e422..6a6b3877 100644 --- a/internal/stroke/stroke.go +++ b/internal/stroke/stroke.go @@ -327,6 +327,9 @@ func strokePathNorm(p0, p1, p2 f32.Point, t, d float32) f32.Point { func rot90CW(p f32.Point) f32.Point { return f32.Pt(+p.Y, -p.X) } func normPt(p f32.Point, l float32) f32.Point { + if p.X == 0 && p.Y == 0 { + return f32.Point{} + } isVerticalUnit := p.X == 0 && (p.Y == l || p.Y == -l) isHorizontalUnit := p.Y == 0 && (p.X == l || p.X == -l) if isVerticalUnit || isHorizontalUnit { diff --git a/internal/stroke/stroke_test.go b/internal/stroke/stroke_test.go index 80f2296e..8e6630bd 100644 --- a/internal/stroke/stroke_test.go +++ b/internal/stroke/stroke_test.go @@ -16,6 +16,10 @@ func TestNormPt(t *testing.T) { } scenarios := []scenario{ + // l!=0 && X=Y=0 + {l: 10, ptIn: f32.Point{X: 0, Y: 0}, ptOut: f32.Point{X: 0, Y: 0}}, + {l: -10, ptIn: f32.Point{X: 0, Y: 0}, ptOut: f32.Point{X: 0, Y: 0}}, + // l>0 & X {l: +20, ptIn: f32.Point{X: +30, Y: 0}, ptOut: f32.Point{X: +20, Y: 0}}, {l: +20, ptIn: f32.Point{X: +20, Y: 0}, ptOut: f32.Point{X: +20, Y: 0}},