js 判断点是否在多边形内

射线法:


//计算向量叉乘

   var crossMul=function(v1,v2){
       return   v1.x*v2.y-v1.y*v2.x;
   }
//判断两条线段是否相交
   var checkCross=function(p1,p2,p3,p4){
       var v1={x:p1.x-p3.x,y:p1.y-p3.y},
       v2={x:p2.x-p3.x,y:p2.y-p3.y},
       v3={x:p4.x-p3.x,y:p4.y-p3.y},
       v=crossMul(v1,v3)*crossMul(v2,v3)
       v1={x:p3.x-p1.x,y:p3.y-p1.y}
       v2={x:p4.x-p1.x,y:p4.y-p1.y}
       v3={x:p2.x-p1.x,y:p2.y-p1.y}
       return (v<=0&&crossMul(v1,v3)*crossMul(v2,v3)<=0)?true:false
   }
//判断点是否在多边形内
   var  checkPP=function(point,polygon){
       var p1,p2,p3,p4
       p1=point
       p2={x:-100,y:point.y}
       var count=0
       //对每条边都和射线作对比
       for(var i=0;i<polygon.length-1;i++){
           p3=polygon[i]
           p4=polygon[i+1]
           if(checkCross(p1,p2,p3,p4)==true){
               count++
           }
       }
       p3=polygon[polygon.length-1]
       p4=polygon[0]
       if(checkCross(p1,p2,p3,p4)==true){
           count++
       }
       //  console.log(count)
       return (count%2==0)?false:true
   }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值