通过弹性搜索GeoPolygonFilter
源代码,我遇到了pointInPolygon
方法。我无法理解为什么算法有效,或者它是如何工作的。这如何确定给定(lat,lon)对位于由点定义的多边形内?
private static boolean pointInPolygon(Point[] points, double lat, double lon) {
int i;
int j = points.length - 1;
boolean inPoly = false;
for (i = 0; i < points.length; i++) {
if (points[i].lon < lon && points[j].lon >= lon
|| points[j].lon < lon && points[i].lon >= lon) {
if (points[i].lat + (lon - points[i].lon) /
(points[j].lon - points[i].lon) * (points[j].lat - points[i].lat) < lat) {
inPoly = !inPoly;
}
}
j = i;
}
return inPoly;
}
答案 0 :(得分:0)
pointInPolygon()
方法实现crossing number algorithm。如果您对此功能的完整初步讨论感兴趣,可以找到它here。
基本思想(在上面的第一个链接和here中说明)是检查从测试点开始的线在每个方向上越过多边形边界的次数。如果该点位于多边形内部,则会得到奇数个十字形,如果该点位于多边形之外,则会得到偶数个十字形。