C++版本判断点是否落入多边形内原理讲解及代码实现
![C++版本判断点是否落入多边形内原理讲解及代码实现](https://img-blog.csdnimg.cn/20200709214236478.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1poYW5neWFuZmVuZzE=,size_16,color_FFFFFF,t_70)
1.判断点落在多边形内原理
1.1面积法
判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部。
1.2角度法
判断目标点与所有边的夹角和是否为360度,为360度则在多边形内部。
1.3射线法
从目标点出发引一条射线,看这条射线和多边形所有边的交点数目:
(1)如果有奇数个交点,则说明在内部;
(2)如果有偶数个交点,则说明在外部.
2.判断点落在多边形内C++代码实现
/*!
* Copyright (c) 2020,ZYF.
* All Rights Reserved.
*
* \file Point.cpp
* \brief 判断点是否落在多边形内
*
* \author ZYF
* \date 2020/7/9 21:02:38
* \version 1.0.0
*/
#include <vector>
#include <iostream>
using namespace std;
/*
* 点坐标
*/
struct Point
{
double X;//X坐标
double Y;//Y坐标
//double Z;//Z坐标
/*!
* \brief 构造函数
* \param dx : double X坐标
* \param dy : double Y坐标
* \param dz : double Z坐标
* \returns :
* \throws <exception class>
* \remarks
* \see
*/
Point(double dx, double dy/*, double dz*/)
{
X = dx;
Y = dy;
//Z = dz;
}
};
/*!
* \brief 判断点是否落在多边形内
* \param vtPoint : const Point & 点
* \param vector<Point>vecPoints & : const 多边形
* \returns bool :
* \throws <exception class>
* \remarks
* \see
*/
bool IsPointInPolygon(const Point& vtPoint, const vector<Point>& vecPoints)
{
/*
方法1:面积法
判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部。
方法2:角度法
判断目标点与所有边的夹角和是否为360度,为360度则在多边形内部。
方法3:射线法
从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。
如果有奇数个交点,则说明在内部
如果有偶数个交点,则说明在外部
*/
/*
点是否在多边形内的算法逻辑:
如果从点P作水平向左的射线的话
(1)若射线与多边形的交点为奇数,则P在多边形内部;
(1)若射线与多边形的交点为偶数,则P在多边形外部。
特殊情况(若边为(P1,P2)):
(1)如果射线正好穿过P1或者P2,那么这个交点会被算作2次,处理办法是如果P的从坐标与P1,P2中较小的纵坐标相同,则直接忽略这种情况;
(2)如果射线水平,则射线要么与其无交点,要么有无数个,这种情况也直接忽略;
(3)如果射线竖直,而P的横坐标小于P1,P2的横坐标,则必然相交;
(4)再判断相交之前,先判断P是否在边(P1,P2)的上面,如果在,则直接得出结论:P再多边形内部。
*/
bool bResult = false; //判断结果(true;点落在多边形内;false:点未落在多边形内)
int nSize = vecPoints.size();
int j = nSize - 1;//nSize -1 是多边形的最后一个顶点
for (int i = 0; i < nSize; i++)
{
//判断点是否在线段的两侧
if ((vecPoints[i].Y < vtPoint.Y && vecPoints[j].Y >= vtPoint.Y) || (vecPoints[j].Y < vtPoint.Y && vecPoints[i].Y >= vtPoint.Y))
{