Created
June 23, 2021 17:48
-
-
Save Zbizu/da7309a53f6a9f37da80412bf34f2209 to your computer and use it in GitHub Desktop.
matrix operations in lua
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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