计算几何/sgu 124 Broken line

题意

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

 

posted @ 2013-03-19 22:43  Rinyo  阅读(284)  评论(0编辑  收藏  举报