多边形围点

多边形围点

方法一
 @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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值