154 lines
2.6 KiB
Go
154 lines
2.6 KiB
Go
package main
|
|
|
|
import "fmt"
|
|
|
|
type Matrix struct {
|
|
width int
|
|
height int
|
|
matrix [][]int
|
|
}
|
|
|
|
func NewMatrix(width, height int) *Matrix {
|
|
m := &Matrix{
|
|
width: width,
|
|
height: height,
|
|
matrix: make([][]int, height),
|
|
}
|
|
|
|
for i := 0; i < height; i++ {
|
|
m.matrix[i] = make([]int, width)
|
|
}
|
|
|
|
return m
|
|
}
|
|
|
|
func (m *Matrix) Size() (int, int) {
|
|
return m.width, m.height
|
|
}
|
|
|
|
func (m *Matrix) At(x, y int) int {
|
|
return m.matrix[y][x]
|
|
}
|
|
|
|
func (m *Matrix) Set(x, y, value int) {
|
|
m.matrix[y][x] = value
|
|
}
|
|
|
|
func (m *Matrix) Get() [][]int {
|
|
return m.matrix
|
|
}
|
|
|
|
func (m *Matrix) Transpose() *Matrix {
|
|
M := NewMatrix(m.height, m.width)
|
|
for x := 0; x < m.width; x++ {
|
|
for y := 0; y < m.height; y++ {
|
|
M.Set(y, x, m.At(x, y))
|
|
}
|
|
}
|
|
return M
|
|
}
|
|
|
|
func (m *Matrix) MirrorX() *Matrix {
|
|
M := NewMatrix(m.width, m.height)
|
|
for x := 0; x < m.width; x++ {
|
|
for y := 0; y < m.height; y++ {
|
|
M.Set(x, y, m.At((m.width-1)-x, y))
|
|
}
|
|
}
|
|
return M
|
|
}
|
|
|
|
func (m *Matrix) MirrorY() *Matrix {
|
|
M := NewMatrix(m.width, m.height)
|
|
for x := 0; x < m.width; x++ {
|
|
for y := 0; y < m.height; y++ {
|
|
M.Set(x, y, m.At(x, (m.height-1)-y))
|
|
}
|
|
}
|
|
return M
|
|
}
|
|
|
|
func (m *Matrix) Mirror() *Matrix {
|
|
M := NewMatrix(m.width, m.height)
|
|
for x := 0; x < m.width; x++ {
|
|
for y := 0; y < m.height; y++ {
|
|
M.Set(x, y, m.At((m.width-1)-x, (m.height-1)-y))
|
|
}
|
|
}
|
|
return M
|
|
}
|
|
|
|
func (m *Matrix) Add(value int) {
|
|
for x := 0; x < m.width; x++ {
|
|
for y := 0; y < m.height; y++ {
|
|
m.matrix[y][x] += value
|
|
}
|
|
}
|
|
}
|
|
|
|
func (m *Matrix) MergeRight(M *Matrix) *Matrix {
|
|
var maxHeight int
|
|
|
|
if m.height > M.height {
|
|
maxHeight = m.height
|
|
} else {
|
|
maxHeight = M.height
|
|
}
|
|
|
|
mM := NewMatrix(m.width+M.width, maxHeight)
|
|
for y := 0; y < m.height; y++ {
|
|
for x := 0; x < m.width; x++ {
|
|
mM.Set(x, y, m.At(x, y))
|
|
}
|
|
}
|
|
for y := 0; y < M.height; y++ {
|
|
for x := 0; x < M.width; x++ {
|
|
mM.Set(m.width+x, y, M.At(x, y))
|
|
}
|
|
}
|
|
return mM
|
|
}
|
|
|
|
func (m *Matrix) MergeBottom(M *Matrix) *Matrix {
|
|
var maxWidth int
|
|
|
|
if m.width > M.width {
|
|
maxWidth = m.width
|
|
} else {
|
|
maxWidth = M.width
|
|
}
|
|
|
|
mM := NewMatrix(maxWidth, m.height+M.height)
|
|
for y := 0; y < m.height; y++ {
|
|
for x := 0; x < m.width; x++ {
|
|
mM.Set(x, y, m.At(x, y))
|
|
}
|
|
}
|
|
for y := 0; y < M.height; y++ {
|
|
for x := 0; x < M.width; x++ {
|
|
mM.Set(x, m.height+y, M.At(x, y))
|
|
}
|
|
}
|
|
return mM
|
|
}
|
|
|
|
func (m *Matrix) ToString() string {
|
|
str := ""
|
|
for y := 0; y < m.height; y++ {
|
|
for x := 0; x < m.width; x++ {
|
|
str += fmt.Sprintf(" %v ", m.At(x, y))
|
|
}
|
|
str += "\n"
|
|
}
|
|
return str
|
|
}
|
|
|
|
func (m *Matrix) Clone() *Matrix {
|
|
M := NewMatrix(m.width, m.height)
|
|
for y := 0; y < m.height; y++ {
|
|
for x := 0; x < m.width; x++ {
|
|
M.Set(x, y, m.At(x, y))
|
|
}
|
|
}
|
|
return M
|
|
}
|