首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

平面几何:判断是否多边形

今天我们来实现判断是否多边形的算法。 需求 提供一个多边形(用点数组表示),以及一个判断这个是否多边形。 凸多边形,指的边不存在自我相交,且内角小于 180 度的多边形。...我们需要这个算法实现图形拾取,判断鼠标是否落在图形上。 思路 之前的 求两向量的夹角的文章 中我提到过,对于两个向量,我们可以利用叉积的符合右手定则,判断两个向量的位置关系。...特殊的,如果结果为 0,表示两向量同一方向上,属于边缘场景。你可以认为属于左边,或者属于右边。 我们计算凸多边形的所有边向量,和边向量起点到起点的叉乘,记为相对边的方向。...如果方向都是左边,或都是右边,则点在凸多边形,否则不在凸出变形。 特殊的,对于点在某条边上,它介于和不在凸多边形上的中间态,属于边缘情况,读者可自行定义。...如果你认为这种情况属于不在凸多边形上,直接结束循环并返回一个 false 即可。 结尾 我是前端西瓜哥,关注我,学习更多平面几何知识。

15610

平面几何:判断是否多边形(射线法)

之前我们讲解了如何利用叉乘 判断是否多边形。但该算法限制较大,多边形必须为凸多变形。 最近我的图形编辑器又新增了星形图形,然而这个星形又不是凸多边形。...于是我再基于射线法,实现一个较通用的算法,支持判断是否在任意多边形。 实现后的图形拾取效果如下。 射线法原理 这里我们用射线法来实现。 原理很简单,从引出一条射线,计算射线和多边形的交点数量。...奇数的时候,目标点刚好在 “” 的子区域中;而偶数的时候则是 “外”。 这里我们讨论的是非自交的多边形。但该算法特定的自交多边形也是适用的。...然后我们判断射线是否边的 y 范围:a.y 是否小于等于目标点的 y 值,且 b 大于目标点的 y 值。...如果 y 在线段范围,我们再判断 目标点是否边的左侧。 判断左右?是不是觉得这个问题很熟悉呢。没错,又是你,叉积。之前判断 点在凸多边形 也用到。 关于叉积,这里就不再展开讲了,说太多了。

29610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Mapinfo高阶-判断是否位于多边形

    笔者工作过程中遇到一个场景,需要批量判断是否位于某个多边形,搜索了几个算法,发现过于复杂,本身理解就有困难,编成代码就更难了。...主流算法: (1)面积和判别法:判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部。...(2)夹角和判别法:判断目标点与所有边的夹角和是否为360度,为360度则在多边形内部。 (3)引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。...至此,便得到了点和多边形汇聚后的表,如果该位于多边形,则会出现一条记录,否则,不出现。 其实,我脑海里还有一个算法,只是无法用代码实现,如果你可以用代码实现,欢迎告诉我。...另外的算法: 1、将设置为红色; 2、将多边形设置为黑色; 3、查询的颜色,黑色则说明位于多边形,红色则说明位于多边形外。

    1.8K20

    判断是否多边形的Python实现及小应用(射线法)

    判断一个是否多边形是处理空间数据时经常面对的需求,例如GIS软件中的点选功能、根据多边形边界筛选出位于多边形、求交集、筛选不在多边形等等。...判断一个是否多边形内有几种不同的思路,相应的方法有: 射线法:从判断点向某个统一方向作射线,依交点个数的奇偶判断; 转角法:按照多边形顶点逆时针顺序,根据顶点和判断点连线的方向正负(设定角度逆时针为正...射线法的原理及实现 射线法就是以判断点开始,向右(或向左)的水平方向作一射线,计算该射线与多边形每条边的交点个数,如果交点个数为奇数,则位于多边形,偶数则在多边形外。...,y1]],[[w1,t1],……[wk,tk]]] 三维数组 #可以先判断是否在外包矩形 #if not isPoiWithinBox(poi,mbr=[[0,0],[180,90...点在多边形的应用 上面第一段已经描述了一些应用场景,下面给出一个应用的例子:有一堆点数据存在csv文件里,如何检索位于某个城市的点出来,检索出来之后的分析(例如加标签、改属性、做统计还是其他)这里不讨论

    9.6K40

    计算两间的距离、点到线的距离,判断是否一个、一是否一矩形、两圆是否相交

    、点到线的距离,判断是否一个、一是否一矩形、两圆是否相交 日期:2013-06-20 */ #include #include #include...line1.a,&line1.b,&line1.c); printf("点到线的距离为:%.3lf",poinToLine(point3,line1)); printf("n"); //计算一是否一个...fflush(stdin); printf("nn计算一是否一个n"); printf("请输入的坐标:(x,y)"); scanf("%lf,%lf",&point4.x,&point4...1,反之为0:%0.lf",poinToCircle(point4,circle1)); printf("n"); //判断是否一矩形 fflush(stdin); printf("nn...判断是否一矩形n"); printf("请输入的坐标:(x,y)"); scanf("%lf,%lf",&point5.x,&point5.y); printf("请按顺时针方向输入矩形的四个顶点

    1.2K10

    php判断坐标是否指定的多边形

    如何判断一个坐标点是否一个多边形中,具体的应用场景就是,外卖派送,用户提供的坐标是否是在外卖的派送范围之内。...用户的坐标可以通过手机设备获取到,派送范围就是通过地图上,进行多边形的绘制,获取多个坐标点连接起来的配送范围。下面来看看代码上是如何简单判断的。...两个坐标做测试 $a = new Coordinate(39.916527, 116.397128); $b = new Coordinate(39.901305, 116.397128); //判断是否执行的多边形中...if ($geo->contains($a)) { echo "a点在多边形的范围"; } else { echo "a不在多边形的范围"; } echo "";...if ($geo->contains($b)) { echo "b点在多边形的范围"; } else { echo "b不在多边形的范围"; } 结果: ?

    1.5K20

    php判断坐标是否指定的多边形中「建议收藏」

    如何判断一个坐标点是否一个多边形中,具体的应用场景就是,外卖派送,用户提供的坐标是否是在外卖的派送范围之内。...用户的坐标可以通过手机设备获取到,派送范围就是通过地图上,进行多边形的绘制,获取多个坐标点连接起来的配送范围。下面来看看代码上是如何简单判断的。...两个坐标做测试 $a = new Coordinate(39.916527, 116.397128); $b = new Coordinate(39.901305, 116.397128); //判断是否执行的多边形中...if ($geo->contains($a)) { echo "a点在多边形的范围"; } else { echo "a不在多边形的范围"; } echo "";...if ($geo->contains($b)) { echo "b点在多边形的范围"; } else { echo "b不在多边形的范围"; } 结果: php开发中常用的Composer

    1.2K30

    Android如何判断一个点在不在多边形区域

    有人问我,怎么判断一个是不是多边形,本来想着把这个多边形分成一个一个三角形,如图, ?...然后判断这个是不是某个三角形中,如果在,那就肯定在这个多边形中,那问题接下来就转化成判断这个是不是在三角形中了,只要这个D和三角形的三个A、B、C组合的三角形a、b、c的面积之和等于这个三角形的面积...但是最后我发现忽略了一个问题,还有一种多边形的情况没有考虑到,那就是香蕉形的多边形,如图: ?...代码如下: /** * 功能:判断是否多边形 方法:求解通过该的水平线与多边形各边的交点 结论:单边交点为奇数,成立!...--- return (nCross % 2 == 1); } 项目下载:一个是否多边形中 以上就是本文的全部内容,希望对大家的学习有所帮助。

    94830

    判断二维平面一个是否在三角形

    判断二维平面一个是否在三角形内有三种流行的方法,本文记录相关内容。...问题描述 给定二维平面三个 A(x_1, y_1), B(x_2, y_2), C(x_3, y_3) 组成一个三角形,给定该平面 P(x,y),如何快速判断 P \Delta ABC 内部...同向法 假设点P位于三角形,会有这样一个规律,当我们沿着ABCA的方向在三条边上行走时,你会发现P始终位于边AB,BC和CA的右侧或左侧。...我们就利用这一,但是如何判断一个点在线段的左侧还是右侧呢?...重心法 三角形的三个点在同一个平面上,如果选中其中一个,其他两个不过是相对该的位移而已,比如选择A作为起点,那么B相当于AB方向移动一段距离得到,而C相当于AC方向移动一段距离得到。

    12910

    丘比特的箭(是否)- HDU 1756

    对于A是否多边形P的判定, 一般有两种方法:射线法和转角法。 这里介绍一下射线法。...射线法:从A出发作一条射线,计算这条射线与多边形P的边的交点数量N,如果N为奇数,则A多边形P,否则在P外部。...(红心为A,右边有3个,说明多边形内部) 射线法的原理:直线不可能从内部再次进入多边形,或从外部再次穿出多边形,即连续两次穿越边界的情况必然成对(大概就是这个意思,不是严格证明)。...^ (P2 - Q)) == 0 && dcmp((P1 - Q) * (P2 - Q)) <= 0; } //判断点P多边形-射线法 bool is_in_polygon(Point P, int...while (case_count--) { scanf("%lf %lf", &point.x, &point.y); //判断是否多边形里面

    94020
    领券