这是个很完善的模板O(∩_∩)O~
#include <stdio.h>
#include 
<math.h>
const int N = 100010;
int mark[N];
struct Point
{
    
double x,y;
};
struct stline
{
    Point a,b;
} line1,line2, p[N];

int dblcmp(double a,double b)
{
    
if (fabs(a-b)<=1E-6return 0;
    
if (a>b) return 1;
    
else return -1;
}
//***************点积判点是否在线段上***************
double dot(double x1,double y1,double x2,double y2) //点积
{
    
return x1*x2+y1*y2;
}

int point_on_line(Point a,Point b,Point c) //求a点是不是在线段bc上,>0不在,=0与端点重合,<0在。
{
    
return dblcmp(dot(b.x-a.x,b.y-a.y,c.x-a.x,c.y-a.y),0);
}
//**************************************************
double cross(double x1,double y1,double x2,double y2)
{
    
return x1*y2-x2*y1;
}
double ab_cross_ac(Point a,Point b,Point c) //ab与ac的叉积
{
    
return cross(b.x-a.x,b.y-a.y,c.x-a.x,c.y-a.y);
}
int ab_cross_cd (Point a,Point b,Point c,Point d) //求ab是否与cd相交,交点为p。1规范相交,0交点是一线段的端点,-1不相交。
{
    
double s1,s2,s3,s4;
    
int d1,d2,d3,d4;
    Point p;
    d1
=dblcmp(s1=ab_cross_ac(a,b,c),0);
    d2
=dblcmp(s2=ab_cross_ac(a,b,d),0);
    d3
=dblcmp(s3=ab_cross_ac(c,d,a),0);
    d4
=dblcmp(s4=ab_cross_ac(c,d,b),0);

//如果规范相交则求交点
    if ((d1^d2)==-2 && (d3^d4)==-2)
    {
        p.x
=(c.x*s2-d.x*s1)/(s2-s1);
        p.y
=(c.y*s2-d.y*s1)/(s2-s1);
        
return 1;
    }

//如果不规范相交
    if (d1==0 && point_on_line(c,a,b)<=0)
    {
        p
=c;
        
return 0;
    }
    
if (d2==0 && point_on_line(d,a,b)<=0)
    {
        p
=d;
        
return 0;
    }
    
if (d3==0 && point_on_line(a,c,d)<=0)
    {
        p
=a;
        
return 0;
    }
    
if (d4==0 && point_on_line(b,c,d)<=0)
    {
        p
=b;
        
return 0;
    }
//如果不相交
    return -1;
}