您的位置:首页 > 其它

2016-05-27 13:54 141 查看
在电影里面,我们经常可以看到武士们拔出刀,然后一刀斩下去,结果………………………………一张纸片被砍成了两半,囧…………
而在本题中,我们需要计算一下被斩下去较小的那一部分的面积。
我们假设纸片是矩形的,平行于坐标轴的,武士砍纸片的轨迹是一条直线。


Input

第一行一个整数N(2<=N<=350),表示数据组数。
接下来一行,每行7个整数,xl,yl,xr,yr,a,b,c
,表分别表示矩形左下角坐标(xl,yl),右上角坐标(xr,yr),以及轨迹方程ax+by+c=0。整数的绝对值均小于200。


Output

对于每一组数据,输出一个三位小数,表示砍后较小那部分的面积。数据保证这个面积大于0.001。


Sample Input

3
1 1 3 3 -1 1 0
1 1 3 4 -1 1 0
1 2 3 4 -1 1 0


Sample Output

2.000
2.000
0.500
题解:先计算出与矩形上下左右的交点,再判断相交于哪条边。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--){
double S,s;
double x1,y1,x2,y2,a,b,c;
double Xy1,Xy2,x1Y,x2Y;
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
scanf("%lf%lf%lf",&a,&b,&c);
Xy1=(c+b*y1)*1.0/-a; //下边点
Xy2=(c+b*y2)*1.0/-a; //上边点
x1Y=(c+a*x1)*1.0/-b; //左边点
x2Y=(c+a*x2)*1.0/-b; //右边点
// cout << Xy1 <<" "<< Xy2 <<" "<<x1Y<<" " <<x2Y<<endl;
bool f1,f2,f3,f4; //判断在哪条边
f1=(Xy1>=x1)&&(Xy1<=x2);
f2=(Xy2>=x1)&&(Xy2<=x2);
f3=(x1Y>=y1)&&(x1Y<=y2);
f4=(x2Y>=y1)&&(x2Y<=y2);
//梯形面积
if(f1&&f2){
s=(Xy1+Xy2-2*x1)*(y2-y1)/2.0;
}
else if(f3&&f4){ //左右平行边
s=(x1Y+x2Y-2*y1)*(x2-x1)/2.0;
}//三角形面积
else if(f1&&f3){ //下左相交
s=(Xy1-x1)*(x1Y-y1)/2.0;
}
else if(f1&&f4){//下右相交
s=(x2-Xy1)*(x2Y-y1)/2.0;
}
else if(f2&&f3){ //上左相交
s=(Xy2-x1)*(y2-x1Y)/2.0;
}
else if(f2&&f4){ //上右相交
s=(x2-Xy2)*(y2-x2Y)/2.0;
}
S=fabs(y2-y1)*(x2-x1);
s=min(s,S-s);
printf("%.3lf\n",s);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数学