codeforces281CRectangle Puzzle+矩形旋转+面积交

来源:互联网 发布:ubuntu 17.04 163源 编辑:程序博客网 时间:2024/06/06 19:43

Description

You are given two rectangles on a plane. The centers of both rectangles are located in the origin of coordinates (meaning the center of the rectangle’s symmetry). The first rectangle’s sides are parallel to the coordinate axes: the length of the side that is parallel to the Ox axis, equals w, the length of the side that is parallel to the Oy axis, equals h. The second rectangle can be obtained by rotating the first rectangle relative to the origin of coordinates by angle α.
这里写图片描述
Your task is to find the area of the region which belongs to both given rectangles. This region is shaded in the picture.

Input

The first line contains three integers w, h, α (1 ≤ w, h ≤ 106; 0 ≤ α ≤ 180). Angle α is given in degrees.

Output

In a single line print a real number — the area of the region which belongs to both given rectangles.

The answer will be considered correct if its relative or absolute error doesn’t exceed 10 - 6.

Sample Input
Input

1 1 45

Output

0.828427125

Input

6 4 30

Output

19.668384925

Hint

The second sample has been drawn on the picture above.

弱菜表示什么都不会,看了qscqesze的题解,,然并卵!寥寥几行代码。。什么小学数学。我不造啊!
转眼想了一下,就是关于原点旋转嘛,,全部点都旋转一下好了。就得到了新的矩形,然后多边形面积交一下就好了。。。
好了不说。直接把自己模板抠出来一贴,完了。

#include<cstdio>#include<cmath>#include<cstring>#include<iostream>#include<algorithm>#include<cstdlib>#include<queue>#include<map>#include<stack>#include<set>using namespace std;const int maxn=555;const int maxisn=10;const double eps=1e-8;const double pi=acos(-1.0);int dcmp(double x){    if(x>eps) return 1;    return x<-eps ? -1 : 0;}inline double Sqr(double x){    return x*x;}struct Point{    double x,y;    Point(){x=y=0;}    Point(double x,double y):x(x),y(y){};    friend Point operator + (const Point &a,const Point &b) {        return Point(a.x+b.x,a.y+b.y);    }    friend Point operator - (const Point &a,const Point &b) {        return Point(a.x-b.x,a.y-b.y);    }    friend bool operator == (const Point &a,const Point &b) {        return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;    }    friend Point operator * (const Point &a,const double &b) {        return Point(a.x*b,a.y*b);    }    friend Point operator * (const double &a,const Point &b) {        return Point(a*b.x,a*b.y);    }    friend Point operator / (const Point &a,const double &b) {        return Point(a.x/b,a.y/b);    }    friend bool operator < (const Point &a, const Point &b) {        return a.x < b.x || (a.x == b.x && a.y < b.y);    }    inline double dot(const Point &b)const{        return x*b.x+y*b.y;    }    inline double cross(const Point &b,const Point &c)const{        return (b.x-x)*(c.y-y)-(c.x-x)*(b.y-y);    }};Point LineCross(const Point &a,const Point &b,const Point &c,const Point &d){    double u=a.cross(b,c),v=b.cross(a,d);    return Point((c.x*v+d.x*u)/(u+v),(c.y*v+d.y*u)/(u+v));}double PolygonArea(Point p[],int n){     if(n<3) return 0.0;     double s=p[0].y*(p[n-1].x-p[1].x);     p[n]=p[0];     for(int i=1;i<n;i++){        s+=p[i].y*(p[i-1].x-p[i+1].x);     }     return fabs(s*0.5);}double CPIA(Point a[],Point b[],int na,int nb){    Point p[maxisn],temp[maxisn];    int i,j,tn,sflag,eflag;    a[na]=a[0],b[nb]=b[0];    memcpy(p,b,sizeof(Point)*(nb+1));    for(i=0;i<na&&nb>2;++i){        sflag=dcmp(a[i].cross(a[i+1],p[0]));        for(j=tn=0;j<nb;++j,sflag=eflag){            if(sflag>=0) temp[tn++]=p[j];            eflag=dcmp(a[i].cross(a[i+1],p[j+1]));            if((sflag^eflag)==-2)                temp[tn++]=LineCross(a[i],a[i+1],p[j],p[j+1]);        }        memcpy(p,temp,sizeof(Point)*tn);        nb=tn,p[nb]=p[0];    }    if(nb<3) return 0.0;    return PolygonArea(p,nb);}double SPIA(Point a[],Point b[],int na,int nb){    int i,j;    Point t1[4],t2[4];    double res=0.0,if_clock_t1,if_clock_t2;    a[na]=t1[0]=a[0];    b[nb]=t2[0]=b[0];    for(i=2;i<na;i++){        t1[1]=a[i-1],t1[2]=a[i];        if_clock_t1=dcmp(t1[0].cross(t1[1],t1[2]));        if(if_clock_t1<0) swap(t1[1],t1[2]);        for(j=2;j<nb;j++){            t2[1]=b[j-1],t2[2]=b[j];            if_clock_t2=dcmp(t2[0].cross(t2[1],t2[2]));            if(if_clock_t2<0) swap(t2[1],t2[2]);            res+=CPIA(t1,t2,3,3)*if_clock_t1*if_clock_t2;        }    }    return res;//面积交    //return PolygonArea(a,na)+PolygonArea(b,nb)-res;//面积并}//op沿远点逆时针旋转角度A//A*pi/180Point rotate_point(const Point &p,double A) {    double tx=p.x,ty=p.y;    return Point(tx*cos(A)-ty*sin(A),tx*sin(A)+ty*cos(A));}Point a[22],b[22];int main(){    double w,h,A;    while(cin>>w>>h>>A){        w=w*0.5;        h=h*0.5;        a[0].x=w,a[0].y=h;        a[1].x=-w,a[1].y=h;        a[2].x=-w,a[2].y=-h;        a[3].x=w,a[3].y=-h;        b[0]=rotate_point(a[0],A*pi/180);        b[1]=rotate_point(a[1],A*pi/180);        b[2]=rotate_point(a[2],A*pi/180);        b[3]=rotate_point(a[3],A*pi/180);        printf("%.9f\n",SPIA(a,b,4,4));    }    return 0;}
0 0
原创粉丝点击