【模板】计几 射线法判断点是否在简单多边形内

 1 //
 2 //线段交点个数
 3 int SegCross(Segment a,Segment b){
 4     double x1 = a.s.cross(a.e,b.s);
 5     double x2 = a.s.cross(a.e,b.e);
 6     double x3 = b.s.cross(b.e,a.s);
 7     double x4 = b.s.cross(b.e,a.e);
 8     if( b.e.OnLine(a.s,a.e) && b.s.OnSeg(a.s,a.e) ||
 9         b.s.OnLine(a.s,a.e) && b.e.OnSeg(a.s,a.e) ||
10         a.e.OnLine(b.s,b.e) && a.s.OnSeg(b.s,b.e) ||
11         a.s.OnLine(b.s,b.e) && a.e.OnSeg(b.s,b.e) )
12         return 2;
13     else if(sgn(x1*x2) <= 0 && sgn(x3*x4)<=0) return 1;
14     return 0;
15
16 }
17
18 ///判断点p0与含有n个节点的多边形的位置关系
19 //p数组是顶点集合; 射线法判断点和多边形位置关系,多边形的点要求必须是逆时针描述.
20 ///返回0:边上或顶点上,    1:外面,   -1:里面;
21 //节点从0到n-1
22 int PointInPolygon(Point p0, Point p[], int n)
23 {
24     Segment L, S;
25     Point temh,teml;
26     L.s = p0, L.e = Point(inf, p0.y);///以p0为起点的射线L;
27
28     int counts = 0;
29     p[n] = p[0];
30
31     for(int i=1; i<=n; i++)
32     {
33         S.s = p[i-1], S.e = p[i];
34
35         if(p0.OnSeg(S.s,S.e) ) return 0;
36         if(S.s.y == S.e.y) continue;///和射线平行;
37
38         if(S.s.y > S.e.y) temh = S.s,teml = S.e;
39         else temh = S.e,teml = S.s;
40
41         if(temh.OnSeg(L.s,L.e) )
42             counts ++;
43         else if(SegCross(L, S) == 1 && teml.OnSeg(L.s,L.e) == 0)
44             counts ++;
45     }
46     if(counts%2) return -1;
47     return 1;
48 }

原文地址:https://www.cnblogs.com/xiaobuxie/p/11771620.html

时间: 2024-10-29 02:13:40

【模板】计几 射线法判断点是否在简单多边形内的相关文章

matlab练习程序(射线法判断点与多边形关系)

依然是计算几何. 射线法判断点与多边形关系原理如下: 从待判断点引出一条射线,射线与多边形相交,如果交点为偶数,则点不在多边形内,如果交点为奇数,则点在多边形内. 原理虽是这样,有些细节还是要注意一下,比如射线过多边形顶点或射线与多边形其中一边重合等情况还需特别判断. 这里就不特别判断了,因为我只是熟悉原理,并不是实际运用. 好吧,我实际是太懒了,不想判断了. 结果如下: 结果图和线性分类器的组合有几分相似. matlab代码如下: clear all;close all;clc; polyn=

hlg1306再遇攻击--射线法判断点是否在多边形内部

再遇攻击 Time Limit: 1000 MS Memory Limit: 65536 K Total Submit: 313(40 users) Total Accepted: 91(32 users) Rating:  Special Judge: No Description Dota中英雄技能攻击会有一个范围,现在释放一个技能给出他的攻击范围和目标英雄的位置,问是否能攻击到.攻击范围保证是一个多边型. Input 有多组测试数据 第一行输入1个整数n, 期中n代表攻击范围是给出的n个点

判断点是否在简单多边形内常用方法

一.射线判别法:适用于所有简单多边形 简单多边形是不相邻的边不相交的多边形.判定点p是否在多边形G内部,包括边界.对于任意多边形,可以采用射线法.对于给定的点向左做一条平行x轴的射线l,求出l与多边形G的交点个数,如果个数为奇数则点在多边形内,如果交点个数为偶数则点在多边形外.具体可以归纳如下: 1.对G的水平边不做考虑 2.对l与G的顶点相交的情况,只考虑所属边纵坐标较大的顶点. 3.对于p在G边上的情况,直接判定p在G内 //0=outside ;1=inside;2=boundary in

LightOj1190 - Sleepwalking(判断点与多边形的位置关系--射线法模板)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1190 题意:给你一个多边形含有n个点:然后又m个查询,每次判断点(x, y)是否在多边形的内部; 射线法判断即可适用于任何(凸或凹)多边形;时间复杂度为O(n); 判断一个点是在多边形内部,边上还是在外部,时间复杂度为O(n):射线法可以正确用于凹多边形: 射线法是使用最广泛的算法,这是由于相比较其他算法而言,它不但可以正确使用在凹多边形上,而且不需要考虑精度误差问题.该算法思想是从

用射线法实现判断点是否在多边形内部

最近工作中遇到了这个问题,检索之后发现这种实现方式挺有意思的,无论是凸多边形还是凹多边形都可以判断. 射线法是用被测点向任意方向(通常为了好算,使其射向右侧)做一条射线,判断射线与多边形的交点.如果交点的数量为奇数,则被测点在多边形内:如果交点的数量为偶数,则被测点在多边形以外. 期间,有些特殊情况需要判断,比如: 1. 射线刚好经过凸多边形两条相邻边的交点上的情况会导致重复判断: 2.射线和多边形的边重合的情况. 先上js代码. function isDotInPolygon(point, p

枚举法判断某天是否为2015年节假日或周末

枚举法判断某天是否为2015年节假日或周末 1.节假日枚举类 /** *功能说明:节假日枚举类 * *创建人:Gansuper * *创建时间:2015-2-6 上午10:32:17 * *修改人 修改时间 修改描述 * */ public enum HolidayEnum { HOLIDAY(new String[]{"2015-01-01","2015-01-02","2015-01-03", "2015-02-18",&

POJ 3182 The Grove [DP(spfa) 射线法]

题意: 给一个地图,给定起点和一块连续图形,走一圈围住这个图形求最小步数 本来是要做课件上一道$CF$题,先做一个简化版 只要保证图形有一个点在走出的多边形内就可以了 $hzc:$动态化静态的思想,假设已经有了路线怎么判断合法 点在多边形内是“点变多边形不变”,我们反过来维护多边形变 $f[i][j][0/1]$表示当前走到$(i,j)$,点是否在多边形内 维护一条向右发出的射线,每次走的时候看看有没有穿过射线就行了 因为这是个网格,我们可以规定只有从上面经过才算穿过 然后,这不是$DAG$啊怎

Catch---hdu3478(染色法判断是否含有奇环)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3478 题意:有n个路口,m条街,一小偷某一时刻从路口 s 开始逃跑,下一时刻都跑沿着街跑到另一路口,问是否存在某一时刻出,小偷可能出现在任意路口: 如果小偷能走一个环,如果这个环是偶数个节点,那么某个节点只能在偶数时刻或者奇数时刻到达: 但是如果这个环是奇数个节点,他既可以在奇数时刻到达又可以在偶数时刻到达:所以这道题就是求是否存在一个奇环:如果存在输出YES,否则NO: 由于二分图中不能含有奇环,

模式识别之目标跟踪---最简单的目标跟踪方法--------模板匹配与相关系数法

前言 模板匹配和相关系数法是目标跟踪的经典方法,它的优点有很多:简单准确,适用面广,抗噪性好,而且计算速度快.缺点是不能适应剧烈光照变化和目标剧烈形变. 所谓模板匹配法,就是指在一帧图像内寻找目标模板的位置,和模板最像的地方就是目标了.只要把全图的所有子区域和目标模板比较一下,找到最像目标模板的子区域,它就是目标的位置.如何度量子区域和目标模板的相似程度呢?最简单的办法就是计算这二者的相关系数. 相关系数 相关系数(r)是一种数学距离,可以用来衡量两个向量的相似程度.它起源于余弦定理:cos(A