多边形围点
方法一
@JvmStatic
fun contains(loc: Location, locs: List<Location>): 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.min(p1.latitude, p2.latitude)) // 交点在p1p2延长线上
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<Location>): 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) {
if (loc.longitude >= 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 < curY || 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 < lastY || 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