[计算几何]矩形

题目描述

这里写图片描述
这里写图片描述

分析

没有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);
    }
}

猜你喜欢

转载自blog.csdn.net/ssl_qyh0ice/article/details/81071474