将大神的代码照搬写了一个JAVA版本,思路很简单,将这个点往多边形内每条边引射线,最终统计交点个数,如果为奇数个,说明在多边形内,偶数个说明在多边形外
射线是无限长的,多边形是有界的,一个点射出的射线经过多边形,如果在多边形内,那么会经历:进入-离开-进入-离开-......-最终离开的过程,交点总数为偶数个,同理在多边形内的话,则会经历离开多边形然后循环可能数量的进入和离开,交点总数为奇数
public static boolean isPointInPolygons(double ALon, double ALat, List<double[]> pointList) { int iSum = 0, size; double dLon1, dLon2, dLat1, dLat2, dLon; if (pointList.size() < 3) return false; size = pointList.size(); for (int i = 0; i < size - 1; i++) { double[] aPoint = pointList.get(i); double[] bPoint = pointList.get(i + 1); if (i == size - 1) { dLon1 = aPoint[0]; dLat1 = aPoint[1]; dLon2 = pointList.get(0)[0]; dLat2 = pointList.get(0)[1]; } else { dLon1 = aPoint[0]; dLat1 = aPoint[1]; dLon2 = bPoint[0]; dLat2 = bPoint[1]; } // 以下语句判断A点是否在边的两端点的水平平行线之间,在则可能有交点,开始判断交点是否在左射线上 if (((ALat >= dLat1) && (ALat < dLat2)) || ((ALat >= dLat2) && (ALat < dLat1))) { if (Math.abs(dLat1 - dLat2) > 0) { // 得到 A点向左射线与边的交点的x坐标: dLon = dLon1 - ((dLon1 - dLon2) * (dLat1 - ALat)) / (dLat1 - dLat2); // 如果交点在A点左侧(说明是做射线与 边的交点),则射线与边的全部交点数加一: if (dLon < ALon) iSum++; } } } if (iSum % 2 != 0) { return true; } return false; }