From 0d64d16c176c3b9ec8c673d19c222759d7d9f7d0 Mon Sep 17 00:00:00 2001 From: bloeys Date: Mon, 1 Nov 2021 12:02:32 +0400 Subject: [PATCH] Row major+More mat&vec functions --- gglm/geometric.go | 2 +- gglm/mat.go | 7 ++++++ gglm/mat2.go | 63 ++++++++++++++++++++++++++++------------------- gglm/vec2.go | 13 +++++----- go.mod | 7 ++++++ go.sum | 18 ++++++++++++++ main.go | 21 ++++++++++++---- 7 files changed, 92 insertions(+), 39 deletions(-) create mode 100755 gglm/mat.go diff --git a/gglm/geometric.go b/gglm/geometric.go index 9382518..e8aa8b7 100755 --- a/gglm/geometric.go +++ b/gglm/geometric.go @@ -1,5 +1,5 @@ package gglm func DotVec2(v1 *Vec2, v2 *Vec2) float32 { - return v1.X()*v2.X() + v2.Y()*v2.Y() + return v1.X()*v2.X() + v1.Y()*v2.Y() } diff --git a/gglm/mat.go b/gglm/mat.go new file mode 100755 index 0000000..d559117 --- /dev/null +++ b/gglm/mat.go @@ -0,0 +1,7 @@ +package gglm + +type Mat interface { + At(row, col int) float32 + Set(row, col int, val float32) + Size() int +} diff --git a/gglm/mat2.go b/gglm/mat2.go index b07eace..0a2a73a 100755 --- a/gglm/mat2.go +++ b/gglm/mat2.go @@ -6,47 +6,58 @@ import ( "gonum.org/v1/gonum/blas/blas32" ) +var _ Mat = &Mat2{} var _ fmt.Stringer = &Mat2{} type Mat2 struct { - *blas32.GeneralCols + *blas32.General +} + +func (m *Mat2) At(row, col int) float32 { + return m.Data[row*2+col] +} + +func (m *Mat2) Set(row, col int, val float32) { + m.Data[row*2+col] = val +} + +func (m *Mat2) Size() int { + return 2 } func (m *Mat2) String() string { - return fmt.Sprintf("| %f %f |\n| %f %f |", m.Data[0], m.Data[2], m.Data[1], m.Data[3]) + return fmt.Sprintf("| %f %f |\n| %f %f |", m.Data[0], m.Data[1], m.Data[2], m.Data[3]) } +//Scale m *= x (element wise multiplication) +func (m *Mat2) Scale(x float32) { + m.Data[0] *= x + m.Data[1] *= x + m.Data[2] *= x + m.Data[3] *= x +} + +//NewMat2 returns the identity matrix if data=nil, otherwise data is used +//as the backing array. +// +//Note: data must be row major func NewMat2(data []float32) *Mat2 { if data == nil { - data = make([]float32, 2*2) + data = []float32{ + 1, 0, + 0, 1, + } } else if len(data) != 4 { panic("Data must be nil or size 4") } - gc := &blas32.GeneralCols{ - Rows: 2, - Cols: 2, - Stride: 2, - Data: data, - } - - gc.From(blas32.General{ - Rows: 2, - Cols: 2, - Stride: 2, - Data: data, - }) - return &Mat2{ - GeneralCols: gc, + General: &blas32.General{ + Rows: 2, + Cols: 2, + Stride: 2, + Data: data, + }, } } - -//NewMat2ID returns an identity Mat2 -func NewMat2ID() *Mat2 { - return NewMat2([]float32{ - 1, 0, - 0, 1, - }) -} diff --git a/gglm/vec2.go b/gglm/vec2.go index 4840f56..a25852e 100755 --- a/gglm/vec2.go +++ b/gglm/vec2.go @@ -39,16 +39,15 @@ func (v *Vec2) Scale(x float32) { v.Data[1] *= x } -//AddVec2 v += v2 -func (v *Vec2) AddVec2(v2 *Vec2) { - v.Data[0] += v2.Data[0] - v.Data[1] += v2.Data[1] +func (v *Vec2) Add(b Swizzle2) { + v.Data[0] += b.X() + v.Data[1] += b.Y() } //SubVec2 v -= v2 -func (v *Vec2) SubVec2(v2 *Vec2) { - v.Data[0] -= v2.Data[0] - v.Data[1] -= v2.Data[1] +func (v *Vec2) Sub(v2 *Vec2) { + v.Data[0] -= v2.X() + v.Data[1] -= v2.Y() } //Mag returns the magnitude of the vector diff --git a/go.mod b/go.mod index 7ff278f..f3468f6 100755 --- a/go.mod +++ b/go.mod @@ -3,3 +3,10 @@ module github.com/bloeys/gglm go 1.17 require gonum.org/v1/gonum v0.9.3 + +require ( + github.com/jordanlewis/gcassert v0.0.0-20210728132837-c29918f42407 // indirect + golang.org/x/mod v0.2.0 // indirect + golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f // indirect + golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 // indirect +) diff --git a/go.sum b/go.sum index babdcb8..c05110e 100755 --- a/go.sum +++ b/go.sum @@ -13,6 +13,8 @@ github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmn github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/jordanlewis/gcassert v0.0.0-20210728132837-c29918f42407 h1:YEZsjUjE+/jbAZajJhnH5pGW13j5QLs9ZMiSudQfh5Y= +github.com/jordanlewis/gcassert v0.0.0-20210728132837-c29918f42407/go.mod h1:Qc93dJSt1iLNJCuG9Gy9ds0k/oh4ckhXGkD4AI3cEtM= github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= @@ -21,9 +23,13 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -41,9 +47,13 @@ golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+o golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -54,7 +64,13 @@ golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f h1:JcoF/bowzCDI+MXu1yLqQGNO3ibqWsWq+Sk7pOT218w= +golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/gonum v0.9.3 h1:DnoIG+QAMaF5NvxnGe/oKsgKcAc6PcUyl8q0VetfQ8s= @@ -62,4 +78,6 @@ gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/main.go b/main.go index 49cfacd..1ed49ea 100755 --- a/main.go +++ b/main.go @@ -8,9 +8,20 @@ import ( func main() { - v := gglm.NewVec2([]float32{4, 5}) - println(v.Mag()) - println(v.SqrMag()) - fmt.Println(gglm.NewMat2ID()) - fmt.Println(v) + v1 := gglm.NewVec2([]float32{4, 5}) + v2 := gglm.NewVec2([]float32{1, 1}) + println(v1.Mag()) + println(v1.SqrMag()) + + v1.Add(v2) + v1.Sub(v2) + + fmt.Println(gglm.DotVec2(v1, v2)) + fmt.Println(v1, v1.X(), v1.Y()) + + m := gglm.NewMat2(nil) + fmt.Println(m.String(), m.At(0, 1), m.At(1, 1)) + m.Set(0, 1, 55) + m.Set(1, 0, 77) + fmt.Println("\n"+m.String(), m.At(0, 1), m.At(1, 1)) }