判断点是否在多边形内(射线法)

判断一个点是否在多边形内的方法有很多,这里是射线法
判断点是否在多边形内(射线法)_第1张图片
看图可以知道,在判断的点上画一条水平线,看这条线与多边形的交点,任意一边的点是奇数个,那么该点就在多边形内(因为一条水平线与多边形的交点是偶数个,如果该点在多边形内,那么它的左边或右边相交的点必定是奇数个,所以只要判断一边的情况就行了)

根据两点式可以求出水平线与多边形任意两个相邻点的交点

两点式公式:

在这里插入图片描述

代码:

#include 
using namespace std;

struct Point{
	double x, y;
};

Point pt_polygon[1000];

int main(){
	
	int n;
	Point p;
	cin >> n >> p.x >> p.y;
	
	for(int i = 1;i<=n;i++){
		cin >> pt_polygon[i].x >> pt_polygon[i].y;
	}
	
	int num = 0;
	
	for(int i = 1;i<=n;i++){
		
		Point p1 = pt_polygon[i];
		Point p2 = pt_polygon[i%n+1];
		
		if(p1.y == p2.y) continue;	//与水平线平行无交点 
		
		if(p.y <= min(p1.y,p2.y)) continue;	//判断是否在多边形内,所以两个都要等于 
		
		if(p.y >= max(p1.y,p2.y)) continue;
		
		double x = (p.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x;	//两点式 
		
		if(x > p.x) num++;
	}
	
	if(num&1) cout << "点在多边形内" << endl;
	else cout << "点在多边形外" << endl;
	
	return 0;
}

/*
5 1.5 1.5
1.0 1.0
2.0 2.0
1.75 2.0
1.0 3.0
0.0 2.0

------------------
5 1.5 1.5
1.0 1.0
2.0 2.0
1.75 2.5
1.0 3.0
0.0 2.0
*/

你可能感兴趣的:(数学,各类模板算法)