我想解决的问题如下:
In a 2-D space, Given a grid size and a rectangle, calculate the grid cells
occupied (partially or totally) by the rectangle.
“网格大小”我的意思是:“16x16网格”或“32x32网格”。所有网格都以坐标原点(0,0)为中心。
矩形由4个浮点数定义:左,顶,宽和高。
此操作的结果始终为矩形。我想返回左上角单元格的坐标(即0,0),然后返回右边和下边的retangle所占的单元格数(有点像宽度和高度,但对于单元格而言)
到目前为止,我已经能够编写一个主要运行的算法。它首先做的是计算单个点位于网格中的单元格坐标。然后,给定矩形,我计算它的左上角和右下角在网格上的位置,然后它是一个简单的减法:
-- given a world coordinate, return the coordinates of the cell that would contain it
local function _toGrid(wx, wy)
return math.floor(wx / __cellSize), math.floor(wy / __cellSize)
end
-- given a box in world coordinates, return a box in grid coordinates that contains it
-- returns the x,y coordinates of the top-left cell, the number of cells to the right and the number of cells down.
local function _toGridBox(l, t, w, h)
local gl,gt = _toGrid(l, t) -- top left grid corner
local gr,gb = _toGrid(l+w, t+h) -- bottom-right grid corner
return gl, gt, gr-gl+1, gb-gt+1 -- return top,left,cells to the right, cells to bottom
end
注意:
在16x16网格中,0,0上的矩形,width
= 10且height
= 20,gr
将为0且gt
为1,因此{ {1}}将返回0,0,1,2(0,0单元格上的1行,2列)。
当矩形从内部“触摸”(未穿过)一个单元格的下侧或右侧时,会出现问题。在这种情况下,_toGrid
会返回“比我想要的更多一个单元格”。
例如,如果我将前一个矩形向左移动6个像素(因此它在10,0上),它将“触摸”其包含网格的左侧边框,从0到16。然后_toGrid
将为1,返回的数据将为0,0,2,2。
如果可能的话,我想避免这种情况。对于从左边“16”的矩形,我希望它保留在第一个网格单元格上。我希望它一旦超过16就开始“占据下一个单元格” - 例如当它在16.00000001时。
另外,请注意,这仅适用于右侧和底侧。左侧和上侧按我的要求工作。例如, left 坐标为16的矩形应出现在“右边的第二个单元格”上,而不是第一个。
我确信解决方案并不复杂,但我现在已经考虑了一段时间了,我似乎没有找到它。任何帮助将不胜感激。
答案 0 :(得分:4)
对于底部和右侧,您需要使用ceil
而不是floor
。我不知道任何Lua,所以这可能在语法上不正确,但你会想要这些内容:
local function _toGridBox(l, t, w, h)
local gl = math.floor(l / _cellSize)
local gt = math.floor(t / _cellSize)
local gr = math.ceil((l+w) / _cellSize)
local gb = math.ceil((t+h) / _cellSize)
return gl, gt, gr-gl, gb-gt -- return top,left,cells to the right, cells to bottom
end
基本上,你的问题是函数_toGrid
是一个错误的抽象,因为它始终使用floor
。显然,你把自己锁定在使用抽象,这使得很难找到正确的答案。