zoj1081 Points Within

原创 2006年06月16日 13:44:00
  1. //zoj1081 Points Within

  2. //Accepted 1081 C++ 00:00.00 396K

  3. //(?)处有问题,不过还是AC

  4. #include <stdio.h>

  5. #define MAXN 100

  6. #define INF 1e10

  7. struct point { double x,y;};

  8. int n;

  9. double xmult(double x1,double y1,double x2,double y2){return x1*y2-x2*y1;}

  10. double xmult3(point p1,point p2,point p0)
  11. {return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);}

  12. //判点p1p2在线段p3p4同侧(不包括在直线线上)

  13. bool same_side(point p1,point p2,point p3,point p4)

  14. {

  15.        double dx,dy,dx1,dy1,dx2,dy2;

  16.        dx = p4.x-p3.x, dy = p4.y-p3.y;

  17.        dx1 = p1.x-p3.x, dy1 = p1.y-p3.y;

  18.        dx2 = p2.x-p4.x, dy2 = p2.y-p4.y;

  19.        return xmult(dx,dy,dx1,dy1)*xmult(dx,dy,dx2,dy2)>0.0;

  20. }

  21. //p1p2p3p4相交(包括端点)

  22. bool intersect(point p1,point p2,point p3,point p4)

  23. {

  24.        return (!same_side(p1,p2,p3,p4) && !same_side(p3,p4,p1,p2));

  25. }

  26. //判点q在线段p1p2(包括端点)

  27. bool dot_online(point q,point p1,point p2)

  28. {

  29.        return xmult3(q,p1,p2)==0.0 &&

  30.               (q.x-p1.x)*(q.x-p2.x)<=0.0 &&

  31.               (q.y-p1.y)*(q.y-p2.y)<=0.0;

  32. }

  33. //判点q在多边形P(p[0,1,...,n-1]P的邻接顶点)(包括在边上),射线穿刺、奇偶校验法

  34. /* Special case

  35.   y|       __

  36.    |      /  /

  37.    |     / .__/____//______qs

  38.    |    /   q        /

  39. ___|____/____________/____x

  40.    |     /__________/

  41. (a) q->qs overlap the edge of P

  42.  

  43.   y|       __

  44.    |      /  /

  45.    |     /    /_.__//

  46.    |    /        q   /

  47. ___|____/____________/____x

  48.    |     /__________/

  49. (b) q is on the edge of P (true)

  50.  

  51.   y|       __

  52.    |      /._/_____________qs

  53.    |     /  q /____//

  54.    |    /            /

  55. ___|____/____________/____x

  56.    |     /__________/

  57. (c) q->qs cross the vertex of P

  58.  

  59.   y|       __

  60.    |      /  /

  61.    |     /    /____//

  62.    |    /  q.________/______qs

  63. ___|____/____________/____x

  64.    |     /__________/

  65. (d) q-qs cross the vertex of P

  66.  

  67. Sample Input

  68. 9 5

  69.  

  70. 1 1

  71. 4 1

  72. 6 3

  73. 5 5

  74. 4 4

  75. 2 4

  76. 1 6

  77. -1 6

  78. -3 3

  79.  

  80. 1 4(a)

  81. 3 4(b)

  82. 1 5(c)

  83. 1 3(d)

  84. -5 3(d)

  85. 0
  86. Sample Output

  87. Within

  88. Within

  89. Within

  90. Within

  91. Outside

  92. */

  93. bool inside_polygon(point q,point *p,int n)

  94. {

  95.        point qs=q;

  96.        qs.x = INF;//construct radial q->qs

  97.        int cnt = 0;

  98.        for (int i=0; i<n; ++i){

  99.               int j=(i+1)%n,k=(i+2)%n;

  100.               if (dot_online(q,p[i],p[j])) return true;//case (b)

  101.               if (intersect(q,qs,p[j],p[k])) cnt++;//case (c) and common

  102. //(?) if (dot_online(p[j],q,qs) && !same_side(p[i],p[k],q,qs)) cnt--;//case (d)

  103. //(?) if (dot_online(p[j],q,qs) && dot_online(p[k],q,qs)) cnt--;//case (a)

  104.        }

  105.        printf ("%d",cnt);

  106.        return cnt%2!=0;

  107. }

  108. void solve()

  109. {

  110.        int m;

  111.        point q,p[MAXN];

  112.        scanf ("%d",&m);

  113.        for (int i=0; i<n; ++i) scanf ("%lf %lf",&p[i].x,&p[i].y);

  114.        while (m--){

  115.               scanf ("%lf %lf",&q.x,&q.y);

  116.               if (inside_polygon(q,p,n))

  117.                      printf ("Within/n");

  118.               else printf ("Outside/n");

  119.        }

  120. }

  121. int main()

  122. {

  123. #ifdef ONLINE_JUDGE

  124. #else

  125.        freopen("1081.txt","r",stdin);

  126. #endif

  127.        int t=0;

  128.        while (scanf("%d",&n)!=EOF && n){

  129.               if (t) printf ("/n");

  130.               printf ("Problem %d:/n",++t);

  131.               solve();

  132.        }

  133. #ifdef ONLINE_JUDGE

  134. #else

  135.        fclose(stdin);

  136. #endif

  137.        return 0;

  138. }

zoj1081(点与多边形的位置关系)

题目大意: 给定一个点数为 n 的多边形,点按照顺序给出,再给出 m 个点,询问每个点是否在多边形内。 n ...

[学习][ZOJ1081]点、直线关系 Points Within

题目: Points WithinTime Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)...
  • g19zwk
  • g19zwk
  • 2017年05月20日 17:02
  • 190

zoj 1081 Points Within (判断点是否在多边形内)

射线相交法判断。 这个点向右发出一条射线,如果和多边形相交交点为奇数,则这个点在多边形内,反之不在。证明神马的自己证吧。 开始用int错得一塌糊涂,因为我的射线x坐标开得不够大,如果大的话,叉积判断后...

zoj1081

Points Within Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) ...

zoj 1081 Points Within[判断点在简单多边形内]

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=81 题目的很简单

zoj 1081 Points Within

判断点是否在多边形内、模版题、我也只会套模版了、、 #include using namespace std; const int maxn=105; //多边形点的个数 const doubl...

ZOJ1081 Points Within,判断点是否在多边形 内

/******************************************************************************* # Author : Neo Fun...
  • neofung
  • neofung
  • 2011年11月16日 17:46
  • 597

ZOJ 1081 Points Within (几何)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1081 有一些经常用的几何知识,留着备用! #include"i...

ZOJ1081 Points Within(判断点是否在多边形内部)

计算几何的基础知识考查,关键是分清楚所有的情况,不要漏掉某些情况

ITU-T G.1081 IPTV性能监测点 (Performance monitoring points for IPTV)

ITU-TRecommendation G.1081 Performance monitoring points for IPTV Summary Successful deployment of I...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:zoj1081 Points Within
举报原因:
原因补充:

(最多只允许输入30个字)