• hdu 4998 Rotate 点的旋转 银牌题


    Rotate

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 1232    Accepted Submission(s): 545
    Special Judge


    Problem Description
    Noting is more interesting than rotation!

    Your little sister likes to rotate things. To put it easier to analyze, your sister makes n rotations. In the i-th time, she makes everything in the plane rotate counter-clockwisely around a point ai by a radian of pi.

    Now she promises that the total effect of her rotations is a single rotation around a point A by radian P (this means the sum of pi is not a multiplier of 2π).

    Of course, you should be able to figure out what is A and P :).
     
    Input
    The first line contains an integer T, denoting the number of the test cases.

    For each test case, the first line contains an integer n denoting the number of the rotations. Then n lines follows, each containing 3 real numbers x, y and p, which means rotating around point (x, y) counter-clockwisely by a radian of p.

    We promise that the sum of all p's is differed at least 0.1 from the nearest multiplier of 2π.

    T<=100. 1<=n<=10. 0<=x, y<=100. 0<=p<=2π.
     
    Output
    For each test case, print 3 real numbers x, y, p, indicating that the overall rotation is around (x, y) counter-clockwisely by a radian of p. Note that you should print p where 0<=p<2π.

    Your answer will be considered correct if and only if for x, y and p, the absolute error is no larger than 1e-5.
     
    Sample Input
    1 3 0 0 1 1 1 1 2 2 1
     
    Sample Output
    1.8088715944 0.1911284056 3.0000000000
     
    Source
    题意:在平面上给你n个点,每个点都有一个对应的弧度,问整个平面依次绕每个点逆时针旋转对应的弧度
    最后相当于对哪个点旋转了多少弧度?
    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <iostream>
    #include <cmath>
    #include <map>
    #include <bitset>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <bitset>
    #include <set>
    
    #define MM(a,b) memset(a,b,sizeof(a));
    #define inf 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    #define CT continue
    #define SC scanf
    
    const double eps=1e-8;
    const double pi=acos(-1);
    int cas,n;
    
    struct Point{
       double x,y,pi;
       void read(){
          SC("%lf%lf%lf",&x,&y,&pi);
       }
    }p[15];
    
    int dcmp(double a)
    {
       if(fabs(a)<eps) return 0;
       else return a>0?1:-1;
    }
    
    double dot(Point a,Point b)
    {
        return a.x*b.x+a.y*b.y;
    }
    
    double Length(Point a)
    {
       return sqrt(a.x*a.x+a.y*a.y);
    }
    
    Point operator*(double k,Point a)
    {
       return  (Point){k*a.x,k*a.y,0};
    }
    
    Point operator-(Point a,Point b)
    {
       return (Point){a.x-b.x,a.y-b.y,0};
    }
    
    Point operator+(Point a,Point b)
    {
        return (Point){a.x+b.x,a.y+b.y,0};
    }
    
    Point Rotate(Point a,double rad)
    {
       return (Point){a.x*cos(rad)-a.y*sin(rad),a.x*sin(rad)+a.y*cos(rad),0};
    }
    
    Point Normal(Point a)
    {
        double L=Length(a);
        return (Point){-a.y/L,a.x/L,0};
    }
    
    void R(Point &s,Point &t,Point &nor,Point &mid)
    {
        s=p[0];
        for(int i=1;i<=n;i++){
            Point v=p[0]-p[i];
            v=Rotate(v,p[i].pi);
            p[0]=p[i]+v;
        }
        t=p[0];
        nor=Normal(t-s),mid=(Point){(s.x+t.x)/2,(s.y+t.y)/2,0};
    }
    
    double cross(Point a,Point b)
    {
        return a.x*b.y-b.x*a.y;
    }
    
    Point Getlineintersection(Point p,Point v,Point q,Point w)
    {
        Point u=p-q;
        double t=cross(w,u)/cross(v,w);
        return p+t*v;
    }
    
    int main()
    {
        SC("%d",&cas);
        while(cas--)
        {
            SC("%d",&n);
            for(int i=1;i<=n;i++) p[i].read();
            Point s1,t1,s2,t2,nor1,nor2,mid1,mid2,o;
            p[0]={12,9,0};
            R(s1,t1,nor1,mid1);
            p[0]={3,17,0};
            R(s2,t2,nor2,mid2);
    
            o=Getlineintersection(mid1,nor1,mid2,nor2);
            Point os=s1-o,ot=t1-o;
    
            double ang,ang1=atan2(os.y,os.x),ang2=atan2(ot.y,ot.x);
            if(dcmp(ang1-ang2)>0) ang=ang1-ang2;
            else ang=ang2-ang1;
    
            if(dcmp(cross(t1-s1,o-s1))>0){
               if(dcmp(ang-pi)>0) ang=2*pi-ang;
            }
            else {
               if(dcmp(pi-ang)>0) ang=2*pi-ang;
            }
    
            if(dcmp(o.x)==0) o.x=0;
            if(dcmp(o.y)==0) o.y=0;
            printf("%.10f %.10f %.10f
    ",o.x,o.y,ang);
        }
        return 0;
    }
    

      1.因为题目保证有解,所以在平面上任取两点,求出旋转后的弧度,那么最后选装的圆心必定在两条

    从起点到终点的中垂线上

          2.找到圆心后,再依据圆心在向量st的左侧还是右侧确定旋转的弧度是>pi还是小于pi。

          3.最后因为double表示数据时,0可能是2*1e-30,按%.10f输出则是-0.00000000,所以需要

    在最后判断一下。

  • 相关阅读:
    RPMBUILD源码打包资源汇总(转)
    grep命令:查看配置文件未注释行(转)
    数据结构实验之查找三:树的种类统计(SDUT 3375)
    数据结构实验之查找三:树的种类统计(SDUT 3375)
    数据结构实验之查找四:二分查找(SDUT 3376)
    数据结构实验之查找五:平方之哈希表 (SDUT 3377)
    数据结构实验之查找一:二叉排序树 (SDUT 3373)
    python 正则表达式
    python #!/usr/bin/python 的作用
    欢迎使用CSDN的markdown编辑器
  • 原文地址:https://www.cnblogs.com/smilesundream/p/5932239.html
Copyright © 2020-2023  润新知