zoukankan      html  css  js  c++  java
  • 点与不规则图形关系判断

     1 <html>  
     2 <head>  
     3 <meta http-equiv="Content-Type" content="text/html; charset=gbk">  
     4 <title>img usemap属性</title>  
     5 </head>
     6 <script>
     7 
     8 function isPointInLine(point,linePoint1,linePoint2)
     9 {
    10     //是否一个点向x轴的射线穿透线段,有交点
    11     var maxY=(linePoint1.y>linePoint2.y)?linePoint1.y:linePoint2.y;
    12     var minY=(linePoint1.y<linePoint2.y)?linePoint1.y:linePoint2.y;
    13     //alert("maxY" + maxY);
    14     //alert("minY = " + minY);
    15     var re=false;
    16     if(point.y<maxY && point.y>=minY)
    17     {
    18         a1 = point.x;
    19         a2 = (linePoint2.x-linePoint1.x)*(point.y-linePoint1.y)/(linePoint2.y-linePoint1.y);
    20         //alert(a1);
    21         //alert(a2);
    22         //alert(a1 <= a2);
    23         if(parseFloat(point.x) <= parseFloat(( linePoint1.x+(linePoint2.x-linePoint1.x)*(point.y-linePoint1.y)/(linePoint2.y-linePoint1.y) )) )
    24         {
    25         re=true;
    26         }
    27     }
    28     //alert("point :" + point.x + ":" + point.y + ";")
    29     //alert("linePoint1 :" + linePoint1.x + ":" + linePoint1.y + ";")
    30     //alert("linePoint2 :" + linePoint2.x + ":" + linePoint2.y + ";")
    31     //alert(re);
    32     return(re);
    33 }
    34 
    35 function isPointInPolygon(point,poly)
    36 {
    37     //是否点在多边形里 
    38     var crossNum=0;
    39     var re=true;
    40     for(var i=0;i<poly.length-1;i++)
    41     {
    42         if(isPointInLine(point,poly[i],poly[i+1]))
    43         {
    44             crossNum++;
    45         }
    46     }
    47     
    48     if((crossNum % 2)==0)
    49     {
    50         re=false;
    51     }
    52     
    53     return(re);
    54 }
    55 
    56 function clickme()
    57 {
    58     var pa = document.getElementById("point").value.split(",");
    59     var p = {x:pa[0],y:pa[1]};
    60     
    61     var poa = document.getElementById("poly").value.split(",");
    62     var po = new Array();
    63     for(var i=0;i<poa.length/2;i++){
    64         po[i]={x:poa[2*i],y:poa[2*i+1]};
    65     };
    66     //for(var i=0;i<po.length;i++)
    67     //{
    68     //    alert(po[i].x);
    69     //    alert(po[i].y);
    70     //}
    71 
    72     //alert(p.x);
    73     //alert(p.y);
    74 
    75     alert(isPointInPolygon(p,po));
    76 }
    77 </script>
    78   
    79 <body>
    80     原理:从要判断的点向x轴发射一条射线,如果射线与多边形的边有偶数次相交,那么点不在多边形内;奇数次相交,那么点在多边形内(<font color="red">*此处的坐标是平面坐标</font>)
    81     <br>
    82 <input type="text" id="point" value="0.5,0.49" />点的横竖坐标,用逗号分隔
    83 <br>
    84 <input type="text" id="poly" value="0,0,0.75,0.75,1,0,1,1,0,1" />按照逆时针方向 多边形点的横竖坐标坐标0
    85 <input type="button" id="btn" value="点击我" onclick="clickme();">
    86 </body>
    87 </html>

    原理:

     从要判断的点向x轴发射一条射线,如果射线与多边形的边有偶数次相交,那么点不在多边形内;奇数次相交,那么点在多边形内
  • 相关阅读:
    ajax实现无刷新上传附件并且显示进度条的实例
    thinkphp ajax 无刷新分页效果的实现
    微信错误码详述
    eclispse修改项目项目编码
    构建高性能web之路------mysql读写分离实战
    Hibernate 的Ehache学习
    sessionStorage和localStorage
    sql中的group by 和 having 用法解析
    Hibernate DetachedCriteria实现
    JavaScript eval_r() 函数
  • 原文地址:https://www.cnblogs.com/gisblogs/p/3948954.html
Copyright © 2011-2022 走看看