检查点是否位于多边形lua

时间:2015-07-30 18:01:48

标签: lua

如何检查点是否位于多边形内或其他形状如星形?任何具有多个顶点但它们已连接的东西。谷歌搜索后直接2小时。这是我到目前为止提出的代码。它没有像我希望的那样工作。有时即使该点不在多边形内,它也会返回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

It can be something like this

3 个答案:

答案 0 :(得分:2)

你的代码错了。它试图实现计算水平光线穿过多边形的次数的ray casting algorithm,但是一旦发现交叉,代码就会返回。

您需要将return true替换为底部的result = not resultreturn result

检查代码似乎所基于的Determining Whether A Point Is Inside A Complex Polygon中的代码。

答案 1 :(得分:2)

终于让它为你工作了。除了使用.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

答案 2 :(得分:1)

你可能希望采取标准的方法,并强迫别人为你做。将您的物理转换为the Hardon ColliderLÖVE's physics module等库(基于Box2D构建,因此比HC非常准确的方法复杂得多)。我不是他们中的任何一个的专家,但我相当确定没有它可以使用HC,尽管它设计为在LÖVE之上运行。
如果您确实希望自己解决这个问题,那么基于this SO questionpolygon triangulation有很多有用的链接,包括C和JS复杂多边形对撞机实现的源代码。