# 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

Category:

- Snippets