59 lines
1.3 KiB
Lua
59 lines
1.3 KiB
Lua
local utils = require "lib/utils"
|
|
|
|
--- @class Grid
|
|
local Grid = {}
|
|
Grid.__index = Grid
|
|
|
|
--- Создать пустую сетку width x height, заполненную initial (по умолчанию nil)
|
|
function Grid.new(width, height, initial)
|
|
local g = utils.generateList(width, function()
|
|
return utils.generateList(height, function()
|
|
return initial
|
|
end)
|
|
end)
|
|
return setmetatable(g, Grid)
|
|
end
|
|
|
|
--- @param x integer
|
|
--- @param y integer
|
|
function Grid:get(x, y)
|
|
local col = self[x]
|
|
return col and col[y] or nil
|
|
end
|
|
|
|
--- @param x integer
|
|
--- @param y integer
|
|
function Grid:set(x, y, value)
|
|
self[x][y] = value
|
|
end
|
|
|
|
--- @param x integer
|
|
--- @param y integer
|
|
function Grid:clear(x, y)
|
|
self[x][y] = nil
|
|
end
|
|
|
|
-- нормализуем прямоугольник (поддержка отрицательных размеров)
|
|
local function normalizeRect(x, y, w, h)
|
|
if w < 0 then
|
|
x = x + w + 1; w = -w
|
|
end
|
|
if h < 0 then
|
|
y = y + h + 1; h = -h
|
|
end
|
|
return x, y, w, h
|
|
end
|
|
|
|
--- Заполнить прямоугольник значением value
|
|
function Grid:fillRect(x, y, w, h, value)
|
|
x, y, w, h = normalizeRect(x, y, w, h)
|
|
local x2, y2 = x + w - 1, y + h - 1
|
|
for yy = y, y2 do
|
|
for xx = x, x2 do
|
|
self[xx][yy] = value
|
|
end
|
|
end
|
|
end
|
|
|
|
return Grid
|