首页 > 代码库 > 直线与直线相交 直线与线段相交 线段与线段相交

直线与直线相交 直线与线段相交 线段与线段相交

 

int sgn(double x){    if(fabs(x) < eps) return 0;    return x < 0 ? -1: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 p,q;    Line() {};    Line(Point _p,Point _q)    {        p = _p,q = _q;    }    //两直线相交求交点    //第一个值为0表示直线重合,为1表示平行,为2表示相交    //只有第一个值为2时,交点才有意义    pair<int,Point> operator &(const Line &b)const    {        Point res = p;        if(sgn((p-q)^(b.p-b.q)) == 0)        {            if(sgn((p-b.q)^(b.p-b.q)) == 0)                return make_pair(0,res);//重合            else return make_pair(1,res);//平行        }        double t = ((p-b.p)^(b.p-b.q))/((p-q)^(b.p-b.q));        res.x += (q.x-p.x)*t;        res.y += (q.y-p.y)*t;        return make_pair(2,res);    }};//判断直线和线段相交bool Seg_inter_line(Line l1,Line l2) //判断直线l1和线段l2是否相交,<0是把交于线段端点处看做不相交{    return sgn((l2.p-l1.q)^(l1.p-l1.q))*sgn((l2.q-l1.q)^(l1.p-l1.q)) < 0;}//*判断线段相交bool inter(Line l1,Line l2){    return        max(l1.p.x,l1.q.x) >= min(l2.p.x,l2.q.x) &&        max(l2.p.x,l2.q.x) >= min(l1.p.x,l1.q.x) &&        max(l1.p.y,l1.q.y) >= min(l2.p.y,l2.q.y) &&        max(l2.p.y,l2.q.y) >= min(l1.p.y,l1.q.y) &&        sgn((l2.p-l1.q)^(l1.p-l1.q))*sgn((l2.q-l1.q)^(l1.p-l1.q)) <= 0 &&        sgn((l1.p-l2.q)^(l2.p-l2.q))*sgn((l1.q-l2.q)^(l2.p-l2.q)) <= 0;}

 

直线与直线相交 直线与线段相交 线段与线段相交