#include<iostream> #include<cmath> #include<algorithm> #include<cstdio> using namespace std; //精度 double eps=1e-8; //精度比较 int sgn(double x) { if(fabs(x)<=eps)return 0; if(x<0)return -1; return 1; } //点的封装 struct Point { double x,y; Point (){} //赋值 Point (double _x,double _y) { x=_x; y=_y; } //点相减 Point operator -(const Point &b)const { return Point (x-b.x,y-b.y); } //点积 double operator *(const Point &b)const { return x*b.x+y*b.y; } //叉积 double operator ^(const Point &b)const { return x*b.y-y*b.x; } } ; //线的封装 struct Line { Point s,e; Line (){} Line (Point _s,Point _e) { s=_s; e=_e; } //平行和重合判断 相交输出交点/ Point operator &(const Line &b)const{ Point res=b.s; if(sgn((e-s)^(b.e-b.s))==0) { return Point(1000,0); } double t=((e-s)^(s-b.s))/((e-s)^(b.e-b.s)); res.x+=(b.e.x-b.s.x)*t; res.y+=(b.e.y-b.s.y)*t; return res; } }; //向量叉积 double xmult(Point p0,Point p1,Point p2) { return (p0-p1)^(p2-p1); } //线段和线段非严格相交,相交时true//注意此处是线段 bool seg_seg(Line l1,Line l2) { return sgn(xmult(l1.s,l2.s,l2.e)*xmult(l1.e,l2.s,l2.e))<=0&&sgn(xmult(l2.s,l1.s,l1.e)*xmult(l2.e,l1.s,l1.e))<=0; } //两点之间的距离 double dist(Point a,Point b) { return sqrt((a-b)^(a-b)); } ////极角排序;对100个点进行极角排序 //int pos;//极点下标 //Point p[100]; //bool cmp(Point a,Point b) //{ // double tmp=sgn((a-p[pos])^(b-p[pos]));//按照逆时针方向进行排序 // if(tmp==0)return dist(a,p[pos])<dist(b,p[[pos]); // if(tmp<0)return false ; // return true; //} Line line1,line2; int main () { int n; cin>>n; while(n--) { cin>>line1.s.x>>line1.s.y>>line1.e.x>>line1.e.y; cin>>line2.s.x>>line2.s.y>>line2.e.x>>line2.e.y; if(seg_seg(line1,line2)==false) { printf("%.2f\n",0.0); continue; } if(line1.s.y==line1.e.y||line2.s.y==line2.e.y) { // cout<<1<<endl; printf("%.2f\n",0.0); continue; } Point point= line1&line2; if(point.x==1000) { //cout<<2<<endl; printf("%.2f\n",0.0); continue; } if(line1.s.y<line1.e.y) { swap(line1.s.x,line1.e.x); swap(line1.s.y,line1.e.y); } if(line2.s.y<line2.e.y) { swap(line2.s.x,line2.e.x); swap(line2.s.y,line2.e.y); } if(seg_seg(Line(line1.s,Point(line1.s.x,1000.0)),line2)) { printf("0.00\n"); continue; } if(seg_seg(Line(line2.s,Point(line2.s.x,1000.0)),line1)) { printf("0.00\n"); continue; } if(line1.s.y<line2.s.y) { Point p=Line(Point(1000,line1.s.y),line1.s)&line2; printf("%.2f\n",fabs(xmult(line1.s,p,point))/2+eps); } else { Point p=Line(Point(1000,line2.s.y),line2.s)&line1; printf("%.2f\n",fabs(xmult(p,line2.s,point))/2+eps); } } return 0; }
poj 2826An Easy Problem?!(细节题,没做出来,把网上的坑都填了还是过不了)
猜你喜欢
转载自www.cnblogs.com/zwx7616/p/11232064.html
今日推荐
周排行