poj 2653(线段相交)

第一道计算几何题。。。。

试用了下两种删除vector中元素的方法。

第一种使用:(每次erase一个元素后都会指向下一个元素位置)

1 for(int j=0;j<v.size();)
2 {
3     if(intersect_in(lin[i],lin[v[j]]))
4         v.erase(v.begin()+j);
5     else
6         j++;
7 }
View Code
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <vector>
 7 
 8 using namespace std;
 9 
10 #define eps 1e-8
11 #define PI acos(-1.0)//3.14159265358979323846
12 //判断一个数是否为0,是则返回true,否则返回false
13 #define zero(x)(((x)>0?(x):-(x))<eps)
14 //返回一个数的符号,正数返回1,负数返回2,否则返回0
15 #define _sign(x)((x)>eps?1:((x)<-eps?2:0))
16 
17 const int maxn =  1e5+5;
18 struct point 
19 {
20     double x,y;
21 };
22 struct line
23 {
24     point a,b;
25     line(){}
26     line(double x1,double y1,double x2,double y2)
27     {
28         a.x=x1;
29         a.y=y1;
30         b.x=x2;
31         b.y=y2;
32     }
33 };
34 line lin[maxn];
35 double xmult(point p1,point p2,point p0)
36 {
37     return(p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
38 }
39 //计算dotproduct(P1-P0).(P2-P0)
40 double dmult(point p1,point p2,point p0)
41 {
42     return(p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y);
43 }
44 //判三点共线
45 int dots_inline(point p1,point p2,point p3)
46 {
47     return zero(xmult(p1,p2,p3));
48 }
49 //判点是否在线段上,包括端点
50 int dot_online_in(point p,line l)
51 {
52     return zero(xmult(p,l.a,l.b))&&(l.a.x-p.x)*(l.b.x-p.x)<eps&&(l.a.y-p.y)*(l.b.y-p.y)<eps;
53 }
54 //判两点在线段同侧,点在线段上返回0
55 int same_side(point p1,point p2,line l)
56 {
57     return xmult(l.a,p1,l.b)*xmult(l.a,p2,l.b)>eps;
58 }
59 
60 int intersect_in(line u,line v)
61 {
62     if(!dots_inline(u.a,u.b,v.a)||!dots_inline(u.a,u.b,v.b))//规范相交
63         return!same_side(u.a,u.b,v)&&!same_side(v.a,v.b,u);
64     return dot_online_in(u.a,v)||dot_online_in(u.b,v)||dot_online_in(v.a,u)||dot_online_in(v.b,u);
65 }
66 
67 int main()
68 {
69     int n;
70     double x1,x2,y1,y2;
71     while(scanf("%d",&n))
72     {
73         if(!n) break;
74         vector<int>v;
75         for(int i=1;i<=n;i++)
76         {
77             scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
78             lin[i]=line(x1,y1,x2,y2);
79             for(int j=0;j<v.size();)
80             {
81                 if(intersect_in(lin[i],lin[v[j]]))
82                     v.erase(v.begin()+j);
83                 else
84                     j++;
85             }
86             v.push_back(i);
87         }
88         printf("Top sticks:");
89         for(int i=0;i<v.size()-1;i++)
90             printf(" %d,",v[i]);
91         printf(" %d.\n",v[v.size()-1]);
92     }
93     return 0;
94 }

第二种使用remove_if()。

 1 line tmp;
 2 bool ok(line l)
 3 {
 4     if(intersect_in(tmp,l))
 5         return true;
 6     else
 7         return false;
 8 }
 9 
10 v.erase(remove_if(v.begin(),v.end(),ok),v.end());
View Code
  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cmath>
  5 #include <algorithm>
  6 #include <vector>
  7 
  8 using namespace std;
  9 
 10 #define eps 1e-8
 11 #define PI acos(-1.0)//3.14159265358979323846
 12 //判断一个数是否为0,是则返回true,否则返回false
 13 #define zero(x)(((x)>0?(x):-(x))<eps)
 14 //返回一个数的符号,正数返回1,负数返回2,否则返回0
 15 #define _sign(x)((x)>eps?1:((x)<-eps?2:0))
 16 
 17 struct point 
 18 {
 19     double x,y;
 20 };
 21 struct line
 22 {
 23     point a,b;
 24     int id;
 25     line(){}
 26     line(double x1,double y1,double x2,double y2,int i)
 27     {
 28         a.x=x1;
 29         a.y=y1;
 30         b.x=x2;
 31         b.y=y2;
 32         id=i;
 33     }
 34 };
 35 double xmult(point p1,point p2,point p0)
 36 {
 37     return(p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
 38 }
 39 //计算dotproduct(P1-P0).(P2-P0)
 40 double dmult(point p1,point p2,point p0)
 41 {
 42     return(p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y);
 43 }
 44 //判三点共线
 45 int dots_inline(point p1,point p2,point p3)
 46 {
 47     return zero(xmult(p1,p2,p3));
 48 }
 49 //判点是否在线段上,包括端点
 50 int dot_online_in(point p,line l)
 51 {
 52     return zero(xmult(p,l.a,l.b))&&(l.a.x-p.x)*(l.b.x-p.x)<eps&&(l.a.y-p.y)*(l.b.y-p.y)<eps;
 53 }
 54 //判两点在线段同侧,点在线段上返回0
 55 int same_side(point p1,point p2,line l)
 56 {
 57     return xmult(l.a,p1,l.b)*xmult(l.a,p2,l.b)>eps;
 58 }
 59 
 60 int intersect_in(line u,line v)
 61 {
 62     if(!dots_inline(u.a,u.b,v.a)||!dots_inline(u.a,u.b,v.b))//规范相交
 63         return!same_side(u.a,u.b,v)&&!same_side(v.a,v.b,u);
 64     return dot_online_in(u.a,v)||dot_online_in(u.b,v)||dot_online_in(v.a,u)||dot_online_in(v.b,u);
 65 }
 66 
 67 line tmp;
 68 bool ok(line l)
 69 {
 70     if(intersect_in(tmp,l))
 71         return true;
 72     else
 73         return false;
 74 }
 75 
 76 int main()
 77 {
 78     int n;
 79     double x1,x2,y1,y2;
 80     while(scanf("%d",&n))
 81     {
 82         if(!n) break;
 83         vector<line>v;
 84         for(int i=1;i<=n;i++)
 85         {
 86             scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
 87             tmp=line(x1,y1,x2,y2,i);
 88             v.erase(remove_if(v.begin(),v.end(),ok),v.end());
 89             /*for(int j=0;j<v.size();)
 90             {
 91                 if(intersect_in(lin[i],lin[v[j]]))
 92                     v.erase(v.begin()+j);
 93                 else
 94                     j++;
 95             }*/
 96             v.push_back(tmp);
 97             
 98         }
 99         printf("Top sticks:");
100         for(int i=0;i<v.size()-1;i++)
101             printf(" %d,",v[i].id);
102         printf(" %d.\n",v[v.size()-1].id);
103     }
104     return 0;
105 }
原文地址:https://www.cnblogs.com/Missa/p/2790903.html