射线法,用来判断点在多边形的内外,适用于任意多边形
时间复杂度:O(n)
从该点引出一条水平射线,观察射线与多变形的交点个数.
当射线与多边形的交点个数是奇数时,P在多边形内; 偶数时,P在多边形外。

我们通常将射线设为水平向右(哪个方向都可以,只是水平容易写一点而已)


图一这种情况计两次或者不计都可
图二这种情况只计一次
图三这种情况也是计两次或者不计都可

最后,根据点数判断点P在多边形内外。

注意:点必须有顺序,顺时针或逆时针
代码:
你品,你仔细品(逃

const double EPS=1e-9;
inline int sgn(double a){ return a < -EPS ? -1 : a > EPS; }
inline int cmp(double a, double b){ return sgn(a-b); }
struct Point;
struct Line;
typedef Point Vector;
struct Point{double x,y;Point(){}Point(double a, double b):x(a),y(b){}double len(){return sqrt(x*x+y*y);}bool onSegment(Line l);int inPolygon(Point poly[]);void read(){scanf("%lf%lf",&x,&y);}Point operator+(Vector v){return {x+v.x,y+v.y};}Vector operator-(Point p){return {x-p.x,y-p.y};}double operator^(Vector v){return x*v.y-y*v.x;}//叉乘double operator*(Vector v){return x*v.x+y*v.y;}//点乘
};
bool Point::onSegment(Line l){Vector v1=l.s-*this;Vector v2=l.e-*this;return sgn(v1^v2)==0&&sgn(v1*v2)<=0;
}
int Point::inPolygon(Point poly[]){//判断点是否在多边形内,若点在多边形内返回1,在多边形外部返回0,在多边形上返回-1int wn = 0;for(int i = 1; i <= n; ++i){if(onSegment({poly[i], poly[i%n+1]})) return -1;int k = sgn((poly[i%n+1] - poly[i])^(*this - poly[i]));int d1 = sgn(poly[i].y - y);int d2 = sgn(poly[i%n+1].y - y);if(k > 0 && d1 <= 0 && d2 > 0) wn++;if(k < 0 && d2 <= 0 && d1 > 0) wn++;}return wn%2;
}

判断点在多边形内(射线法)相关推荐

  1. 判断点是否在多边形内——射线法

    1 //判断射线与也线段是否相交, 相交返回1,不相交返回0,在边上返回-1 2 int IsIntersectant( CPoint ptStart, CPoint ptEnd, CPoint pd ...

  2. php之判断点在多边形内的api

    1.判断点在多边形内的数学思想:以那个点为顶点,作任意单向射线,如果它与多边形交点个数为奇数个,那么那个点在多边形内,相关公式: <?php class AreaApi{//$area是一个多边 ...

  3. 射线法判断点在多边形内适用范围_X射线荧光光谱仪原理及主要技术指标对比...

    X荧光光谱仪主要由激发源(X射线管)和探测系统构成.其原理就是:X射线管通过产生入射X射线(一次X射线),来激发被测样品. 受激发的样品中的每一种元素会放射出二次X射线(又叫X荧光),并且不同的元素所 ...

  4. php 判断点在多边形内,PHP判断点是否在多边形区域内外

    PHP判断点是否在多边形区域内外: 根据数学知识的射线法,射线与几何多边形相交的点的个数为奇数则是在几何内部: 偶数在外部:/** * Created by PhpStorm. * function: ...

  5. 判断点在多边形内的算法(Winding Number详解)

    在计算几何中,判定点是否在多边形内,是个非常有趣的问题.通常有两种方法: 1.Crossing Number(交叉数) 它计算从点P开始的射线穿过多边形边界的次数.当"交叉数"是偶 ...

  6. 多边形碰撞检测(判断点在多边形内)

    点与规则的矩形或者等边.等腰三角形等的碰撞检测很简单,本文主要是介绍"点与多边不规则图形的碰撞检测". 如图,这个多边形已经相当复杂,包含凸和凹,该如何解决呢? 结论:使用交点数判 ...

  7. 射线法判断点在多边形内适用范围_桩基六种检测方法大汇总,适用范围大对比...

    桩基是结构的主要承重部分,其质量直接关系到结构的适用安全性及长久性.然而桩基是隐蔽工程,其质量的评价.判定必须通过专业的检测手段. 桩基工程分类繁多.一般按承载力分为摩擦桩.端承桩.摩擦端承桩.桩基检 ...

  8. [poj] 2318 TOYS || 判断点在多边形内

    原题 给出一个矩形玩具箱和其中隔板的位置,求每个玩具在第几个隔间内(保证没有在线上的玩具) 将玩具按x轴排序,记录当前隔板的编号,每次判断是否需要右移(左移)隔板(因为是有序的,所以移动次数左右不厚超 ...

  9. python射线法判断点是否在多边形内

    python3射线法判断点是否在多边形内 射线法 首先我们要先理解什么是射线法.射线法的意思是:在随机点上做一条平行于x轴的射线,方向是x轴正方向,看这条射线与多边形区域的交点个数,如果是偶数,那么这 ...

  10. POJ 1584 A Round Peg in a Ground Hole 判断凸多边形,点到线段距离,点在多边形内

    ACM博客_kuangbin POJ 1584 A Round Peg in a Ground Hole(判断凸多边形,点到线段距离,点在多边形内) A Round Peg in a Ground H ...

最新文章

  1. 《学习OpenCV》第三章习题 第3题
  2. SAP PP ECR的Profile规定了用它可以修改哪些数据对象
  3. 路由及路由器工作原理深入解析3:路由与port
  4. torch distributed 多GPU训练笔记
  5. 每天一道LeetCode-----重排链表,节点顺序是从头取一个,从尾取一个,从头取一个,从尾取一个.....
  6. 甩开镣铐的精神舞蹈:推荐长篇小说《炼狱之花》
  7. 马云卸任,张勇宣布未来五年目标:消费规模10万亿;华为发布基于5G和AI解决方案;新iPhone不支持5G 库克:市场不成熟……...
  8. ORA-06550 PLS-00172 字符串太长 超过3W 处理方式
  9. ExtJs2.0学习系列(15)--extjs换肤
  10. Android IPC机制(4)-Binder连接池
  11. 随手记_vscode怎样加命令行参数进行调试(python)
  12. 【discuzx2】如何通过工具修改ucenter创始人的管理员密码以保证通信成功?
  13. 分子系统学-多序列比对和系统进化分析教程
  14. privilege instruction error
  15. party_bid_core总结
  16. windows自带hyperv安装虚拟机ubuntu与分辨率修改
  17. python冒号排序教程
  18. Immanuel Kant and Russell
  19. 华为S9300核心交换机链路聚合配置实例
  20. 4.DQL查询数据(※重点※)

热门文章

  1. php 制作网站地图,网站地图怎么做,制作网站地图的三种实用方法
  2. 《神经网络与深度学习》- 邱锡鹏(更新)
  3. GD32F407调试SD卡FATFS文件系统
  4. 怎么解决Xshell4终端中文乱码问题
  5. 嵌入式-ADS和Proteus安装
  6. android singletask启动模式,android:Activity启动模式之singleTask(一)(示例代码)
  7. Git版本管理及使用规范
  8. vue 电子签名插件
  9. kindle刷机ttl_kindle paper white 2 (kpw) 无限重启救砖方法
  10. c语言ip地址转16进制,点分十进制形式的ip地址转化为十六进制数