PointInConcavePolygon
A function returning True if the given point is inside the given polygon.
function pointInPolygon(pgon, tx, ty) if (#pgon < 6) then return false end local x1 = pgon[#pgon - 1] local y1 = pgon[#pgon] local cur_quad = getQuad(tx,ty,x1,y1) local next_quad local total = 0 local i for i = 1,#pgon,2 do local x2 = pgon[i] local y2 = pgon[i+1] next_quad = getQuad(tx,ty,x2,y2) local diff = next_quad - cur_quad if (diff == 2) or (diff == -2) then if (x2 - (((y2 - ty) * (x1 - x2)) / (y1 - y2))) < tx then diff = -diff end elseif diff == 3 then diff = -1 elseif diff == -3 then diff = 1 end total = total + diff cur_quad = next_quad x1 = x2 y1 = y2 end return (math.abs(total)==4) end function getQuad(axis_x,axis_y,vert_x,vert_y) if vert_x < axis_x then if vert_y < axis_y then return 1 else return 4 end else if vert_y < axis_y then return 2 else return 3 end end end
Sample:
function love.load() poly = {69,119,371,39,724,140,751,491,572,222,420,163,283,232,236,338,399,401,540,446,371,508,195,503,96,327} color = {255,255,255} end function love.update(dt) if pointInPolygon(poly, love.mouse.getX(), love.mouse.getY()) then color = {0,255,0} else color = {255,255,255} end end function love.draw() if #poly >= 6 then love.graphics.setColor(color) love.graphics.polygon("line",poly) end end -- Add functions pointInPolygon and getQuad here