HDU4998 Rotate (2014 ACM/ICPC Asia Regional Anshan Online)

bigbigship發表於2014-09-17

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=4998

題意:給定n個點 和n個角度 ,平面內一個點分別以這個點Point(i)為旋轉中心 逆時針旋轉 R(i)度

求最後相當於繞那個點旋轉多少度 求這個點的座標 以及旋轉的角度

一點(x,y)繞一個點(x0,y0)旋轉 r0 度的公式為

x1= (x - x0)*cos(r0) - (y - y0)*sin(r0)  + x0 ;
y1= (x - x0)*sin(r0) + (y - y0)*cos(r0) + y0 ;

最後旋轉點肯定是最後這兩條由(xs1,ys1) (xs2,xs2) 組成的直線 以及 由(xe1,ye1) (xe2,xe2) 垂直平分線的交點,ansr = (r1+r2+.....+rn)%(2*pi);

程式碼如下:

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

const double pi = acos(-1.0);

struct point{
    double x,y;
};

point calu(point a,point b,double r)
{
    point c;
    c.x = (a.x - b.x) * cos(r) - (a.y - b.y) * sin(r) + b.x;
    c.y = (a.x - b.x) * sin(r) + (a.y - b.y) * cos(r) + b.y;
    return c;
}

int main()
{
    int n,t;
    scanf("%d",&t);
    while(t--){
        point a,b,c,d;
        double r,ansr;
        scanf("%d",&n);
        a.x=a.y=0;
        b.x=b.y=1;
        ansr=0;
        for(int i=0;i<n;i++){
            scanf("%lf%lf%lf",&c.x,&c.y,&r);
            ansr+=r;
            if(ansr>=2*pi)
                ansr-=2*pi;
            a=calu(a,c,r);
            b=calu(b,c,r);
        }
        double t1 = (a.x*a.x+a.y*a.y)*(2*b.y-2)-2*a.y*(b.x*b.x+b.y*b.y)+4*a.y;
        double t2 = 4*a.y-4*a.y*b.x+4*a.x*b.y-4*a.x;
        double x = t1/t2;
        double t3 = (a.x*a.x+a.y*a.y)-2*x*a.x;
        double t4 = 2*a.y;
        double y = t3/t4;
        printf("%lf %lf %lf\n",x,y,ansr);
    }
    return 0;
}


相關文章