计算几何/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 }

 

你可能感兴趣的:(in)