Skip to content

Instantly share code, notes, and snippets.

@Zbizu
Created June 23, 2021 17:48
Show Gist options
  • Save Zbizu/da7309a53f6a9f37da80412bf34f2209 to your computer and use it in GitHub Desktop.
Save Zbizu/da7309a53f6a9f37da80412bf34f2209 to your computer and use it in GitHub Desktop.
matrix operations in lua
local matrixFields = {
area = {}
}
local Matrix = setmetatable(matrixFields,
{
__call = function(matrix, ...)
return matrix.new(...)
end
}
)
Matrix.__index = Matrix
Matrix.__call = function(self)
return Matrix.new(self)
end
-- Matrix() <- creates an object with 0 x 0 matrix
-- Matrix(area) <- creates an object with a matrix from existing table, eg area globals like in spells, recommended 2d tables only
-- Matrix(sizeX, sizeY) <- creates a matrix of zeros of specified size
function Matrix.new (arg1, arg2)
local self = setmetatable ({ }, Matrix)
if type(arg1) == "table" then
self.area = arg1
elseif type(arg1) == "number" and type(arg2) == "number" then
local newArea = {}
for y = 1, arg2 do
newArea[y] = {}
for x = 1, arg1 do
newArea[y][x] = 0
end
end
self.area = newArea
end
self.something = something
return self
end
function Matrix:toString()
local s = ""
for y = 1, #self.area do
s = s .. "{"
for x = 1, #self.area[y] do
s = s .. self.area[y][x]
s = s .. (x == #self.area[y] and "" or ", ")
end
s = s .. "}"
s = s .. (y == #self.area and "" or ",\n")
end
return s
end
function Matrix:clone()
local newArea = {}
for y = 1, #self.area do
newArea[y] = {}
for x = 1, #self.area[y] do
newArea[y][x] = self.area[y][x]
end
end
return Matrix(newArea)
end
function Matrix:rotateRight()
local newArea = {}
for newY = 1, #self.area[1] do
local x = newY
newArea[newY] = {}
for newX = 1, #self.area do
local y = #self.area - newX + 1
newArea[newY][newX] = self.area[y][x]
end
end
self.area = newArea
return self
end
function Matrix:rotateLeft()
local newArea = {}
for newY = 1, #self.area[1] do
local x = #self.area[1] - newY + 1
newArea[newY] = {}
for newX = 1, #self.area do
local y = newX
newArea[newY][newX] = self.area[y][x]
end
end
self.area = newArea
return self
end
function Matrix:rotate180()
local newArea = {}
local sizeX = #self.area[1]
local sizeY = #self.area
for newY = 1, sizeY do
newArea[newY] = {}
for newX = 1, sizeX do
newArea[newY][newX] = self.area[sizeY - newY + 1][sizeX - newX + 1]
end
end
self.area = newArea
return self
end
-- testing
--[[
local t = {
{2, 4, 6, 8},
{1, 2, 3, 4}
}
print("empty matrix size 2, 4:")
print(Matrix(2, 4):toString())
print("matrix A:")
local m = Matrix(t)
print(m:toString())
print("matrix A rotated right:")
local m1 = m:clone():rotateRight()
print(m1:toString())
print("matrix A rotated left:")
m1 = m:clone():rotateLeft()
print(m1:toString())
print("matrix A rotated 180:")
m1 = m:clone():rotate180()
print(m1:toString())
print("matrix A corruption check:")
print(m:toString())
]]
-- end testing
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment