判断点是否在凸多边形内

Posted calence

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断点是否在凸多边形内相关的知识,希望对你有一定的参考价值。

判断点是否在凸多边形内的方法很多,此处仅给出使用向量叉积判断点是否在凸多边形内的方法。

以下图为例说明问题:

技术分享图片

 

原则:

1. 将多边形的第i条边的第一个顶点指向点P得到向量 v1,然后将从第一个顶点指向第二个顶点得到向量v2,叉乘这两个向量。

2.如果叉乘结果与上一条边的叉乘结果的乘积大于0则继续执行,如果乘积小于0,表示点P不在凸多边形内,直接返回即可。

 

要点:要求凸多边形的点以固定的顺序给出,例如固定为逆时针或顺时针。

 

实现的代码如下:

struct Point
{
    float x;
    float y;
    Point() :x(0), y(0){}
};
Point SubPoint(
const Point& vTarget1, const Point& vTarget2) { Point vPoint; vPoint.x = vTarget1.x - vTarget2.x; vPoint.y = vTarget1.y - vTarget2.y; return vPoint; } float CrossProduct(const Point& vTarget1, const Point& vTarget2) { return vTarget1.x * vTarget2.y - vTarget2.x * vTarget1.y; } bool IsPointInConvexPolygon(const vector<Point>& aPoints, const Point& vTarget) { if (aPoints.size() == 0) return false; float nCurCrossProduct = 0, nLastValue = 0; for (int i = 0; i < aPoints.size(); i++) { Point vU = SubPoint(vTarget, aPoints[i]); int nNextIndex = (i + 1) % aPoints.size(); Point vV = SubPoint(aPoints[nNextIndex], aPoints[i]); nCurCrossProduct = CrossProduct(vU, vV); if (i > 0 && nCurCrossProduct * nLastValue <= 0) { return false; } nLastValue = nCurCrossProduct; } return true; }

亲测有效。

 


以上是关于判断点是否在凸多边形内的主要内容,如果未能解决你的问题,请参考以下文章

判断一个点是否在多边形内

判断点是否在凸多边形内

判断一点是否在多边形内/判断是否在围栏内

判断点是否在任意多边形内

点在多边形内算法,C#判断一个点是否在一个复杂多边形的内部

如何判断点在一个区域内?用户绘制区域(射线法)判断点在多边形区域,报警区域