判断点是否在凸多边形内

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

以下图为例说明问题:

原则:

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;
}

亲测有效。

原文地址:https://www.cnblogs.com/calence/p/9988172.html

时间: 2024-09-29 11:45:14

判断点是否在凸多边形内的相关文章

poj 1584 A Round Peg in a Ground Hole 判断多边形是否为凸多边形 + 圆心是否在凸多边形内 + 圆是否在凸多边形内部

题目来源: http://poj.org/problem?id=1584 题意: 给一个多边形, 一个圆心以及半径. 首先判断是否为凸多边形. 如果是凸多边形, 再判断,圆是否在凸多边形内部. 分析: 1) 先判断是否为凸多边形 ,题目给出的顶点是有序的, 即顺时针或是 逆时针.用叉积方向判断. 2) 判断圆在多边形内, 首先判断 圆心是否在多边形内部, 是的话,然后再 判断 圆心到多边形 所有边的 距离d >= r , 即可. 代码如下: const int Max_N = 1005; con

POJ 1584 A Round Peg in a Ground Hole(凸多边形判断 + 点是否在多边形内 + 点到线段的最短距离)

题目:传送门 题意:给你一个圆和一个多边形, 判断多边形是不是凸多边形,如果是,接着判断圆是否在凸多边形内部. #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> #include <map> #include <vector> #include <set> #inclu

判断点是否在多边形内

有一个n边形,顶点为p1,p2,...,pn;给定一个已知点p,判断p在此多边形内还是外. 预备知识: 两线段相交的定义,如果一条线段的两端分别处在另一条线段的两端,则此两线段相交 判断2点在线段的两侧可以用向量的叉乘实现! 基本步骤: 1,过p点垂直向上作一条射线 2,判断此射线与n边形n条边的交点 3,把所有交点相加,如果是奇数则说明在多边形内,否则在多边形外 思路非常的简单,另外说明一下几种特殊的情况: 1,射线与多边形的顶点相交:比如射线过多边形的Pi点,则如果Pi-1和Pi+1在此射线

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

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

POJ1584 判断多边形是否为凸多边形,并判断点到直线的距离

求点到直线的距离: double dis(point p1,point p2){   if(fabs(p1.x-p2.x)<exp)//相等的  {    return fabs(p2.x-pegx);    }  else     {   double k=(p2.y-p1.y)/(p2.x-p1.x);   double b=p2.y-k*p2.x;   return fabs(k*pegx-pegy+b)/sqrt(k*k+1);//返回的是距离的   }}判断多边形是否为凸多边形 if

C# 判断点是否在多边形内

/// <summary>/// 判断点是否在多边形内/// </summary>/// <param name="pnt">点</param>/// <param name="pntlist">区域的点集</param>/// <returns></returns>public static bool PointInFeaces(PointF pnt, List<

hdu 2108 Shape of HDU【判断多边形是否是凸多边形模板】

#include<stdio.h> #include<math.h> const int maxn = 100000; struct Point{ double x,y; Point() {} Point(double _x, double _y) { x = _x; y = _y; } Point operator -(const Point &B) const { return Point(x-B.x, y-B.y); } }p[maxn]; double eps =

AE 判断点是否在面内

1 /// <summary> 2 /// 根据面要素的ID获取面,判断点是否在面内 3 /// </summary> 4 /// <param name="point">要判断的点,射线的起点</param> 5 /// <param name="ID">面的ID</param> 6 /// <param name="pFeatureLayer">面要素所在的图

百度地图 判断marker是否在多边形内

昨天画了圆形,判marker是否存在圆形内.今天来画多边形,判断marker在多边形内. 百度地图API覆盖物多边形类 http://developer.baidu.com/map/reference/index.php?title=Class:%E8%A6%86%E7%9B%96%E7%89%A9%E7%B1%BB/Polygon http://developer.baidu.com/map/reference/index.php?title=Class:%E8%A6%86%E7%9B%96%