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 {