Merge pull request #236 from bcvery1/master

Fixing line intersection for lines through origin
This commit is contained in:
Alex R. Delp 2020-05-10 13:49:13 -07:00 committed by GitHub
commit 9a9f831114
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 3 deletions

View File

@ -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). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased] ## [Unreleased]
- Gamepad API? - Gamepad API?
- Fixed Line intersects failing on lines passing through (0, 0)
## [v0.10.0-alpha] 2020-05-08 ## [v0.10.0-alpha] 2020-05-08
- Upgrade to GLFW 3.3! :tada: - Upgrade to GLFW 3.3! :tada:

View File

@ -406,12 +406,12 @@ func (l Line) IntersectRect(r Rect) Vec {
// - the point is contained by the rectangle // - the point is contained by the rectangle
// - the point is not the corner itself // - the point is not the corner itself
corners := r.Vertices() corners := r.Vertices()
closest := ZV var closest *Vec
closestCorner := corners[0] closestCorner := corners[0]
for _, c := range corners { for _, c := range corners {
cc := l.Closest(c) cc := l.Closest(c)
if closest == ZV || (closest.Len() > cc.Len() && r.Contains(cc)) { if closest == nil || (closest.Len() > cc.Len() && r.Contains(cc)) {
closest = cc closest = &cc
closestCorner = c closestCorner = c
} }
} }

View File

@ -1002,6 +1002,18 @@ func TestLine_Closest(t *testing.T) {
args: args{v: pixel.V(20, 20)}, args: args{v: pixel.V(20, 20)},
want: pixel.V(10, 10), 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 { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { 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)}, args: args{r: pixel.R(20, 20, 21, 21)},
want: pixel.ZV, 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 { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {