以前上学就学过,现在工作又遇到了,拿出来复习一下(看的很老的博客讲的都比较细了,不知道最近又有没有新方法)

  1. 引射线法:从被判断的点发射一条射线,与多边形有奇数个交点则在多边形内
  2. 面积和法:从多边形一顶点出发,计算被判断的点和相邻两点组成的三角形的面积和(可用 1/2 * 向量叉乘求),面积和与多边形面积相等则在多边形内
  3. 夹角和法:从多边形一顶点出发,计算被判断的点和多边形相邻两顶点的夹角和(可用向量点积推出的夹角公式求),夹角和为 360 则在多边形内部
  4. 遮罩法:生成多边形的位图(多边形内部区域置为指定的颜色),找出将被判断点处位图的颜色,为指定的颜色则在内部

这几种方法除了遮罩法别的在判断凹多边形都得注意下细节,比如:

  • 夹角和法的射线正好卡在拐角处。
  • 面积和法、夹角和法顺时针为加,逆时针为减(要是都按加算的话肯定会算多了。。)

JS 使用引射线法实现

已经有大神写出来了:substack/point-in-polygon: determine if a point is inside a polygon

/**
* 判断点与多边形位置关系
* @param {Array<number>} point 待判断的点
* @param {Array<Array<number>>} vs 多边形点数组
* @return {bool} 是否在内部
*/
function inside(point, vs){
// ray-casting algorithm based on
// http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html var x = point[0], y = point[1]; var inside = false;
// 依次遍历多边形的每个边
for (var i = 0, j = vs.length - 1; i < vs.length; j = i++) {
var xi = vs[i][0], yi = vs[i][1];
var xj = vs[j][0], yj = vs[j][1]; var intersect =
((yi > y) != (yj > y)) // 判断该点纵坐标是否在线段最高点和最低点之间[注1]
&& (x < (xj - xi) * (y - yi) / (yj - yi) + xi); // 判断该点向x轴正方向发出的射线是否穿过线段[注2] if (intersect) inside = !inside;
} return inside;
} inside([0.5,2.5], [[1,1], [2,2], [1,3]])// false
inside([1.5,2], [[1,1], [2,2], [1,3]])// true // 在边上的点又是什么情况?
inside([1.5,1.5], [[1,1], [2,2], [1,3]])// false
inside([1,2], [[1,1], [2,2], [1,3]])// true

注 1:判断该点纵坐标是否在线段最高点和最低点之间

这里有 5 种情况:

      false (F!=F)

------false (F!=F)-------yi

      true  (T!=F)

------true  (T!=F)-------yj

      false (T!=T)

注 2:判断该点向 x 轴正方向发出的射线是否穿过线段

  1. 计算改点平行于 X 轴的直线与该线段所在直线的交点的横坐标:(xj - xi) * (y - yi) / (yj - yi) + xi
  2. 判断该点横坐标是否小于交点的横坐标与孰大孰小:x < 交点的横坐标

C# 实现

// 上面说的都没用到 =_=,C# 自带一个检测的方法

/* 说明:
* 1. 虽然地球是圆的但中国坐标都是正的这么处理也没毛病
*
* 2. 经纬度一般小数点前3位后6位一共9位
*
* PointF(float):32位,1位符号,8位指数,23位尾数。
* 2^23 = 8,388,608 精度6-7位
* float不够用
*
* Point(int):32位,1位符号,31位数
* 2^31 = 2,147,483,648 精度9-10位
* int够用,但经测试只能乘100000,精确到小数点后5位(米级)
* 乘1000000,精确到小数点后6位(分米级)时会全返回False,可能内部计算时越界了
*
* 计算时全是按双精度算的够用
*/ // 创建多边形区域
GraphicsPath gp = new GraphicsPath();
Region region = new Region();
gp.Reset();
gp.AddPolygon(new Point[]{
new Point((int)(28.87243083439048 * 100000.0), (int)(106.83294296264648 * 100000.0)),
new Point((int)(28.87243083439048 * 100000.0), (int)(106.84285640716554 * 100000.0)),
new Point((int)(28.880735867389312 * 100000.0), (int)(106.84285640716554 * 100000.0)),
new Point((int)(28.880735867389312 * 100000.0), (int)(106.83294296264648 * 100000.0)),
new Point((int)(28.87243083439048 * 100000.0), (int)(106.83294296264648 * 100000.0))
});
region.MakeEmpty();
region.Union(gp); //判断点是否在多边形区域里
bool result1 = region.IsVisible(new Point((int)(28.87243083439048 * 100000.0), (int)(106.83294296264648 * 100000.0)));
bool result2 = region.IsVisible(new Point((int)(39.904030 * 100000.0), (int)(116.407526 * 100000.0)));
Console.WriteLine(result1.ToString());
Console.WriteLine(result2.ToString());
Console.ReadLine();

Windows-添加环境变量(path)的更多相关文章

  1. 向windows添加环境变量

    以NASM为例,软件安装完毕后,启动Windows操作系统的命令窗口,在安装目录(比如C:\Program Files\NASM)下运行nasm是ok的,但是在其他任意目录下运行nasm就会报错. 这 ...

  2. windows 利用环境变量%PATH%中目录可写提权

    使用PowerUp的时候有时候会有这种结果 [*] Checking %PATH% for potentially hijackable DLL locations... Permissions : ...

  3. 如何在cmd命令行中查看、修改、删除与添加环境变量,语法格式例子:set path;echo %APPDATA%

    如何在cmd命令行中查看.修改.删除与添加环境变量 首先明确一点: 所有的在cmd命令行下对环境变量的修改只对当前窗口有效,不是永久性的修改.也就是说当关闭此cmd命令行窗口后,将不再起作用.永久性修 ...

  4. 超详细windows安装mongo数据库、注册为服务并添加环境变量

    1.官网下载zip安装包 官网地址https://www.mongodb.com/download-center/community?jmp=nav,现在windows系统一般都是64位的,选好版本. ...

  5. 使用setx 命令添加环境变量(Windows)

    背景 用GUI的方法可能添加环境变量可能会比较麻烦,为此可采用命令行操作的方式. 步骤 以管理员身份运行 cmd 输入 setx /M "%path%" "%path%[ ...

  6. Linux系统下修改环境变量PATH路径的三种方法

    这里介绍Linux的知识,比如把/etc/apache/bin目录添加到PATH中有三种方法,看完之后你将学会Linux系统下如何修改环境变量PATH路径,需要的朋友可以参考下 电脑中必不可少的就是操 ...

  7. Java环境变量PATH和CLASSPATH

    Java开发中常用到环境变量的配置,下面简单介绍下Java中经常配置的环境变量:PATH和CLASSPATH. 1.PATH环境变量 1.1 作用简介 安装完JDK(Java Development ...

  8. windows修改环境变量

    windows的环境变量有两套: 系统的 当前用户的 不同的用户可以拥有不同的环境变量,当前用户的环境变量优先级比系统的环境变量优先级高,PATH环境变量比较特殊,它不是替换而是拼接. 在命令行下也可 ...

  9. windows 配置环境变量快捷方式

    在 Windows 设置环境变量 在环境变量中添加软件A的目录: 在命令提示框中(cmd) : 输入 path %path%;C:\A, 按下"Enter". 注意: C:\A是软 ...

  10. sort、dirname、添加环境变量、修改主机名、别名IP、静态路由

    1.split-按照指定行数或大小分割文件 -l:指定行数 -a:指定文件后缀长度 -d:使用数字作为后缀 -b:指定大小 # 以10行为单位对文件进行分割 split -l 10 /etc/init ...

随机推荐

  1. SharePoint 2013中PerformancePoint仪表板设计器连接Analysis Services 2012的问题

    在SharePoint 2013的PerformancePoint仪表板设计器在创建链接到AnalysisServices 2012的数据链接的时候,数据库列表无法获取服务器上的数据库.这个问题挺让人 ...

  2. Java学习之多线程(定义)

    进程:正在运行中的程序线程:负责执行程序的控制单元(执行路径)一个进程中可以有多个执行路径,称之为多线程一个进程中至少要有一个线程 创建新执行线程有两种方式 一.继承Thread类步骤:1.定义一个类 ...

  3. Note1

    1.关于数据库主从备份与读写分离 主服务器数据库的每次操作都会记录在二进制日志文件mysql-bin.xxx中.从服务器的I/O线程使用专用帐号登陆到主服务器中读取该二进制文件,并将文件内容写入到自己 ...

  4. https中引用http

    https里引用http不安全,会报错 解决方案 1.可以部署在http中,http中引用https不会存在安全问题报错 2.https中引用https,把需要引用的http部署成https

  5. CentOS 7下升级python版本到3.X

    由于python官方已宣布2.x系列即将停止支持,为了向前看,我们升级系统的python版本为3.x系列服务器系统为当前最新的CentOS 7.4 1.安装前查看当前系统下的python版本号 # p ...

  6. vue动态组件 互相之间传输数据 和指令的定义

    地址:https://blog.csdn.net/zhanghuanhuan1/article/details/77882595 地址:https://www.cnblogs.com/xiaohuoc ...

  7. Mac os x安装IDEAL及配置JDK和Maven

    此文章是在已安装好IDEAL前提下进行配置jdk和maven的操作文档. 1. 下载并配置JDK及Maven Mac下载并配置JDK方法: 详见Mac安装JDK和JMeter5-安装JDK Mac下载 ...

  8. 分布式ID的雪花算法及坑

    分布式ID生成是目前系统的常见刚需,其中以Twitter的雪花算法(Snowflake)比较知名,有Java等各种语言的版本及各种改进版本,能生成满足分布式ID,返回ID为Long长整数 但是这里有一 ...

  9. asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密。

    原文:asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密. GitHub demo https://github.com/zhanglilong23/Asp.NetCore. ...

  10. firmware

    路由器固件分析题,首先要安装firmware-mod-kit 安装命令: linux> sudo apt-get install git build-essential zlib1g-dev l ...