多边形围点
多边形围点
方法一
@JvmStaticfun contains(loc: Location, locs: List): Boolean { val count = locs.size if (count <= 2) { return false } var nCross = 0 for (i in 0 until count) { val p1 = locs[i] val p2 = locs[(i + 1) % count] if (p1.latitude == p2.latitude) // p1p2 与 y=p0.y平行 continue if (loc.latitude = Math.max(p1.latitude, p2.latitude)) // 交点在p1p2延长线上 continue val x = (loc.latitude - p1.latitude) * (p2.longitude - p1.longitude) / (p2.latitude - p1.latitude) + p1.longitude if (x > loc.longitude) nCross++ } return nCross % 2 == 1 }
参考:https://blog.csdn.net/wangwangbinbin/article/details/6637159
方法二
@JvmStatic fun contains(loc: Location, locs: List): Boolean { val count = locs.size if (count <= 2) { return false } var hits = 0 var lastX = locs[count - 1].longitude var lastY = locs[count - 1].latitude var curX: Double var curY: Double var leftX: Double var test1: Double var test2: Double var i = 0 while (i < count) { curX = locs[i].longitude curY = locs[i].latitude if (curY == lastY) { lastX = curX lastY = curY i++ continue } if (curX = lastX) { lastX = curX lastY = curY i++ continue } leftX = curX } else { if (loc.longitude >= curX) { lastX = curX lastY = curY i++ continue } leftX = lastX } if (curY < lastY) { if (loc.latitude = lastY) { lastX = curX lastY = curY i++ continue } if (loc.longitude < leftX) { hits++ lastX = curX lastY = curY i++ continue } test1 = loc.longitude - curX test2 = loc.latitude - curY } else { if (loc.latitude = curY) { lastX = curX lastY = curY i++ continue } if (loc.longitude < leftX) { hits++ lastX = curX lastY = curY i++ continue } test1 = loc.longitude - lastX test2 = loc.latitude - lastY } if (test1 < test2 / (lastY - curY) * (lastX - curX)) { hits++ } lastX = curX lastY = curY i++ } return hits and 1 != 0 }
注:参考java/awt/Polygon.java