math - 网格中的矩形 - 我需要有关边缘情况的帮助

标签 math language-agnostic lua

我试图解决的问题如下:

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),后跟矩形向右和向下占据的单元格数量(有点像宽度和高度,但针对单元格)

到目前为止,我已经能够编写一个大部分有效的算法。它首先要做的是计算网格中单个点所在的单元格坐标。然后,给定矩形,我计算其左上角和右下角在网格上的位置,然后进行简单的减法:

-- 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

注释:

  • 源代码是Lua,但我会接受任何编程语言的解决方案,只要它们是可理解的。
  • y 坐标“增加时向下”;这就是许多屏幕系统的工作原理。我认为这对于这个问题来说并不重要,但不要对此感到困惑)。

在 16x16 网格中,0,0 上的矩形,宽度为 10,高度为 20,gr 将为 0, gt 1,因此 _toGrid 将返回 0,0,1,2(1 行,两列,在 0,0 单元格上)。

当矩形从内部“接触”(而不是交叉)一个单元格的下侧或右侧时,就会出现问题。在这种情况下,_toGrid 返回的结果比我想要的“多一个单元格”。

例如,如果我将前一个矩形向左移动 6 个像素(因此它位于 10,0),它将“触及”其包含网格的左侧边框,该网格从 0 到 16。那么gr将为1,返回的数据将为0,0,2,2。

如果可能的话,我想避免这种情况。对于“从左边”到 16 的矩形,我希望它保留在第一个网格单元上。我希望它在超过 16 时立即开始“占用下一个单元格” - 例如当它位于 16.00000001 时。

此外,请注意,这仅适用于右侧和底部。左侧和上侧按照我想要的方式工作。例如,坐标为 16 的矩形应出现在“右侧第二个单元格”上,而不是第一个单元格上。

我确信解决方案并不复杂,但我已经思考这个问题有一段时间了,但似乎没有找到。任何帮助将不胜感激。

最佳答案

对于底部和右侧,您需要使用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。显然,您将自己锁定在使用该抽象中,这使得很难得出正确的答案。

关于math - 网格中的矩形 - 我需要有关边缘情况的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11930289/

相关文章:

随机表 Corona SDK/Lua

Lua模式匹配,匹配前获取字符

Lua/使用内联函数代码初始化表,但分配值而不是函数

c++ - 模型观察矩阵 - C++、OpenGL

定位局部最大值的算法

haskell - 同态到底是什么?

language-agnostic - 捕捉可怕的蓝屏死机

language-agnostic - 错误说明指南

javascript - if/else 在函数中定义加号或减号

javascript 使用 Math.exp 获取 Math.sinh 结果