检查点是否位于多边形内部 Lua

如何检查一个点是否在多边形或其他有多个顶点但相互连接的形状(如星形)内?在谷歌搜索了两个小时后,这是我到目前为止想出的代码。它并不能按我希望的方式工作。有时它即使点不在多边形内也会返回 true。以下是代码。

function isPlayerinBounds (point, vertices)
    local len = #vertices
    local j = 0
    for i=1, len do
        if i == 1 then
            j = len -1
        end
        local result = false
        local ix, iy, jx, jy = vertices[i][1], vertices[i][2], vertices[j][1], vertices[j][2]
        local tx, ty = point[1], point[2]
        if(((iy< ty and jy>=ty) or (jy< ty and iy>=ty) and (ix<=tx or jx<=tx)) then
            j = i
            return true
        end
    end
    return false
end

它可能是这样的

点赞
用户107090
用户107090

你的代码有问题。它试图实现 射线法 来计算水平射线与多边形的交点数量,但是你的代码一旦找到一个交点就返回了。

你需要将 return true 替换为 result = not result,并在最后添加 return result

请检查你的代码是否基于 确定一个点是否在复杂多边形内部,并尝试提高代码的可靠性。

2015-07-31 11:12:33
用户7007149
用户7007149

最终为您使其工作。这与您的代码相同,只不过使用具有 .x 和 .y 属性的顶点列表,而不是 [1] 和 [2]。

local function insidePolygon(polygon, point)
    local oddNodes = false
    local j = #polygon
    for i = 1, #polygon do
        if (polygon[i].y < point.y and polygon[j].y >= point.y or polygon[j].y < point.y and polygon[i].y >= point.y) then
            if (polygon[i].x + ( point.y - polygon[i].y ) / (polygon[j].y - polygon[i].y) * (polygon[j].x - polygon[i].x) < point.x) then
                oddNodes = not oddNodes;
            end
        end
        j = i;
    end
    return oddNodes
end
2016-10-12 10:22:58
用户12968803
用户12968803
-- 由 Pedro Gimeno 编写,捐赠入公共领域
function isPointInPolygon(x, y, poly)
-- poly 是一个 Lua 列表,包含像 {x1, y1, x2, y2, ... xn, yn} 这样的对
  local x1, y1, x2, y2
  local len = #poly
  x2, y2 = poly[len - 1], poly[len]
  local wn = 0
  for idx = 1, len, 2 do
    x1, y1 = x2, y2
    x2, y2 = poly[idx], poly[idx + 1]

    if y1 > y then
      if (y2 <= y) and (x1 - x) * (y2 - y) < (x2 - x) * (y1 - y) then
        wn = wn + 1
      end
    else
      if (y2 > y) and (x1 - x) * (y2 - y) > (x2 - x) * (y1 - y) then
        wn = wn - 1
      end
    end
  end
  return wn % 2 ~= 0 -- 奇偶性规则
end
2022-07-06 20:57:28