题目描述

分析
没有ZZY大佬那么强的数学功底,我只能暴力啦!
显然a=90°时答案等于b^2,a=0°或a=180°时答案等于原矩形
然后分类讨论,我们根据样例提示的矩形开始推
证完全等以后我们发现原矩形缺的四个角可以拼成两个矩形
于是暴力求出四个交点,计算小矩形面积再减掉即可
然后我们考虑另一种情况,即矩形不再是少了四个角而是少了两个四边形的情况
在中间的矩形一定是平行四边形,高我们知道了,就是h
那么我们求交点得到底即可
【推荐百度:点旋转公式,直线方程和两条直线求交点】
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;
const double pi=3.141592654;
double w,h,ag;
struct Point {
double x,y;
}a,b,c,d,a1,b1,c1,d1;
struct Line {
double a,b,c;
}ab,a1b1,b1d1,a1c1,ac,bd;
int main() {
scanf("%lf%lf",&w,&h);
ag=w;w=max(w,h);h=min(ag,h);
scanf("%lf",&ag);
if (ag==90) {
printf("%.9lf",h*h);
return 0;
}
if (ag==0||ag==180) {
printf("%.9lf",w*h);
return 0;
}
if (ag>90) ag=180-ag;
ag=ag*pi/180;
a.x=w/2;a.y=h/2;
b.x=a.x;b.y=-a.y;
c.x=-a.x;c.y=a.y;
d.x=-a.x;d.y=-a.y;
double cosd=cos(ag),sind=sin(ag);
a1.x=a.x*cosd-a.y*sind;a1.y=a.x*sind+a.y*cosd;
b1.x=b.x*cosd-b.y*sind;b1.y=b.x*sind+b.y*cosd;
c1.x=c.x*cosd-c.y*sind;c1.y=c.x*sind+c.y*cosd;
d1.x=d.x*cosd-d.y*sind;d1.y=d.x*sind+d.y*cosd;
ab.a=b.y-a.y;ab.b=a.x-b.x;ab.c=b.x*a.y-b.y*a.x;
ac.a=c.y-a.y;ac.b=a.x-c.x;ac.c=c.x*a.y-c.y*a.x;
bd.a=d.y-b.y;bd.b=b.x-d.x;bd.c=d.x*b.y-d.y*b.x;
a1b1.a=b1.y-a1.y;a1b1.b=a1.x-b1.x;a1b1.c=b1.x*a1.y-b1.y*a1.x;
b1d1.a=d1.y-b1.y;b1d1.b=b1.x-d1.x;b1d1.c=d1.x*b1.y-d1.y*b1.x;
if (c1.x>d.x&&c1.x<b.x&&d1.x>d.x&&d1.x<b.x) {
a1c1.a=c1.y-a1.y;a1c1.b=a1.x-c1.x;a1c1.c=c1.x*a1.y-c1.y*a1.x;
Point e,f;
e.x=(a1c1.b*bd.c-bd.b*a1c1.c)/(a1c1.a*bd.b-bd.a*a1c1.b);
f.x=(b1d1.b*bd.c-bd.b*b1d1.c)/(b1d1.a*bd.b-bd.a*b1d1.b);
printf("%.9lf",(f.x-e.x)*h);
}
else {
Point e,f,g,h1;
e.x=(a1b1.b*ac.c-ac.b*a1b1.c)/(a1b1.a*ac.b-ac.a*a1b1.b);
f.y=(ab.a*a1b1.c-a1b1.a*ab.c)/(a1b1.a*ab.b-ab.a*a1b1.b);
g.y=(ab.a*b1d1.c-b1d1.a*ab.c)/(b1d1.a*ab.b-ab.a*b1d1.b);
h1.x=(b1d1.b*bd.c-bd.b*b1d1.c)/(b1d1.a*bd.b-bd.a*b1d1.b);
double s1=(a.x-e.x)*(a.y-f.y),s2=(g.y-b.y)*(b.x-h1.x);
printf("%.9lf",w*h-s1-s2);
}
}
1530

被折叠的 条评论
为什么被折叠?



