Link:
A:
一眼看上去分两类就可以了
1、每个矩形只有两条边相交,重合的形状为菱形
2、每个矩形四条边都有相交
对于情况1答案为$h*h/sin(a)$
对于情况2可以列出一个二元一次方程组,手动解一下就好了
不过计算几何确实容易写挂啊……
有几个注意点:
1、对于情况1$h$指的是较短的边,不符合时要交换$w,h$
以后处理长方形时还是要注意,不能只看样例啊
2、在判断情况1,2的临界点时用$sin$来判断,因为此时$a$已经全转为锐角了
#include <bits/stdc++.h> using namespace std; #define X first #define Y second #define PI M_PI typedef long long ll; typedef pair<int,int> P; double w,h,a,x,y,res; int main() { scanf("%lf%lf%lf",&w,&h,&a); if(!a||a>=180) return printf("%.9lf",w*h),0; if(a>90) a=180-a; if(h>w) swap(w,h);//情况1要求h是短边 a=a*PI/180; if(sin(a)>=sin(2*atan2(w,h)))//由于角度已改变,用sin判断 res=h*h/sin(a); else y=(h*(cos(a)+1)-w*sin(a))/((cos(a)+1)*(cos(a)+1)-sin(a)*sin(a)), x=(h-y*(cos(a)+1))/sin(a),res=w*h-(x*x+y*y)*sin(a)*cos(a); printf("%.9lf",res); return 0; }