感谢原作者,原理请看原作者的文章 http://www.html-js.com/article/1517
C#实现
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"; }