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

这篇博客介绍了如何使用射线法判断一个点是否位于多边形内部。通过绘制水平线并与多边形各边求交点,若交点数为奇数,则点在多边形内。代码示例展示了具体实现过程。

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

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

两点式公式:

在这里插入图片描述

代码:

#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
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值