1. 叉乘判别法(只适用于凸多边形)
想象一个凸多边形,其每一个边都将整个2D屏幕划分成为左右两边,连接每一边的第一个端点和要测试的点得到一个矢量v,将两个2维矢量扩展成3维的,然后将该边与v叉乘,判断结果3维矢量中Z分量的符号是否发生变化,进而推导出点是否处于凸多边形内外。这里要注意的是,多边形顶点究竟是左手序还是右手序,这对具体判断方式有影响。
2. 面积判别法(只适用于凸多边形)

第四点分别与三角形的两个点组成的面积分别设为S1,S2,S3,只要S1+S2+S3>原来的三角形面积就不在三角形范围中.可以使用海伦公式 。推广一下是否可以得到面向凸多边形的算法?(不确定)
3. 角度和判别法(适用于任意多边形)

double angle = 0;
realPointList::iterator iter1 = points.begin();
for (realPointList::iterator iter2 = (iter1 + 1); iter2 < points.end(); ++iter1, ++iter2)
{
   double x1 = (*iter1).x - p.x;  
   double y1 = (*iter1).y - p.y;  
   double x2 = (*iter2).x - p.x;
   double y2 = (*iter2).y - p.y;  
   angle += angle2D(x1, y1, x2, y2);
}

if (fabs(angle - span::PI2) < 0.01) return true;
else return false;

另外,可以使用bounding box来加速。
if (p.x < (*iter)->boundingBox.left ||
   p.x > (*iter)->boundingBox.right ||
   p.y < (*iter)->boundingBox.bottom ||
   p.y > (*iter)->boundingBox.top) 。。。。。。

对于多边形来说,计算bounding box非常的简单。只需要把水平和垂直方向上的最大最小值找出来就可以了。
对于三角形:第四点分别与三角形的两个点的交线组成的角度分别设为j1,j2,j3,只要j1+j2+j3>360就不在三角形范围中。
4. 水平/垂直交叉点数判别法(适用于任意多边形)

注意到如果从P作水平向左的射线的话,如果P在多边形内部,那么这条射线与多边形的交点必为奇数,如果P在多边形外部,则交点个数必为偶数(0也在内)。所以,我们可以顺序考虑多边形的每条边,求出交点的总个数。还有一些特殊情况要考虑。假如考虑边(P1,P2),
1)如果射线正好穿过P1或者P2,那么这个交点会被算作2次,处理办法是如果P的从坐标与P1,P2中较小的纵坐标相同,则直接忽略这种情况
2)如果射线水平,则射线要么与其无交点,要么有无数个,这种情况也直接忽略。
3)如果射线竖直,而P0的横坐标小于P1,P2的横坐标,则必然相交。
4)再判断相交之前,先判断P是否在边(P1,P2)的上面,如果在,则直接得出结论:P再多边形内部。

再经典不过的算法了:

// 功能:判断点是否在多边形内
// 方法:求解通过该点的水平线与多边形各边的交点
// 结论:单边交点为奇数,成立!

//参数:
// POINT p 指定的某个点
// LPPOINT ptPolygon 多边形的各个顶点坐标(首末点可以不一致)
// int nCount 多边形定点的个数

BOOL PtInPolygon (POINT p, LPPOINT ptPolygon, int nCount)
{
  int nCross = 0;

  for (int i = 0; i < nCount; i++)
  {
    POINT p1 = ptPolygon[i];
    POINT p2 = ptPolygon[(i + 1) % nCount];

    // 求解 y=p.y 与 p1p2 的交点

    if ( p1.y == p2.y ) // p1p2 与 y=p0.y平行
      continue;

    if ( p.y < min(p1.y, p2.y) ) // 交点在p1p2延长线上
      continue;
    if ( p.y >= max(p1.y, p2.y) ) // 交点在p1p2延长线上
      continue;

    // 求交点的 X 坐标 --------------------------------------------------------------
    double x = (double)(p.y - p1.y) * (double)(p2.x - p1.x) / (double)(p2.y - p1.y) + p1.x;

    if ( x > p.x )
      nCross++; // 只统计单边交点
  }

// 单边交点为偶数,点在多边形之外 ---
  return (nCross % 2 == 1);
}

转载于:https://www.cnblogs.com/mazhenyu/archive/2010/06/13/1757855.html

判断点是否处于多边形内的三种方法(转)相关推荐

  1. jQuery判断复选框是否选中的三种方法

    jQuery判断复选框是否选中的三种方法. PS:下面的代码为通过循环找到在多个复选框中被选中的复选框,并对其删除 //判断复选框是否选中的第一种方法: $.each(buttons,function ...

  2. Angular Js 判断对象不为空对象的三种方法

    前言 在写前端时,很多时候都需要去校验后端返回的数据是否是个空对象.这里就介绍三种方法 第一种 //将json对象转化为json字符串,再判断该字符串是否为"{}" JSON.st ...

  3. Java技巧分享:判断字符串是否为空常的三种方法

    很多初学Java的小伙伴肯定都有遇到过需要判断一个字符串是否为空的情况,那么你知道应该如何实现吗?今天小千就来给大家介绍三种不同的方式,同学们看一下哪个适合自己. 判断字符串是否为空有三种常见的方法分 ...

  4. 判断一个数是否为质数的三种方法

    转载自:https://blog.csdn.net/m0_37586991/article/details/79673837?depth_1-utm_source=distribute.pc_rele ...

  5. jquery判断方法是否存在_判断图中是否有环的三种方法

    0.什么是环? 在图论中,环(英语:cycle)是一条只有第一个和最后一个顶点重复的非空路径. 在有向图中,一个结点经过两种路线到达另一个结点,未必形成环. 1.拓扑排序 1.1.无向图 使用拓扑排序 ...

  6. aop判断方法是否执行成功_判断图中是否有环的三种方法

    0.什么是环? 在图论中,环(英语:cycle)是一条只有第一个和最后一个顶点重复的非空路径. 在有向图中,一个结点经过两种路线到达另一个结点,未必形成环. 1.拓扑排序 1.1.无向图 使用拓扑排序 ...

  7. sharepoint 判断用户是否存在某个组中三种方法

    1.思路:查找用户所有的组来匹配是否在特定的组(推荐) 不用担心组不存在而报错. public static bool IsUserMemberOfGroup(SPUser user, string ...

  8. java字符转为数字_Java 判断字符串能否转化为数字的三种方法

    linux shell 常用指令 1. man 对你熟悉或不熟悉的命令提供帮助解释 eg:man ls 就可以查看ls相关的用法 注:按q键或者ctrl+c退出,在linux下可以使用ctrl+c终止 ...

  9. 如何判断网站是不是ipad访问的?三种方法来判断

    如何判断是否是 iPad 浏览器呢,关键是看它的 User Agent 中是否有 iPad.iPad 使用的是 Safari Mobile 浏览器,他的的 User Agent 是: Mozilla/ ...

最新文章

  1. vue 拓扑组件_Authing 登录组件优化实践解析
  2. Linux管道指令(pipe)与shell 重定向的区别
  3. java学习笔记之折半查找法(二分法)
  4. python 输出一个 5*5的 三角形_GitHub标星3W+,80个Python案例,带你轻松玩转Python学习!...
  5. 最短路径(迪杰斯特拉算法)
  6. petshop4.0 详解之三(PetShop数据访问层之消息处理)
  7. 华润燃气各大区总经理_华润燃气“十四五”战略研讨会在华润大学小径湾校区举办...
  8. 济群法师:《大乘百法明门论》讲记·视频·音频·MP3
  9. java开发工具eli_Java 学习线路图是怎样的?
  10. python的map函数和reduce_python函数_map()、filter()和reduce()
  11. 【统计学习】细节笔记 [ 3 ] :贝叶斯角和两类错误角度理解混淆矩阵(为什么不能每个人都做核酸检测)
  12. 2016年中国的SaaS服务商企业研究
  13. 微信lbs开发java_微信LBS获取
  14. 如何修改作为背景图片的svg颜色
  15. socket:read: Connection reset by peer
  16. 计算机网络机房需要气体灭火吗,机房排烟和机房消防要求有哪些
  17. python应用题应用背景及实际意义_课题研究的现实背景及意义
  18. 【信奥赛一本通】 1413:确定进制(详细代码)
  19. 安卓系统 samba服务器搭建,介绍在电脑上建samba服务器的方法 安卓samba服务器的安装方法...
  20. Linux系统的grub.cfg文件损坏修复

热门文章

  1. where to find fundings as an MPhil student?
  2. 光用滴答清单也可以专注学习
  3. engineering likes?
  4. sun building in shanghai
  5. 坐火车一定要带身份证
  6. 剑桥大学申请start up签证的有用的网站
  7. 关于自主开发和研究代码
  8. SETRANGE key offset value
  9. Java容器源码分析-HashSet vs TreeSet vs LinkedHashSet
  10. 备战双十一,大数据告诉你哪家快递公司最强?