链接 思路:直接套模板,判断线段与线段是否有交点
#include <bits/stdc++.h>
using namespace std;
int T;
const double eps=1e-8;
int sgn(double x){
if(fabs(x)<eps) return 0;
if(x<0) return -1;
else 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.y -y*b.x;
}
//点积
double operator *(const Point &b)const{
return x*b.x+y*b.y;
}
};
struct Line{
Point s,e;
Line(){}
Line(Point _s,Point _e){
s=_s;
e=_e;
}
int segcrossseg(Line v){
int d1=sgn((e-s)^(v.s-s));
int d2=sgn((e-s)^(v.e-s));
int d3=sgn((v.e-v.s)^(s-v.s));
int d4=sgn((v.e-v.s)^(e-v.s));
if((d1^d2)==-2&&(d3^d4)==-2) return 2;
return (d1==0&&sgn((v.s-s)*(v.s-e))<=0)||
(d2==0&&sgn((v.e-s)*(v.e-e))<=0)||
(d3==0&&sgn((s-v.s)*(s-v.e))<=0)||
(d4==0&&sgn((e-v.s)*(e-v.e))<=0);
}
};
int main()
{
scanf("%d",&T);
while(T--){
double x1,y1,x2,y2,x3,y3,x4,y4;
scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
Line l1(Point(x1,y1),Point(x2,y2));
Line l2(Point(x3,y3),Point(x4,y4));
if(l1.segcrossseg(l2)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}