網站首頁 編程語言 正文
首先明白 在任意多邊形內一點,發射一條射線(以水平為例),必然與奇數條變相交。
如下圖為例:
那么我們得到判定條件:
?奇數個交點? ? ? ? ? ==》 點在多邊形內
偶數個交點? ? ? ? ??==》? 點在多邊形外
?特例說明,如果要是設定,在線段上也算點在多邊形內
那么判斷共線且非射線即可。
代碼如下:
#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
相關推薦
- 2022-10-07 mybatis?調用?Oracle?存儲過程并接受返回值的示例代碼_oracle
- 2023-10-14 uniapp 將base64字符串保存為圖片、Word、Excel、音頻、視頻等文件
- 2022-09-30 Docker容器harbor私有倉庫部署和管理_docker
- 2023-02-03 TypeScript?中?as?const使用介紹_其它
- 2022-10-16 Python計算標準差之numpy.std和torch.std的區別_python
- 2023-05-22 Pytorch怎樣保存訓練好的模型_python
- 2022-10-16 python3里gbk編碼的問題解決_python
- 2022-04-02 ?Python錯誤與異常處理_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支