优化数据结构,添加支持pos的处理函数
This commit is contained in:
parent
7ad0116d1f
commit
8086e6a813
|
@ -1,22 +1,22 @@
|
||||||
package matrix
|
package matrix
|
||||||
|
|
||||||
|
import "github.com/kercylan98/minotaur/utils/g2d"
|
||||||
|
|
||||||
// NewMatrix 生成特定宽高的二维矩阵
|
// NewMatrix 生成特定宽高的二维矩阵
|
||||||
|
// - 虽然提供了通过x、y坐标的操作函数,但是建议无论如何使用pos进行处理
|
||||||
// - 该矩阵为XY,而非YX
|
// - 该矩阵为XY,而非YX
|
||||||
func NewMatrix[T any](width, height int) *Matrix[T] {
|
func NewMatrix[T any](width, height int) *Matrix[T] {
|
||||||
matrix := &Matrix[T]{
|
matrix := &Matrix[T]{
|
||||||
w: width, h: height,
|
w: width, h: height,
|
||||||
}
|
}
|
||||||
matrix.m = make([][]T, width)
|
matrix.m = make([]T, width*height)
|
||||||
for x := 0; x < len(matrix.m); x++ {
|
|
||||||
matrix.m[x] = make([]T, height)
|
|
||||||
}
|
|
||||||
return matrix
|
return matrix
|
||||||
}
|
}
|
||||||
|
|
||||||
// Matrix 二维矩阵
|
// Matrix 二维矩阵
|
||||||
type Matrix[T any] struct {
|
type Matrix[T any] struct {
|
||||||
w, h int
|
w, h int
|
||||||
m [][]T
|
m []T
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetWidth 获取二维矩阵宽度
|
// GetWidth 获取二维矩阵宽度
|
||||||
|
@ -35,35 +35,73 @@ func (slf *Matrix[T]) GetWidth2Height() (width, height int) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetMatrix 获取二维矩阵
|
// GetMatrix 获取二维矩阵
|
||||||
|
// - 通常建议使用 GetMatrixWithPos 进行处理这样将拥有更高的效率
|
||||||
func (slf *Matrix[T]) GetMatrix() [][]T {
|
func (slf *Matrix[T]) GetMatrix() [][]T {
|
||||||
|
var result = make([][]T, slf.w)
|
||||||
|
for x := 0; x < slf.w; x++ {
|
||||||
|
ys := make([]T, slf.h)
|
||||||
|
for y := 0; y < slf.h; y++ {
|
||||||
|
ys[y] = slf.m[g2d.PositionToInt(slf.w, x, y)]
|
||||||
|
}
|
||||||
|
result[x] = ys
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetMatrixWithPos 获取顺序的矩阵
|
||||||
|
func (slf *Matrix[T]) GetMatrixWithPos() []T {
|
||||||
return slf.m
|
return slf.m
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get 获取特定坐标的内容
|
// Get 获取特定坐标的内容
|
||||||
func (slf *Matrix[T]) Get(x, y int) (value T) {
|
func (slf *Matrix[T]) Get(x, y int) (value T) {
|
||||||
if x >= slf.w || x < 0 || y >= slf.h || y < 0 {
|
return slf.m[g2d.PositionToInt(slf.w, x, y)]
|
||||||
return value
|
}
|
||||||
}
|
|
||||||
return slf.m[x][y]
|
// GetWithPos 获取特定坐标的内容
|
||||||
|
func (slf *Matrix[T]) GetWithPos(pos int) (value T) {
|
||||||
|
return slf.m[pos]
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set 设置特定坐标的内容
|
// Set 设置特定坐标的内容
|
||||||
func (slf *Matrix[T]) Set(x, y int, data T) {
|
func (slf *Matrix[T]) Set(x, y int, data T) {
|
||||||
slf.m[x][y] = data
|
slf.m[g2d.PositionToInt(slf.w, x, y)] = data
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetWithPos 设置特定坐标的内容
|
||||||
|
func (slf *Matrix[T]) SetWithPos(pos int, data T) {
|
||||||
|
slf.m[pos] = data
|
||||||
}
|
}
|
||||||
|
|
||||||
// Swap 交换两个位置的内容
|
// Swap 交换两个位置的内容
|
||||||
func (slf *Matrix[T]) Swap(x1, y1, x2, y2 int) {
|
func (slf *Matrix[T]) Swap(x1, y1, x2, y2 int) {
|
||||||
a, b := slf.Get(x1, y1), slf.Get(x2, y2)
|
a, b := slf.Get(x1, y1), slf.Get(x2, y2)
|
||||||
slf.m[x1][y1], slf.m[x2][y2] = b, a
|
slf.m[g2d.PositionToInt(slf.w, x1, y1)], slf.m[g2d.PositionToInt(slf.w, x2, y2)] = b, a
|
||||||
|
}
|
||||||
|
|
||||||
|
// SwapWithPos 交换两个位置的内容
|
||||||
|
func (slf *Matrix[T]) SwapWithPos(pos1, pos2 int) {
|
||||||
|
a, b := slf.m[pos1], slf.m[pos2]
|
||||||
|
slf.m[pos1], slf.m[pos2] = b, a
|
||||||
}
|
}
|
||||||
|
|
||||||
// TrySwap 尝试交换两个位置的内容,交换后不满足表达式时进行撤销
|
// TrySwap 尝试交换两个位置的内容,交换后不满足表达式时进行撤销
|
||||||
func (slf *Matrix[T]) TrySwap(x1, y1, x2, y2 int, expressionHandle func(matrix *Matrix[T]) bool) {
|
func (slf *Matrix[T]) TrySwap(x1, y1, x2, y2 int, expressionHandle func(matrix *Matrix[T]) bool) {
|
||||||
|
pos1 := g2d.PositionToInt(slf.w, x1, y1)
|
||||||
|
pos2 := g2d.PositionToInt(slf.w, x2, y2)
|
||||||
a, b := slf.Get(x1, y1), slf.Get(x2, y2)
|
a, b := slf.Get(x1, y1), slf.Get(x2, y2)
|
||||||
slf.m[x1][y1], slf.m[x2][y2] = b, a
|
slf.m[pos1], slf.m[pos2] = b, a
|
||||||
if !expressionHandle(slf) {
|
if !expressionHandle(slf) {
|
||||||
slf.m[x1][y1], slf.m[x2][y2] = a, b
|
slf.m[pos1], slf.m[pos2] = a, b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TrySwapWithPos 尝试交换两个位置的内容,交换后不满足表达式时进行撤销
|
||||||
|
func (slf *Matrix[T]) TrySwapWithPos(pos1, pos2 int, expressionHandle func(matrix *Matrix[T]) bool) {
|
||||||
|
a, b := slf.m[pos1], slf.m[pos2]
|
||||||
|
slf.m[pos1], slf.m[pos2] = b, a
|
||||||
|
if !expressionHandle(slf) {
|
||||||
|
slf.m[pos1], slf.m[pos2] = a, b
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,7 +109,14 @@ func (slf *Matrix[T]) TrySwap(x1, y1, x2, y2 int, expressionHandle func(matrix *
|
||||||
func (slf *Matrix[T]) FillFull(generateHandle func(x, y int) T) {
|
func (slf *Matrix[T]) FillFull(generateHandle func(x, y int) T) {
|
||||||
for x := 0; x < slf.w; x++ {
|
for x := 0; x < slf.w; x++ {
|
||||||
for y := 0; y < slf.h; y++ {
|
for y := 0; y < slf.h; y++ {
|
||||||
slf.m[x][y] = generateHandle(x, y)
|
slf.m[g2d.PositionToInt(slf.w, x, y)] = generateHandle(x, y)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FillFullWithPos 根据提供的生成器填充整个矩阵
|
||||||
|
func (slf *Matrix[T]) FillFullWithPos(generateHandle func(pos int) T) {
|
||||||
|
for pos := 0; pos < len(slf.m); pos++ {
|
||||||
|
slf.m[pos] = generateHandle(pos)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue