日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

點在多邊形內判定模板(射線法,凹凸多邊形均可)

作者:LightningJie 更新時間: 2022-08-28 編程語言

首先明白 在任意多邊形內一點,發射一條射線(以水平為例),必然與奇數條變相交。

如下圖為例:

那么我們得到判定條件:

?奇數個交點? ? ? ? ? ==》 點在多邊形內

偶數個交點? ? ? ? ??==》? 點在多邊形外

?特例說明,如果要是設定,在線段上也算點在多邊形內

那么判斷共線且非射線即可。

代碼如下:

#include<iostream>
#include<vector>
using namespace std;
const double eps=1e-8;
inline int dcmp(double x){
	return x<-eps ? -1:x>eps;
}

struct Point{
	double x,y;
	Point(){}
	Point(double a,double b):x(a),y(b){}

	Point operator -(const Point &rhs) const{
		return Point(x-rhs.x,y-rhs.y);
	}
};
double det(const Point &a,const Point &b)
{
	return a.x*b.y-a.y*b.x;
}
double dot(const Point &a,const Point &b)
{
	return a.x*b.x+a.y*b.y;
}
bool on_point_segment(Point p,Point a1,Point a2)
{
	return dcmp(det(a1-p,a2-p))==0&&dcmp(dot(a1-p,a2-p))<=0;
}
int in_point_polygon(Point o,const vector<Point> &poly,bool flag)
{
	int t=0,k;
	Point a,b;
	int n=poly.size();
	for(int i=0;i<n;i++)
	{
		if(on_point_segment(o,poly[i],poly[(i+1)%n]))
			return flag;
	}
	for(int i=0;i<n;i++)
	{
		a=poly[i];
		b=poly[(i+1)%n];
		if(dcmp(a.y-b.y)>0)swap(a,b);
		if(dcmp(det(a-o,b-o))<0&&dcmp(a.y-o.y)<0&&dcmp(o.y-b.y)<=0)
			t++;
	}
	k=t&1;
	if(k==1)
		return 2;
	else 
		return 0;
}

int main()
{
	vector <Point> a;
	vector <Point> b;
	int n,m;
	Point s;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>s.x>>s.y;
		a.push_back(s);
	}
	cin>>m;
	for(int i=0;i<m;i++)
	{
		cin>>s.x>>s.y;
		b.push_back(s);
	}

	for(int i=0;i<m;i++)
	{
		printf("%d\n",in_point_polygon(b[i],a,1));

	}

}

例題:

題目背景

原魔在最近一次更新中,上線了「層巖巨淵」。其中許多區域分布著神秘的「黑泥」,角色處于「黑泥」中,攻擊力會變得更強,與旅行者戰斗時具有巨大優勢。但「層巖巨淵」非常昏暗,原魔們需要你來幫助他們判斷他與「黑泥」的位置關系。

題目描述

「黑泥」呈區域性分布,具體來說是一個凸多邊形。逆時針給出每個頂點的坐標,并給出若干角色的坐標。請你判斷角色與「黑泥」的位置關系。若角色在「黑泥」外請輸出0,若角色在「黑泥」邊界上請輸出1,若角色在「黑泥」內請輸出2,

輸入格式

第一行一個正整數n,表明這是一個n邊形 接下來n行,每行兩個數x,y。表明這個頂點的橫坐標與縱坐標。 第n+1行一個正整數m,表明接下來有m次查詢。 接下來m行,每行兩個整數x,y。表明這個查詢點(即角色所在坐標)的橫坐標與縱坐標。

輸出格式

輸出m行,每行為角色與「黑泥」的位置關系(0或1或2)

樣例輸入

4
0?0
3?1
2?3
0?3
3
2?1
0?2
3?2

樣例輸出

2
1
0

數據范圍

  • 凸多邊形的端點互不相同

  • 凸多邊形的任意兩邊最多只有一個交點

原文鏈接:https://blog.csdn.net/weixin_52307528/article/details/126562343

欄目分類
最近更新