diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ed4ade..e3232c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] - Gamepad API? +- Fixed Line intersects failing on lines passing through (0, 0) ## [v0.10.0-alpha] 2020-05-08 - Upgrade to GLFW 3.3! :tada: diff --git a/geometry.go b/geometry.go index 2d902dc..a98b78c 100644 --- a/geometry.go +++ b/geometry.go @@ -406,12 +406,12 @@ func (l Line) IntersectRect(r Rect) Vec { // - the point is contained by the rectangle // - the point is not the corner itself corners := r.Vertices() - closest := ZV + var closest *Vec closestCorner := corners[0] for _, c := range corners { cc := l.Closest(c) - if closest == ZV || (closest.Len() > cc.Len() && r.Contains(cc)) { - closest = cc + if closest == nil || (closest.Len() > cc.Len() && r.Contains(cc)) { + closest = &cc closestCorner = c } } diff --git a/geometry_test.go b/geometry_test.go index e3af737..da63314 100644 --- a/geometry_test.go +++ b/geometry_test.go @@ -1002,6 +1002,18 @@ func TestLine_Closest(t *testing.T) { args: args{v: pixel.V(20, 20)}, want: pixel.V(10, 10), }, + { + name: "Vertical line", + fields: fields{A: pixel.V(0, -10), B: pixel.V(0, 10)}, + args: args{v: pixel.V(-1, 0)}, + want: pixel.V(0, 0), + }, + { + name: "Horizontal line", + fields: fields{A: pixel.V(-10, 0), B: pixel.V(10, 0)}, + args: args{v: pixel.V(0, -1)}, + want: pixel.V(0, 0), + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -1297,6 +1309,12 @@ func TestLine_IntersectRect(t *testing.T) { args: args{r: pixel.R(20, 20, 21, 21)}, want: pixel.ZV, }, + { + name: "Line intersects at 0,0", + fields: fields{A: pixel.V(0, -10), B: pixel.V(0, 10)}, + args: args{r: pixel.R(-1, 0, 2, 2)}, + want: pixel.V(-1, 0), + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) {