SGU 124. Broken line 计算几何 判断点是否在多边形内

题目链接点这儿

题目就是给你一个多边形,再给个点,让你判断点是否在多边形内部。

妥妥的射线法。而且题目中说边都是平行于坐标轴的,那判断的时候就更省事了。

射线法可以看lrj的白书,也可以看这篇博客

但是这题好诡异。。。如果是一条平行x轴向左的射线只能取经过上端点为经过这条边。。。如果去经过下端点为经过这条边的话。。。wa on test15.。。。向右的射线和向上向下都没有这种情况。。。。无法理解。。。

下面是代码

#include <bits/stdc++.h>
#define max(a,b) ((a)>(b))?(a):(b)
#define min(a,b) ((a)>(b))?(b):(a)
#define rep(i,initial_n,end_n) for(int (i)=(initial_n);(i)<(end_n);i++)
#define repp(i,initial_n,end_n) for(int (i)=(initial_n);(i)<=(end_n);(i)++)
#define eps 1.0E-8
#define MAX_N 1010
#define INF 1 << 30
using namespace std;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
typedef long long ll;
typedef unsigned long long ull;

pii v1[10001], v2[10001];

int main() {
   int n;
   scanf("%d", &n);
   rep(i, 0, n) {
       scanf("%d%d", &v1[i].first, &v1[i].second);
       scanf("%d%d", &v2[i].first, &v2[i].second);
       if(v1[i].first > v2[i].first) swap(v1[i].first, v2[i].first);
       if(v1[i].second > v2[i].second) swap(v1[i].second, v2[i].second);
   }
   pii point;
   scanf("%d%d", &point.first, &point.second);
   int cnt = 0;
   rep(i, 0, n) {
       if(v1[i].first == v2[i].first) {
           if(v1[i].first == point.first && v1[i].second <= point.second && v2[i].second >= point.second) {
               puts("BORDER");
               exit(0);
           }
           if(v1[i].first < point.first && v1[i].second <= point.second && v2[i].second > point.second)
               cnt++;
       }
       else if(v1[i].second == v2[i].second &&
           v1[i].first <= point.first && v2[i].first >= point.first) {
           if(v1[i].second == point.second) {
               puts("BORDER");
               exit(0);
           }
       }
   }
   if(cnt&1) puts("INSIDE");
   else puts("OUTSIDE");
   return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值