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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章