点与不规则图形关系判断

博客内容仅提及转载自https://www.cnblogs.com/gisblogs/p/3948954.html,介绍原理,但未给出具体原理内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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轴发射一条射线,如果射线与多边形的边有偶数次相交,那么点不在多边形内;奇数次相交,那么点在多边形内

转载于:https://www.cnblogs.com/gisblogs/p/3948954.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值