/// <summary>
/// 射线法,判断一个坐标点是否在多边形区域内
/// </summary>
/// <param name="p"></param>
/// <param name="poly"></param>
/// <returns></returns>
public string rayCasting(PointF p, PointF[] poly)
{
var px = p.X;
var py = p.Y;
var flag = false;
int l = poly.Length;
int j = l - 1;
for (var i = 0; i < l; i++)
{
var sx = poly[i].X;
var sy = poly[i].Y;
var tx = poly[j].X;
var ty = poly[j].Y;
// 点与多边形顶点重合
if ((sx == px && sy == py) || (tx == px && ty == py))
{
return "on";
}
// 判断线段两端点是否在射线两侧
if ((sy < py && ty >= py) || (sy >= py && ty < py))
{
// 线段上与射线 Y 坐标相同的点的 X 坐标
var x = sx + (py - sy) * (tx - sx) / (ty - sy);
// 点在多边形的边上
if (x == px)
{
return "on";
}
// 射线穿过多边形的边界
if (x > px)
{
flag = !flag;
}
}
j = i;
}
// 射线穿过多边形边界的次数为奇数时点在多边形内
return flag ? "in" : "out";
}