判断测试点是否在不规则多边形围栏内(可适用于地图电子围栏,前端实现)

我的功能实现历程:

1.使用graham算法实现:判断点是否在正多边形围栏内(通过率100%,不足之处:无法判断点是否在不规则多边形内)

2.射线法(graham算法举一反三):判断测试点是否在不规则多边形围栏内(通过率100%)

这里只提供核心算法:

point数据结构:{x:1,y:2}

polygon数据结构:[{x:1,y:2},......]

     // 判断点是否在多边形内(射线法)
        function pointInPolygon(point, polygon) {
            const x = point.x, y = point.y;
            let inside = false;
            
            for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
                const xi = polygon[i].x, yi = polygon[i].y;
                const xj = polygon[j].x, yj = polygon[j].y;
                
                // 检查射线与边的交点
                //yi>y!==yj>y  如果测试点在边的中间则为true,否则为false
                //x<(xj-xi)*(y-yi)/(yj-yi)+xi  计算测试点与边的交点,判断测试点是否在边的左侧

                const intersect = ((yi > y) !== (yj > y))
                    && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
                if (intersect) inside = !inside;
            }
            
            return inside;
        }
        

graham算法的功能实现思路(只适用与正多边形):多边形我们可以拆成很多条边,然后依次判断这个测试点与边是否构成凸包,如果都构成凸包则可以说明点在多边形内(简单点就是测试点是否都在边的左侧或者右侧(这个左右得根据逆时针:左或者顺时针:右来判断))

射线法实现思路:测试点向右的射线与多边形相交的点的数量为奇数,则在多边形内,否则不在,这个时候可以利用graham算法中的叉积之差来判断点是否在边的左右。在左侧则射线与边相交,在右则不相交。最终得到测试点的射线与多边形相交的点数,然后就可以判断了,nice。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值