您的位置:首页 > 其它

POJ 2826 An Easy Problem?!

2016-01-23 13:28 369 查看
一个对精度要求比较高的题。

如果两个线段没交点,那么肯定是0。有交点也不一定就有水,水可以进不来。

最后答案要加一个eps,防止出现-0.00的答案

#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<list>
#include<algorithm>
using namespace std;

struct point
{
double x;
double y;
point(){}
point(double a,double b){x=a;y=b;}
};
struct Line
{
double a,b,c;
}line1,line2;

double a,b,c,d,e,f,g,h;
vector<point>v;
int T;

const double eps=1e-8;
#define zero(x)(((x)>0?(x):(-x))<eps)

double Area(point p0,point p1,point p2)
{
return fabs((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y))/2.0;
}

double xmult(point p1,point p2,point p0)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}

int dots_inline(point p1,point p2,point p3)
{
return zero(xmult(p1,p2,p3));
}

int same_side(point p1,point p2,point l1,point l2)
{
return xmult(l1,p1,l2)*xmult(l1,p2,l2)>eps;
}

int dot_online_in(point p,point l1,point l2)
{
return zero(xmult(p,l1,l2))&&(l1.x-p.x)*(l2.x-p.x)<eps&&(l1.y-p.y)*(l2.y-p.y)<eps;
}

int intersect_in(point u1,point u2,point v1,point v2)
{
if(!dots_inline(u1,u2,v1)||!dots_inline(u1,u2,v2)) return !same_side(u1,u2,v1,v2)&&!same_side(v1,v2,u1,u2);
return dot_online_in(u1,v1,v2)||dot_online_in(u2,v1,v2)||dot_online_in(v1,u1,u2)||dot_online_in(v2,u1,u2);
}

point jiaodian(double a,double b,double c,double d,double e,double f,double g,double h)
{
double X1=a,Y1=b,X2=c,Y2=d,X3=e,Y3=f,X4=g,Y4=h;
line1.a=Y2-Y1;
line1.b=X2-X1;
line1.c=Y2*(X2-X1)-X2*(Y2-Y1);

line2.a=Y4-Y3;
line2.b=X4-X3;
line2.c=Y4*(X4-X3)-X4*(Y4-Y3);

double ansX=1.0*(line1.b*line2.c-line2.b*line1.c)/(line1.a*line2.b-line2.a*line1.b);
double ansY=-1.0*(line2.a*line1.c-line1.a*line2.c)/(line1.a*line2.b-line2.a*line1.b);

point ret(ansX,ansY);
return ret;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
scanf("%lf%lf%lf%lf",&e,&f,&g,&h);
point p1(a,b);point p2(c,d);
point p3(e,f);point p4(g,h);

double ans=0.00000;
if(intersect_in(p1,p2,p3,p4))
{
point jiao=jiaodian(a,b,c,d,e,f,g,h);
v.clear();

if(p1.y>jiao.y&&fabs(p1.y-jiao.y)>eps) v.push_back(p1);
if(p2.y>jiao.y&&fabs(p2.y-jiao.y)>eps) v.push_back(p2);
if(p3.y>jiao.y&&fabs(p3.y-jiao.y)>eps) v.push_back(p3);
if(p4.y>jiao.y&&fabs(p4.y-jiao.y)>eps) v.push_back(p4);

if(v.size()==2)
{
if((v[0].x<=jiao.x&&v[1].x>=jiao.x)||(v[1].x<=jiao.x&&v[0].x>=jiao.x))
{
if(v[0].y>v[1].y) swap(v[0],v[1]);
point jiao2=jiaodian(v[0].x,v[0].y,20000,v[0].y,jiao.x,jiao.y,v[1].x,v[1].y);
ans=Area(jiao,jiao2,v[0]);
}
else
{

if(fabs((v[0].y-jiao.y)/(v[0].x-jiao.x))<fabs((v[1].y-jiao.y)/(v[1].x-jiao.x)))
swap(v[0],v[1]);

if(fabs(v[0].x-jiao.x)>=fabs(v[1].x-jiao.x)){}
else
{
if(v[0].y>v[1].y) swap(v[0],v[1]);
point jiao2=jiaodian(v[1].x,v[1].y,jiao.x,jiao.y,v[0].x,v[0].y,20000,v[0].y);
ans=Area(jiao,jiao2,v[0]);
}
}
}
}
printf("%.2f\n",ans+eps);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: