poj 2826An Easy Problem?!(细节题,没做出来,把网上的坑都填了还是过不了)

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std;

//精度
double eps=1e-8;

//精度比较
int sgn(double x)
{
    if(fabs(x)<=eps)return 0;
    if(x<0)return -1;
    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.x+y*b.y;
    }
    //叉积
    double operator ^(const Point &b)const
    {
        return x*b.y-y*b.x;
    }
} ;

//线的封装
struct Line
{
    Point s,e;
    Line (){}
    Line (Point _s,Point _e)
    {
        s=_s;
        e=_e;
    }
    //平行和重合判断 相交输出交点/
    Point operator &(const Line &b)const{
    Point res=b.s;
    if(sgn((e-s)^(b.e-b.s))==0)
    {
            return Point(1000,0);

    }
    double t=((e-s)^(s-b.s))/((e-s)^(b.e-b.s));
    res.x+=(b.e.x-b.s.x)*t;
    res.y+=(b.e.y-b.s.y)*t;
    return res;
    }
};

//向量叉积
double xmult(Point p0,Point p1,Point p2)
{
    return (p0-p1)^(p2-p1);
}

//线段和线段非严格相交,相交时true//注意此处是线段
bool seg_seg(Line l1,Line l2)
{
    return sgn(xmult(l1.s,l2.s,l2.e)*xmult(l1.e,l2.s,l2.e))<=0&&sgn(xmult(l2.s,l1.s,l1.e)*xmult(l2.e,l1.s,l1.e))<=0;
}

//两点之间的距离
double dist(Point a,Point b)
{
    return sqrt((a-b)^(a-b));
}

////极角排序;对100个点进行极角排序
//int pos;//极点下标
//Point p[100];
//bool cmp(Point a,Point b)
//{
//    double tmp=sgn((a-p[pos])^(b-p[pos]));//按照逆时针方向进行排序
//    if(tmp==0)return dist(a,p[pos])<dist(b,p[[pos]);
//    if(tmp<0)return false ;
//    return true;
//} 
Line line1,line2;
int main ()
{
    int n;
    cin>>n;
    while(n--)
    {
        cin>>line1.s.x>>line1.s.y>>line1.e.x>>line1.e.y;
        cin>>line2.s.x>>line2.s.y>>line2.e.x>>line2.e.y;
    if(seg_seg(line1,line2)==false)
    {
        printf("%.2f\n",0.0);
        continue;

    }
    if(line1.s.y==line1.e.y||line2.s.y==line2.e.y)
    {
        // cout<<1<<endl;
        printf("%.2f\n",0.0);
        continue;

    }
    Point point= line1&line2;
    if(point.x==1000)
    {
        //cout<<2<<endl;
        printf("%.2f\n",0.0);
        continue;

    }
    if(line1.s.y<line1.e.y)
    {
        swap(line1.s.x,line1.e.x);
        swap(line1.s.y,line1.e.y);
    }
     if(line2.s.y<line2.e.y)
     {
         swap(line2.s.x,line2.e.x);
         swap(line2.s.y,line2.e.y);
     }
     if(seg_seg(Line(line1.s,Point(line1.s.x,1000.0)),line2))
     {
         printf("0.00\n");
         continue;
     }
     if(seg_seg(Line(line2.s,Point(line2.s.x,1000.0)),line1))
     {
         printf("0.00\n");
         continue;
     }
     if(line1.s.y<line2.s.y)
        {
            Point p=Line(Point(1000,line1.s.y),line1.s)&line2;
             printf("%.2f\n",fabs(xmult(line1.s,p,point))/2+eps);
        }
    else
       {
           Point p=Line(Point(1000,line2.s.y),line2.s)&line1;
            printf("%.2f\n",fabs(xmult(p,line2.s,point))/2+eps);
       }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zwx7616/p/11232064.html