文章目录

  • 判断点是否在凸多边形内
    • 1,原理
    • 2、右手坐标系
    • 3、向量叉积
    • 补充知识:
    • 可以理解利用向量的叉积,很容易判定一个多边形的凹凸性。也可以判定点是否在多边形的内部。
    • - 判定多边形的凹凸性
    • 判断点是否在多边形内部

判断点是否在凸多边形内

1,原理

假设凸多边形顶点,按照顺时针顺序构成顶点数组verts:Point[],依次取两个顶点构成线段序列。
若点落在凸多边形内,则必有:该点在所有的线段序列的右侧或者左侧。

2、右手坐标系

让右手拇指指向x轴的正方向,食指指向y轴的正方向,如果中指能指向z轴的正方向,则称这个坐标系为右手直角坐标系。反之则是左手直角坐标系。

3、向量叉积

补充知识:

向量叉积,向量P = (x1, y1); Q = (x2, y2); P×Q = (x1y2 - x2y1);
叉积的一个非常重要性质是可以通过它的符号判断两矢量相互之间的顺逆时针关系:
若 P × Q > 0 , 则P在Q的顺时针方向。
若 P × Q < 0 , 则P在Q的逆时针方向。
若 P × Q = 0 , 则P与Q共线,但可能同向也可能反向。
叉积的方向与进行叉积的两个向量都垂直,所以叉积向量即为这两个向量构成平面的法向量。

可以理解利用向量的叉积,很容易判定一个多边形的凹凸性。也可以判定点是否在多边形的内部。

- 判定多边形的凹凸性

即:依次顺时针遍历多边形的定点,如果是凸多边形,向量的叉积会保持一致,反之就是凹多边形了。

代码如下:

实现叉乘:

double cross(Point& p1, Point& p2, Point& p0)
{//取P0P1向量,P0P2向量,进行叉乘//如果结果为正,P1点位于向量P0P2的顺时针方向//反之在逆时针方向return (p1.x - p0.x) * (p2.y - p0.y)*1.0 - (p1.y - p0.y) * (p2.x - p0.x)*1.0;
}
//假定多变形的定点按顺时针已排序。
bool isConvexPolygon(QVector<Point> Polygon)
{int len = Polygon.size();int s = 0, e = len;if(e == 2){return true;}while (s <= e-3) {if (cross(Polygon[s+1], Polygon[s+2],Polygon[s]) < 0) {s ++;} else {return false;}}return true;
}
  • 判断点是否在多边形内部

假设凸多边形各个定点坐标按照逆时针方向存储于一个数组中,
首先,确定点目标点M于某两个相邻的顶点Pn,Pn+1构成的向量之间,
然后,确定M点是否在向量(Pn,Pn+1)的逆时针方向,如果是顺时针方向则不在凸多边形内。

代码如下:


bool inConvexPolygon(QVector<Point> Polygon, Point target)
{int len = Polygon.size();if (cross(target, Polygon[1], Polygon[0]) > 0 && cross(target, Polygon[len - 1], Polygon[0]) < 0) {return false;}int s = 1, e = len -1;int line = -1;while (s <= e) {int m = s + ((e-s) >> 1);   //二分法查找if (cross(target, Polygon[m], Polygon[0]) > 0) { // target在m顺时针方向line = m; // line保存的是m逆时针方向后的第一个点e = m -1;} else { // target在m逆时针方向s = m + 1;}}return cross(Polygon[line], target, Polygon[line -1]) > 0;
}

思考:如果假设凸多边形各个定点坐标按照顺时针方向存储于一个数组中呢?
改写如下:


bool inConvexPolygon2(QVector<Point> Polygon, Point target)
{int len = Polygon.size();if (cross(target, Polygon[1], Polygon[0]) < 0 && cross(target, Polygon[len - 1], Polygon[0]) > 0) {qDebug()<<"dot here";return false;}int s = 1, e = len -1;int line = -1;while (s <= e) {int m = s + ((e-s) >> 1);if (cross(target, Polygon[m], Polygon[0]) < 0) { // target在逆时针方向line = m; // line保存的是m顺时针方向后的第一个点e = m -1;} else { // target在m顺时针方向s = m + 1;}}return cross(Polygon[line-1], target, Polygon[line]) > 0;
}

判断点是否在凸多边形内相关推荐

  1. 判断点是否位于多边形内(包含凹多边形)

    如果判断点是否在凸多边形内,则有多种方法,方法简单,计算速度也快,直接使用物理引擎做判断也行 但实际问题中遇到的多边形不一定是凸多边形,它可能是凹边行或者复合多边形判断一个点在多边形内或多边形外,射线 ...

  2. poj 1584(凸包+点在凸多边形内+圆在凸多边形内)

    题意: 按照顺时针或逆时针方向输入一个n边形的顶点坐标集,先判断这个n边形是否为凸包. 再给定一个圆形(圆心坐标和半径),判断这个圆是否完全在n边形内部. 解题思路: 1.判断该多边形是否是凸包,由于 ...

  3. 判断点是否处于多边形内的三种方法(转)

    1. 叉乘判别法(只适用于凸多边形)想象一个凸多边形,其每一个边都将整个2D屏幕划分成为左右两边,连接每一边的第一个端点和要测试的点得到一个矢量v,将两个2维矢量扩展成3维的,然后将该边与v叉乘,判断 ...

  4. js 计算任意凸多边形内最大矩形_题库 | 计算机视觉常见面试题型介绍及解答 第 7 期...

    - 计算机视觉 -为什么说 Dropout 可以解决过拟合?(1)取平均的作用: 先回到标准的模型即没有 dropout,我们用相同的训练数据去训练 5 个不同的神经网络,一般会得到 5 个不同的结果 ...

  5. 如何判断一个点在多边形内

    一.从三角形开始说起---怎么判断一个点在三角形内 三角形是最简单的多边形了.先说说三角形有哪些判断方法. 参考自:判断一个点是否在三角形内部 - 知乎 几种方法判断平面点在三角形内_独L无二的博客- ...

  6. 判断点是否在四边形内

    参考网上资料,这里采用2种方法判断一个点,是否在四边形内. 方法一:向量积计算法.可以适用于任何形状的四边形,或者多边形: 方法二:面积计算法.只适用于凸四边形,或者凸多边形: 代码如下,分别用2种方 ...

  7. 利用叉乘快速判断点是否在三角形内

    利用叉乘快速判断点是否在三角形内 判断P是否在三角形ABC内: 向量: pa = P - A,  ca = C - A; ba = B - A; 如果向量 cross(ca, pa)与向量 cross ...

  8. 【Unity3D自学记录】判断物体是否在镜头内

    判断物体是否在镜头内. 其实很简单的方法 代码如下: [csharp] view plaincopy using UnityEngine; using System.Collections; publ ...

  9. 判断网页是否为微信内置浏览器打开?

    文章目录 (两种方法)教你:"如何判断网页是不是在微信端内置浏览器打开?" 本文根据项目开发实际情况,着重探讨在微信内置浏览器中调用支付功能,遇到的几个坑! 目的: (方法一)全部 ...

最新文章

  1. 软考新思维--2017年上半年信息系统项目管理师上午试题分析与答案(试题16-20题)...
  2. PDF文件合并使用什么工具
  3. boost::hana::extract用法的测试程序
  4. ajax代码 java,AJAX - java代码库 - 云代码
  5. 每日程序C语言30-static作用
  6. Evernote,有道云笔记以及Ms Onenote 2011
  7. 盘点Chrome 灵魂插件!爱了爱了!
  8. 理解 Delphi 的类(三) - 初识类的属性
  9. String常用函数
  10. Chrome浏览器嗅探功能技巧
  11. uclient和thinkphp的class db的冲突
  12. IDEA配置JavaScript库
  13. 运维基础实用知识点--软件篇
  14. 荣耀手机环比倍增,小米有点受伤
  15. 来自30岁女程序员的自我唤醒
  16. 车机开发之添加自定义键
  17. android仿微信拍摄视频教程,仿微信视频拍摄UI, 基于ffmpeg的视频录制编辑(上)
  18. Twitter开发者账号及开发者APPs的创建 2019.05
  19. Linux---/proc目录全讲解
  20. hdu4082 Hou Yi's secret(相似三角形)

热门文章

  1. linux切换root权限
  2. 内核态与用户态的区别
  3. Ubuntu16.04 +cuda8.0+cudnn+opencv+caffe+theano+tensorflow配置明细
  4. salt 执行命令等待_saltstack异步执行命令
  5. VTK修炼之道20:图像基本操作_图像类型转换
  6. 游戏外挂的基本编写原理
  7. java连接各数据库的语句
  8. DbLookUpCombobox的使用方法
  9. ADO内存数据对象SqlDataAdapter类使用SqlDataAdapter在数据库和DataSet之间架起桥梁:
  10. go语言中的匿名函数