mirror of
https://github.com/bloeys/gglm.git
synced 2025-12-29 13:38:20 +00:00
Row major+More mat&vec functions
This commit is contained in:
@ -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()
|
||||
}
|
||||
|
||||
7
gglm/mat.go
Executable file
7
gglm/mat.go
Executable file
@ -0,0 +1,7 @@
|
||||
package gglm
|
||||
|
||||
type Mat interface {
|
||||
At(row, col int) float32
|
||||
Set(row, col int, val float32)
|
||||
Size() int
|
||||
}
|
||||
63
gglm/mat2.go
63
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,
|
||||
})
|
||||
}
|
||||
|
||||
13
gglm/vec2.go
13
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
|
||||
|
||||
7
go.mod
7
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
|
||||
)
|
||||
|
||||
18
go.sum
18
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=
|
||||
|
||||
21
main.go
21
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))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user