首页 > 代码库 > poj 1269 线段相交/平行
poj 1269 线段相交/平行
模板题
注意原题中说的线段其实要当成没有端点的直线。被坑了= =
1 #include <cmath> 2 #include <cstdio> 3 #include <iostream> 4 #include <cstring> 5 using namespace std; 6 7 #define eps 1e-8 8 #define PI acos(-1.0)//3.14159265358979323846 9 //判断一个数是否为0,是则返回true,否则返回false 10 #define zero(x)(((x)>0?(x):-(x))<eps) 11 //返回一个数的符号,正数返回1,负数返回2,否则返回0 12 #define _sign(x)((x)>eps?1:((x)<-eps?2:0)) 13 14 struct point 15 { 16 double x,y; 17 point(){} 18 point(double xx,double yy):x(xx),y(yy) 19 {} 20 }; 21 struct line 22 { 23 point a,b; 24 line(){} //默认构造函数 25 line(point ax,point bx):a(ax),b(bx) 26 {} 27 };//直线通过的两个点,而不是一般式的三个系数 28 29 int n; 30 double ax1,ay1,ax2,ay2,bx1,by1,bx2,by2; 31 32 //求矢量[p0,p1],[p0,p2]的叉积 33 //p0是顶点 34 //若结果等于0,则这三点共线 35 //若结果大于0,则p0p2在p0p1的逆时针方向 36 //若结果小于0,则p0p2在p0p1的顺时针方向 37 double xmult(point p1,point p2,point p0) 38 { 39 return(p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); 40 } 41 //计算dotproduct(P1-P0).(P2-P0) 42 double dmult(point p1,point p2,point p0) 43 { 44 return(p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y); 45 } 46 //两点距离 47 double distance(point p1,point p2) 48 { 49 return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); 50 } 51 //判三点共线 52 int dots_inline(point p1,point p2,point p3) 53 { 54 return zero(xmult(p1,p2,p3)); 55 } 56 //判点是否在线段上,包括端点 57 int dot_online_in(point p,line l) 58 { 59 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; 60 } 61 //判点是否在线段上,不包括端点 62 int dot_online_ex(point p,line l) 63 { 64 return dot_online_in(p,l)&&(!zero(p.x-l.a.x)||!zero(p.y-l.a.y))&&(!zero(p.x-l.b.x)||!zero(p.y-l.b.y)); 65 } 66 //判两点在线段同侧,点在线段上返回0 67 int same_side(point p1,point p2,line l) 68 { 69 return xmult(l.a,p1,l.b)*xmult(l.a,p2,l.b)>eps; 70 } 71 //判两点在线段异侧,点在线段上返回0 72 int opposite_side(point p1,point p2,line l) 73 { 74 return xmult(l.a,p1,l.b)*xmult(l.a,p2,l.b)<-eps; 75 } 76 //判两直线平行 77 int parallel(line u,line v) 78 { 79 return zero((u.a.x-u.b.x)*(v.a.y-v.b.y)-(v.a.x-v.b.x)*(u.a.y-u.b.y)); 80 } 81 //判两直线垂直 82 int perpendicular(line u,line v) 83 { 84 return zero((u.a.x-u.b.x)*(v.a.x-v.b.x)+(u.a.y-u.b.y)*(v.a.y-v.b.y)); 85 } 86 //判两线段相交,包括端点和部分重合 87 int intersect_in(line u,line v) 88 { 89 if(!dots_inline(u.a,u.b,v.a)||!dots_inline(u.a,u.b,v.b)) 90 return!same_side(u.a,u.b,v)&&!same_side(v.a,v.b,u); 91 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); 92 } 93 //判两线段相交,不包括端点和部分重合 94 int intersect_ex(line u,line v) 95 { 96 return opposite_side(u.a,u.b,v)&&opposite_side(v.a,v.b,u); 97 } 98 //计算两直线交点,注意事先判断直线是否平行! 99 //线段交点请另外判线段相交(同时还是要判断是否平行!)100 point intersection(line u,line v)101 {102 point ret=u.a;103 double t=((u.a.x-v.a.x)*(v.a.y-v.b.y)-(u.a.y-v.a.y)*(v.a.x-v.b.x))/((u.a.x-u.b.x)*(v.a.y-v.b.y)-(u.a.y-u.b.y)*(v.a.x-v.b.x));104 ret.x+=(u.b.x-u.a.x)*t;105 ret.y+=(u.b.y-u.a.y)*t;106 return ret;107 }108 109 int main()110 {111 cin>>n;112 cout<<"INTERSECTING LINES OUTPUT"<<endl;113 for (int i=1;i<=n;i++)114 {115 cin>>ax1>>ay1>>ax2>>ay2>>bx1>>by1>>bx2>>by2;116 point a1(ax1,ay1); point a2(ax2,ay2);117 point b1(bx1,by1); point b2(bx2,by2);118 line l1=line(point(ax1,ay1),point(ax2,ay2));119 line l2=line(point(bx1,by1),point(bx2,by2));120 if ((dots_inline(a1,a2,b1)>0)&&(dots_inline(a1,a2,b2)>0))121 cout<<"LINE";122 else if (parallel(l1,l2)>0) cout<<"NONE";123 else124 {125 point tm=intersection(l1,l2);126 cout<<"POINT ";127 printf("%.2f %.2f",tm.x,tm.y);128 }129 cout<<endl;130 }131 cout<<"END OF OUTPUT"<<endl;132 return 0;133 }
poj 1269 线段相交/平行
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。