判断一个点是否在多边形内的方法有很多,这里是射线法

看图可以知道,在判断的点上画一条水平线,看这条线与多边形的交点,任意一边的点是奇数个,那么该点就在多边形内(因为一条水平线与多边形的交点是偶数个,如果该点在多边形内,那么它的左边或右边相交的点必定是奇数个,所以只要判断一边的情况就行了)
根据两点式可以求出水平线与多边形任意两个相邻点的交点
两点式公式:

代码:
#include <iostream>
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
*/
这篇博客介绍了如何使用射线法判断一个点是否位于多边形内部。通过绘制水平线并与多边形各边求交点,若交点数为奇数,则点在多边形内。代码示例展示了具体实现过程。
1513

被折叠的 条评论
为什么被折叠?



