如何检查点是否位于多边形内或其他形状如星形?任何具有多个顶点但它们已连接的东西。谷歌搜索后直接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
答案 0 :(得分:2)
你的代码错了。它试图实现计算水平光线穿过多边形的次数的ray casting algorithm,但是一旦发现交叉,代码就会返回。
您需要将return true
替换为底部的result = not result
和return 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 Collider或LÖVE's physics module等库(基于Box2D构建,因此比HC非常准确的方法复杂得多)。我不是他们中的任何一个的专家,但我相当确定没有它可以使用HC,尽管它设计为在LÖVE之上运行。
如果您确实希望自己解决这个问题,那么基于this SO question的polygon triangulation有很多有用的链接,包括C和JS复杂多边形对撞机实现的源代码。