题意
给出由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 }