首页 > 其他分享 >JS实现判断点是否在多边形范围内

JS实现判断点是否在多边形范围内

时间:2023-10-11 11:47:03浏览次数:35  
标签:p2 p3 判断 多边形 polygon p4 JS p1

JS实现判断点是否在多边形范围内

 

一、说明

在GIS领域,判断点是否在多边形范围内是一个基础方法,这里主要说下实现原理。

原理比较简单,就是有一个GIS理论,一个点向一个方向发送射线,射线与多边形各个边相交的交点如果是奇数说明点在多边形范围内。

 

(图片引用自:https://blog.csdn.net/qq_27161673/article/details/52973866)

 

二、实现代码

所以实现代码就很清晰了,随便一个点向右侧创建射线,为啥是右侧呢,因为横线可以保持y不变,这种情况最简单更好理解。实现代码如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48     //判断点是否在多边形范围内     function queryPtInPolygon(point, polygon) {         var p1, p2, p3, p4;           p1 = point;         p2 = { x: 1000000000000, 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++;         }           return (count % 2 == 0) ? false true;           //判断两条线段是否相交         function checkCross(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;           }           //计算向量叉乘         function crossMul(v1, v2) {             return v1.x * v2.y - v1.y * v2.x;         }     } }

使用示例

1 2 3 4 var point={x:10,y:10}; var polygon=[{x:0,y:0},{x:100,y:0},{x:100,y:100},{x:0,y:100},{x:0,y:0}];       var pts=queryPtInPolygon(points,polygon); //pts即为和多边形交叉的点集合,判断为奇数说明在多边形范围内

  

测试用例下载地址:https://download.csdn.net/download/jiangfei200809/9213835

标签:p2,p3,判断,多边形,polygon,p4,JS,p1
From: https://www.cnblogs.com/sexintercourse/p/17756696.html

相关文章

  • fiddler 使用自动相应 替换js
    fiddler使用自动相应替换js   ......
  • vite.config.js base 与 vue-router base
    vite.config.jsbase决定了打包后,资源引用的前缀base:'/hlw/'linkref='/hlw/assets'打包后的dist要放到/hlw路径下base的值与process.env.BASE_URL、import.meta.env.BASE_URL一致vuerouter的base决定了,多页面的访问路径当vite.config.js与router中的base......
  • php教程:变量、数据类型、运算符、数据结构、条件判断、循环、函数和面向对象
    变量<?php$x=5;$y=6;$z=$x+$y;echo$z;?>变量作用域全局变量在所有函数外部定义的变量,拥有全局作用域。要在一个函数中访问一个全局变量,需要使用global关键字。<?php$x=5;$y=10;functionmyTest(){global$x,$y;$y=$x+$y;}myTest();echo$y;//输出1......
  • 判断整数和复数的奇技淫巧
      记得大一学Python的时候,有一个题目是判断一个数是否是复数。当时觉得比较复杂不好写,就琢磨了一个偷懒的好办法,用异常处理的手段便可以大大程度帮助你简短代码(偷懒)。以下是判断整数和复数的两段小代码:  相信看到这里,你也有所顿悟,能拓展出更多有意思的方法~......
  • 使用jquery的html()判断Table元素为空时的bug
    在使用jquery的html()函数判断接点为空时从服务器端取数据,不为空时则不再取数据,这样减少与服务器的交互。使用元素<divid="test"></div>使用if(!$("#test").html())判断没有问题使用<tableid="test"></table>时出现问题,判断时总不为空,用alert($("#t......
  • jquery.form.js与file文件域、document.domain有冲突
    jquery.form.js的ajaxForm、ajaxSubmit方法无法成功执行回调函数:1.用response.getWriter().out()给客户端打印数据与<scripttype="text/javascript">document.domain="XXX.com";</script>使用jquery.form.js的ajaxForm、ajaxSubmit方法,......
  • struts2+hibernate+spring+jquery返回json List列表
    1.引入包:struts2-json-plugin-2.1.8.1.jarjson-lib-2.1.jarcommons-collections-3.2.1.jarcommons-beanutils-1.8.2.jarcommons-lang-2.4.jarezmorph-1.0.6.jar,其他的包略,这几个包是返回json形式的数据必须的2.<packagename="default"extends="js......
  • threejs CSS2DObject点击事件触发不了
    原因:在three.js  0.13X版本后,上面dom的onclick不会触发,原因是控制器Controls,可以尝试一下去掉控制器,看看dom上的点击事件是否ok letobtControls=newOrbitControls(camera,container); // OrbitControls对页面的事件进行监听,并且阻止穿透 ......
  • Jackson--FastJson--XStream--代码执行&&反序列化
    Jackson--FastJson--XStream--代码执行&&反序列化Jackson代码执行(CVE-2020-8840)影响范围2.0.0<=FasterXMLjackson-databindVersion<=2.9.10.2不受影响版本FasterXMLjackson-databind=2.8.11.5FasterXMLjackson-databind=2.9.10.3漏洞利用POC:Stringjson......
  • 在shell脚本的解析简单的json封装数据
    !/bin/bash执行curl请求并保存结果response=$(curl-shttp://10.190.107.156:8090/odsDown/rySyncUsserAndDept)response的json格式=使用awk解析数据并获取code字段的值code=$(echo$response|awk-F'"code":''{print$2}'|awk-F'[,}]''{pri......