For sake of this question I will refer to all grid indices, vertexes, or others as points. So (1, 1) is a point on the grid, as an example.
I am looking to find the least largest total-sized index in a grid. In this case (1, 1) would total out to 2, (2, 1) would total out to be 3 and the same goes for (1, 2).
Expected Results:
{ X = 1, Y = 1 }
{ X = 2, Y = 1 }
{ X = 1, Y = 2 }
{ X = 2, Y = 2 }
{ X = 3, Y = 1 }
{ X = 3, Y = 2 }
{ X = 1, Y = 3 }
{ X = 2, Y = 3 }
{ X = 3, Y = 3 }
Actual Results:
{ X = 1, Y = 1 }
{ X = 2, Y = 1 }
{ X = 1, Y = 2 }
{ X = 2, Y = 2 }
{ X = 3, Y = 2 }
{ X = 2, Y = 3 }
{ X = 3, Y = 3 }
{ X = 4, Y = 3 }
{ X = 3, Y = 4 }
Code:
local chunks = {}
local previous = {
X = 0,
Y = 0
}
local largest = {
X = 0,
Y = 0
}
local function addScene()
local new = {
X = (previous.X > previous.Y and previous.Y) or previous.X + 1,
Y = (previous.X > previous.Y and previous.X) or previous.Y
}
if new.X == 0 then
new.X = 1
end
if new.Y == 0 then
new.Y = 1
end
largest.X = math.max(largest.X, new.X)
largest.Y = math.max(largest.Y, new.Y)
previous.X = new.X
previous.Y = new.Y
table.insert(chunks, new)
return new
end
for i = 1, 3*3, 1 do
local scene = addScene()
print(i, "(" .. tostring(scene.X) .. ", " .. tostring(scene.Y) .. ")" .. "\n")
end
This code, as shown above, gets pretty close to what I'd like it to do but only up to a point and this must be scalable across larger, and larger, grids.
Although, most likely, inefficient this does end up giving close to desired result. You could simply reorganize the table to get it exactly like I showed in the question anyways.
local MAX_SIZE = {
X = 3,
Y = 3
}
local chunks = {}
local previous = {
X = 0,
Y = 0
}
local function addScene()
local least = MAX_SIZE.X + MAX_SIZE.Y
local new = {
X = 0,
Y = 0
}
for x = MAX_SIZE.X, 1, -1 do
for y = MAX_SIZE.Y, 1, -1 do
if chunks[tostring(x) .. '-' .. tostring(y)] then
break
end
if x ~= 0 and y ~= 0 and x + y <= least then
least = x + y
new.X = x
new.Y = y
end
end
end
if new.X == 0 then
new.X = 1
end
if new.Y == 0 then
new.Y = 1
end
previous.X = new.X
previous.Y = new.Y
chunks[tostring(new.X) .. '-' .. tostring(new.Y)] = new
return new
end
for i = 1, 3*3, 1 do
local scene = addScene()
print(i, "(" .. tostring(scene.X) .. ", " .. tostring(scene.Y) .. ")" .. "\n")
end
Results:
1 (1, 1)
2 (1, 2)
3 (2, 1)
4 (1, 3)
5 (2, 2)
6 (3, 1)
7 (2, 3)
8 (3, 2)
9 (3, 3)