题意:给你两根线段,问能装多少雨水。
这题要比较线与水平面的角度的大小。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
const double INF = 1e20;
const double EPS = 1e-6;
bool zero(double t)
{
return -EPS<t&&t<EPS;
}
struct cvector{
double x,y;
cvector(double a,double b){x=a,y=b;}
cvector(){}
};
cvector operator+(cvector a,cvector b){
return cvector(a.x+b.x,a.y+b.y);
}
cvector operator-(cvector a,cvector b){
return cvector(a.x-b.x,a.y-b.y);
}
cvector operator*(double a,cvector b){
return cvector(a*b.x,a*b.y);
}
double operator*(cvector a,cvector b){
return a.x*b.x+a.y*b.y;
}
double operator^(cvector a,cvector b){
return a.x*b.y-b.x*a.y;
}
double length(double t){return t>=0?t:-t;}
double length(cvector t){return sqrt(t*t);}
struct cpoint{
double x,y;
cpoint(double a,double b){x=a,y=b;}
cpoint(){}
};
cvector operator-(cpoint a,cpoint b){
return cvector(a.x-b.x,a.y-b.y);
}
double dist(cpoint a,cpoint b){
return length(a-b);
}
struct cline{
cpoint a,b;
};
bool intersect(cline a,cline b){
if(zero((a.a-a.b)^(b.a-b.b))) return false;
return ((a.a-b.a)^(b.b-b.a))*((a.b-b.a)^(b.b-b.a))<EPS
&&((b.a-a.a)^(a.b-a.a))*((b.b-a.a)^(a.b-a.a))<EPS;
}
cpoint inter(cline a,cline b)
{
double x,y;
y=((b.a.x-a.a.x)*(a.b.y-a.a.y)*(b.b.y-b.a.y)+(a.b.x-a.a.x)*(b.b.y-b.a.y)*a.a.y-(a.b.y-a.a.y)*(b.b.x-b.a.x)*b.a.y)/((a.b-a.a)^(b.b-b.a));
x=((b.a.y-a.a.y)*(a.b.x-a.a.x)*(b.b.x-b.a.x)+(a.b.y-a.a.y)*(b.b.x-b.a.x)*a.a.x-(a.b.x-a.a.x)*(b.b.y-b.a.y)*b.a.x)/((b.b-b.a)^(a.b-a.a));
return cpoint(x,y);
}
bool over(cvector a,cvector b)
{
if(a.x*b.x<EPS) return false;
if((1/length(a)*(a.y))>(1/length(b)*(b.y))&&fabs(a.x)>=fabs(b.x)) return true;
if((1/length(a)*(a.y))<(1/length(b)*(b.y))&&fabs(b.x)>=fabs(a.x)) return true;
return false;
}
int main()
{
freopen("in.txt","r",stdin);
int cas;
cline l1,l2;
scanf("%d",&cas);
while(cas--)
{
scanf("%lf%lf%lf%lf",&l1.a.x,&l1.a.y,&l1.b.x,&l1.b.y);
scanf("%lf%lf%lf%lf",&l2.a.x,&l2.a.y,&l2.b.x,&l2.b.y);
if(!intersect(l1,l2))
{
printf("0.00\n");continue;
}
cpoint x = inter(l1,l2);
// cout<<x.x<<" - "<<x.y<<endl;
cvector a,b;
if(l1.a.y>x.y) a=(l1.a-x);
else a=(l1.b-x);
if(l2.a.y>x.y) b=(l2.a-x);
else b=(l2.b-x);
if(a.y<=0||b.y<=0||over(a,b))
{
printf("0.00\n");continue;
}
if(a.y>b.y)
{
a = (b.y/a.y)*(a);
}
else
{
b= (a.y/b.y)*(b);
}
printf("%.2lf\n",fabs(length(a^b)/2)+EPS);
}
return 0;
}