首页 > 代码库 > POJ 2826 An Easy Problem? 判断线段相交

POJ 2826 An Easy Problem? 判断线段相交

POJ 2826 An Easy Problem?! -- 思路来自kuangbin博客

下面三种情况比较特殊,特别是第三种

技术分享

G++怎么交都是WA,同样的代码C++A了

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const double eps = 1e-8;const double PI = acos(-1.0);const double INF = 1e5;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 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;}Point pot[105],peg;double rad;int main(){//    freopen("in.txt","r",stdin);    int t;    double x1,y1,x2,y2;    scanf("%d",&t);    while(t--)    {        scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);        Line L1=Line(Point(x1,y1),Point(x2,y2));        scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);        Line L2=Line(Point(x1,y1),Point(x2,y2));        if(sgn(L1.p.y - L1.q.y)==0 || sgn(L2.p.y - L2.q.y)==0)        {            puts("0.00");            continue;        }        if(!inter(L1,L2))        {            puts("0.00");            continue;        }        if(sgn(L1.p.y - L1.q.y) < 0) swap(L1.p,L1.q);        if(sgn(L2.p.y - L2.q.y) < 0) swap(L2.p,L2.q);        if(inter(Line(L1.p,Point(L1.p.x,INF)),L2))        {            puts("0.00");            continue;        }        if(inter(Line(L2.p,Point(L2.p.x,INF)),L1))        {            puts("0.00");            continue;        }        pair<int,Point> pr=L1 & L2;        Point cp=pr.second;        pr=Line(L1.p,Point(INF,L1.p.y)) & L2;        double ans=fabs((L1.p-cp)^(pr.second-cp))/2;        pr=Line(L2.p,Point(INF,L2.p.y)) & L1;        ans=min(ans,fabs((L2.p-cp)^(pr.second-cp))/2);        printf("%.2lf\n",ans);    }    return 0;}

 

POJ 2826 An Easy Problem? 判断线段相交