binaryimage/matrix.go
xoy f710ed8451 [Rendering of binary files]
Ways to render:

- Hilbert Curve
- Snake
2025-02-24 01:05:36 +01:00

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
}