Определяем находится ли точка внутри полигона
На этот раз решил поделиться крайне полезной фукцией, которая работает для выпуклых и невыпуклых полигонов, определение производится методом трапеций.
public static function IsPointInsidePolygon(checked:Array<Point>, p:Point):Bool { var i1:Int, i2:Int, flag:Bool=false; var S:Float, S1:Float, S2:Float, S3:Float; for (n in 0...checked.length) { i1 = n < (checked.length - 1) ? n + 1 : 0; while (!flag) { i2 = i1 + 1; if (i2 >= checked.length) i2 = 0; if (i2 == (n < (checked.length - 1) ? n + 1 : 0)) break; S = (Math.abs(checked[i1].x * (checked[i2].y - checked[n].y) + checked[i2].x * (checked[n].y - checked[i1].y) + checked[n].x * (checked[i1].y - checked[i2].y))); S1 = (Math.abs(checked[i1].x * (checked[i1].y - p.y) + checked[i2].x * (p.y - checked[i1].y) + p.x * (checked[i1].y - checked[i2].y))); S2 = (Math.abs(checked[n].x * (checked[i2].y - p.y) + checked[i2].x * (p.y - checked[n].y) + p.x * (checked[n].y - checked[i2].y))); S3 = (Math.abs(checked[i1].x * (checked[n].y - p.y) + checked[n].x * (p.y - checked[i1].y) + p.x * (checked[i1].y - checked[n].y))); if (cast(S,Int) == cast((S1 + S2 + S3),Int)) { flag = true; break; } i1 = i1 + 1; if (i1 >= checked.length) i1 = 0; } if (flag == false) break; } return flag; }














