題意
給出由n條線段圍成的多邊形(每條邊均平行于坐標軸),以及一個點(x0,y0),問這個點是在形內或是形外或是形上
分析
對于在線段上,比較容易判斷,直接比較一下坐標的位置即可;
若不在形上,則在該點處向上引一條射線。因為是向上引的,所以只和與x軸平行的線有交點,記錄交點個數。
? ? ? 注意在記錄交點個數時,如果在一條線段的短點,只記一側的,別記重了。
這樣,統計相交次數。如果為奇數,則在形內;偶數,形外。
?
注意讀入數據后比較一下大小并交換。
?
?
Accepted Code
1 /* 2 PROBLEM:sgu 124 3 AUTHER:Rinyo 4 MEMO:計算幾何 5 */ 6 #include<cstdio> 7 const int maxn(10030); 8 int x1[maxn],x2[maxn],y1[maxn],y2[maxn]; 9 int main() 10 { 11 freopen("in.txt","r",stdin); 12 int n; 13 scanf("%d",&n); 14 for (int i=1;i<=n;i++) 15 { 16 scanf("%d%d%d%d",&x1[i],&y1[i],&x2[i],&y2[i]); 17 if (x1[i]==x2[i]) 18 { 19 if (y1[i]>y2[i]) 20 {int t=y1[i];y1[i]=y2[i];y2[i]=t;} 21 } 22 if (y1[i]==y2[i]) 23 { 24 if (x1[i]>x2[i]) 25 {int t=x1[i];x1[i]=x2[i];x2[i]=t;} 26 } 27 } 28 int x0,y0; 29 scanf("%d%d",&x0,&y0); 30 for (int i=1;i<=n;i++) 31 { 32 if ((x1[i]==x2[i]) && (x1[i]==x0) && (y1[i]<=y0) && (y2[i]>=y0)) 33 { 34 printf("BORDER"); 35 return 0; 36 } 37 if ((y1[i]==y2[i]) && (y1[i]==y0) && (x1[i]<=x0) && (x2[i]>=x0)) 38 { 39 printf("BORDER"); 40 return 0; 41 } 42 } 43 int t=0; 44 for (int i=1;i<=n;i++) 45 if ((y1[i]==y2[i]) && (y1[i]>y0) && (x1[i]<x0) && (x2[i]>=x0)) t++; 46 if (t & 1==1) printf("INSIDE"); 47 else printf("OUTSIDE"); 48 return 0; 49 }
?