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