python 判断点在随机多边形内_判断点是否在多边形内部-程序员宅基地

技术标签: python 判断点在随机多边形内  

如何判断一个点是否在多边形内部?

(1)面积和判别法:判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部。

(2)夹角和判别法:判断目标点与所有边的夹角和是否为360度,为360度则在多边形内部。

(3)引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。

具体做法:将测试点的Y坐标与多边形的每一个点进行比较,会得到一个测试点所在的行与多边形边的交点的列表。在下图的这个例子中有8条边与测试点所在的行相交,而有6条边没有相交。如果测试点的两边点的个数都是奇数个则该测试点在多边形内,否则在多边形外。在这个例子中测试点的左边有5个交点,右边有三个交点,它们都是奇数,所以点在多边形内。

算法图解:

关于这个算法的具体的更多图形例子:http://alienryderflex.com/polygon/

参考代码:

int pnpoly(int nvert, float *vertx, float *verty, float testx, floattesty)

{int i, j, c = 0;for (i = 0, j = nvert-1; i < nvert; j = i++)

{if ( ((verty[i]>testy) != (verty[j]>testy)) &&(testx< (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) +vertx[i]) )

c= !c;

}returnc;

}

来自一个polygon的内部实现:

public boolIsInside(PointLatLng p)

{int count =Points.Count;if(count < 3)

{return false;

}bool result = false;for(int i = 0, j = count - 1; i < count; i++)

{var p1 =Points[i];var p2 =Points[j];if(p1.Lat < p.Lat && p2.Lat >= p.Lat || p2.Lat < p.Lat && p1.Lat >=p.Lat)

{if(p1.Lng + (p.Lat - p1.Lat) / (p2.Lat - p1.Lat) * (p2.Lng - p1.Lng)

{

result= !result;

}

}

j=i;

}returnresult;

}

特殊情况:要检测的点在多变形的一条边上,射线法判断的结果是不确定的,需要特殊处理(If the test point is on the border of the polygon, this algorithm will deliver unpredictable results)。

计算一个多边形的面积(area of a polygon):

private static double SignedPolygonArea(Listpoints)

{//Add the first point to the end.

int pointsCount =points.Count;

PointLatLng[] pts= new PointLatLng[pointsCount + 1];

points.CopyTo(pts,0);

pts[pointsCount]= points[0];for (int i = 0; i < pointsCount + 1; ++i)

{

pts[i].Lat= pts[i].Lat * (System.Math.PI * 6378137 / 180);

pts[i].Lng= pts[i].Lng * (System.Math.PI * 6378137 / 180);

}//Get the areas.

double area = 0;for (int i = 0; i < pointsCount; i++)

{

area+= (pts[i + 1].Lat - pts[i].Lat) * (pts[i + 1].Lng + pts[i].Lng) / 2;

}//Return the result.

returnarea;

}///

///Get the area of a polygon///

///

///

public static double GetPolygonArea(Listpoints)

{//Return the absolute value of the signed area.//The signed area is negative if the polygon is oriented clockwise.

returnMath.Abs(SignedPolygonArea(points));

}

参考资料:

http://alienryderflex.com/polygon/

http://en.wikipedia.org/wiki/Point_in_polygon

http://www.codeproject.com/Tips/84226/Is-a-Point-inside-a-Polygon

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39760619/article/details/111511320

智能推荐

安装pyaudio的正确方法_pyaudio 安装-程序员宅基地

文章浏览阅读975次。安装pyaudio的正确方法_pyaudio 安装

开山-机器学习(1)矩阵分解-多视角数据表示的多样非负矩阵分解_多视图矩阵分解-程序员宅基地

文章浏览阅读1.7k次,点赞4次,收藏17次。欢迎来到theFlyer的博客—希望你有不一样的感悟前言:这是一篇要讲的论文,以下内容是基于个人理解写的,从简单的NMF讲到论文的多视角方法,由于之前做了PPT所以以下图片可能比较多。 论文名称 Diverse Non-Negative Matrix Factorization for Multiview Data Representation目录欢迎来到theFl..._多视图矩阵分解

Ubuntu安装uget和aria2下载工具-程序员宅基地

文章浏览阅读202次。Windows下的下载工具有迅雷,快车等。Ubuntu下也有强大的下载工具uget和aria2。一、安装。uget和aria2都可以在“软件中心”中安装,但是版本太老啦,所以最好还是在终端中添加ppa进行安装:1.uget的安装:sudo add-apt-repository ppa:plushuang-tw/uget-stable sudo apt-get update..._uget ipv6

yarn安装的包全局不能用_yarn安装的依赖安装在全局为什么不行-程序员宅基地

文章浏览阅读3.2k次。默认情况下,yarn 会将通过 yarn global方式安装的包放到C:\Users\你的用户名例如:Administrator\AppData\Local\Yarn\bin\所以请将这个目录放到 PATH 环境变量中,就可以了。_yarn安装的依赖安装在全局为什么不行

【MATLAB-app】系列教程(含视频)第9课_答疑03:如何看到appdesigner 内部(过程)的数据?_appdesigner 断点-程序员宅基地

文章浏览阅读1.6k次,点赞2次,收藏4次。创作时间:2020-01-20目录:问题汇总:1.如何看到appdesigner 内部的数据?2.如何调试appdesigner?3.如何使用dropdown组件?4.如何保存uiaxes中的图像?问题解答:1.如何看到appdesigner 内部(过程)的数据?答:1)设置断点,或者使用keyboard语句。2)将过程数据输出。详见本期视频。2.如何调试appdesigner?答:同1.详见本期视频。3.如何使用dropdown组件?【MATLAB-app】答读者问:m_appdesigner 断点

带指示箭头的下拉菜单(css)_前端箭头下拉列表css-程序员宅基地

文章浏览阅读5k次。.wrap { position: relative; background-color: white; border: 1px solid grey; width: 300px; height: 600px; } .triangle1 { display: block; position: absolute; width: _前端箭头下拉列表css

随便推点

[精品毕设]Python考务监考管理系统-程序员宅基地

文章浏览阅读19次。该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功!

UE4-(蓝图)第三十课使用动画蒙太奇_蓝图蒙太奇动画资源打点-程序员宅基地

文章浏览阅读5.6k次,点赞4次,收藏15次。一、创建蒙太奇动画1.在文件夹空白处右键创建Animation下的动画蒙太奇2.选择动画蒙太奇基于的骨骼,创建完成后命名为FppRifleFire_Montage二、编辑动画蒙太奇1.双击打开刚创建的动画蒙太奇,在编辑窗口右下角有个资源管理器,其中为所有动画,选择一个动画后拖拽到Montage栏下方空白处。(也可以放置多个片段,自己排序组合)2.设置游戏开始时 使用..._蓝图蒙太奇动画资源打点

iOS 使用AVAudio播放音乐中断处理-程序员宅基地

文章浏览阅读832次。在使用AVFoundation框架中的AVAudioPlayer播放音乐时,会出现中断的情况,比如接听电话,或者接听FaceTime,这就要通过注册通知来处理,[NSNotificationCenter defaultCenter] addobserver:self selector:@selector(handleInterruption:) name :AVAudioSess..._avaudiosession 打开其他音频不回停止播放

SSD的基础知识介绍_ssd硬件基础知识-程序员宅基地

文章浏览阅读721次。SSD测试服务器_ssd硬件基础知识

Lua 基础教程(十三)表-程序员宅基地

文章浏览阅读6次。在 Lua 中,表(Tables)是唯一可用的数据结构,可帮助我们创建不同类型的数组和字典。Lua 使用关联数组,不仅可以用数字索引,还可以用非nil的字符串索引。表大小不固定,可以根据需要动态增长。Lua 在所有的表示中都使用表,包括用表表示包。当访问 string.format 方法时,实际上是在访问字符串包中的 format 函数。

matlab 高分子 取向度 表征,高分子聚合物的取向表征 - 高分子 - 小木虫 - 学术 科研 互动社区...-程序员宅基地

文章浏览阅读1k次。用途高分子和它的链段本身具有较大的长度,因此在空间上必然指向一定的方向。当高分子链段在空间随机取向时,由概率论可知,此时分子或分子链段指向各个方向的几率是相同的。在宏观上,高分子的这种取向方式使高分子聚合物在各个方向上呈现相同的品质,即各向同性性质。高分子链段也可能沿某些方向规整地周期性排列,从而形成高分子晶体。在一些条件下,如外力,流动等,相当数量的高分子链段会平行指向同一方向,由此形成的高分子..._聚合物的取向度