Function PointInPoly( point_x:Float, point_y:Float, xy:Float[] )
If xy.length<6 Or (xy.length&1) Return False
Local x1:Float=xy[xy.Length-2]
Local y1:Float=xy[xy.Length-1]
Local cur_quad:Int=GetQuad(point_x,point_y,x1,y1)
Local next_quad:Int
Local total:Int
For Local i=0 Until Len xy Step 2
Local x2:Float=xy[i]
Local y2:Float=xy[i+1]
next_quad=GetQuad(point_x,point_y,x2,y2)
Local diff:Int=next_quad-cur_quad
Select diff
Case 2,-2
If ( x2 - ( ((y2 - point_y) * (x1 - x2)) / (y1 - y2) ) )<point_x
diff=-diff
EndIf
Case 3
diff=-1
Case -3
diff=1
End Select
total:+diff
cur_quad=next_quad
x1=x2
y1=y2
Next
If Abs(total)=4 Then Return True Else Return False
EndFunction
Function GetQuad(axis_x:Float,axis_y:Float,vert_x:Float,vert_y:Float)
If vert_x<axis_x
If vert_y<axis_y
Return 1
Else
Return 4
EndIf
Else
If vert_y<axis_y
Return 2
Else
Return 3
EndIf
EndIf
EndFunction