链接 思路:直接套模板,判断线段与线段是否有交点

#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;
    }
}