From 1e19db5b25bbff71728a9fc283acf3775a23c4be Mon Sep 17 00:00:00 2001 From: Jacek Olszak Date: Tue, 12 Feb 2019 18:40:15 +0100 Subject: [PATCH] #159 Add test case when matrix determinant is not 1 --- geometry.go | 4 ++-- geometry_test.go | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/geometry.go b/geometry.go index 621a0b4..e847b52 100644 --- a/geometry.go +++ b/geometry.go @@ -405,7 +405,7 @@ func (m Matrix) Project(u Vec) Vec { func (m Matrix) Unproject(u Vec) Vec { det := m[0]*m[3] - m[2]*m[1] return Vec{ - m[3]/det*u.X - m[2]/det*u.Y + m[2]*m[5] - m[3]*m[4], - -m[1]/det*u.X + m[0]/det*u.Y + m[1]*m[4] - m[0]*m[5], + m[3]/det*u.X - m[2]/det*u.Y + (m[2]*m[5]-m[3]*m[4])/det, + -m[1]/det*u.X + m[0]/det*u.Y + (m[1]*m[4]-m[0]*m[5])/det, } } diff --git a/geometry_test.go b/geometry_test.go index b1ce00f..17b184f 100644 --- a/geometry_test.go +++ b/geometry_test.go @@ -100,6 +100,12 @@ func TestMatrix_Unproject(t *testing.T) { assert.InDelta(t, unprojected.X, 2, delta) assert.InDelta(t, unprojected.Y, 2, delta) }) + t.Run("for scaled, rotated and moved matrix", func(t *testing.T) { + matrix := pixel.IM.Scaled(pixel.ZV, 2).Rotated(pixel.ZV, math.Pi/2).Moved(pixel.V(2, 2)) + unprojected := matrix.Unproject(pixel.V(-2, 6)) + assert.InDelta(t, unprojected.X, 2, delta) + assert.InDelta(t, unprojected.Y, 2, delta) + }) t.Run("for rotated and moved matrix", func(t *testing.T) { matrix := pixel.IM.Rotated(pixel.ZV, math.Pi/2).Moved(pixel.V(1, 1)) unprojected := matrix.Unproject(pixel.V(1, 2))