码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 4998

时间:2014-09-13 23:59:26      阅读:355      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   io   os   java   ar   

Rotate

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 194    Accepted Submission(s): 101
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
 
 
题目意思:
给n次操作,每次操作为x, y, p即绕点(x,y)旋转p度,经过n次旋转后  相当于绕某个固定点旋转多少度,求固定点坐标和旋转度数。
 
思路:
很容易发现不管怎么旋转旋转度数相加就是最终度数(>=2*PI时减去2*PI就行了),那么咱们虚拟一个起始点,然后模拟旋转操作,最后得到一个虚拟终点,又虚拟起点和虚拟终点再加上旋转度数就能算出目标坐标了。
 
比赛的一开始的时候这个思路就想出来了,但是我队擅长数学的那个家伙在寝室睡觉。。。无奈数学是硬伤,不知道怎么算。。后来在百度上发现了一个公式 http://jingyan.baidu.com/article/2c8c281dfbf3dd0009252a7b.html  ,才把这道题搞出来。。。
 
由公式可以算出虚拟终点,又虚拟起点和旋转度数已知再代入那个公式中 , 两个式子算两个未知量,很好算把。。。只是敲代码时细心点,一不小心就错了。。。
 
 
代码:
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
using namespace std;

#define PI acos(-1)

main()
{
     double stx, sty, endx, endy, x, y, p, endp, xx, yy;
     int t, n, i, j, k;
     cin>>t;
     while(t--){
         cin>>n;
         stx=sty=xx=yy=endp=0;//(stx,sty)是虚拟起点,(endx,endy)是虚拟终点 
         while(n--){
              scanf("%lf %lf %lf",&x,&y,&p);
              endp+=p;
              if(endp>=2*PI) endp-=2*PI;
              endx=(xx-x)*cos(p)-(yy-y)*sin(p)+x;
              endy=(xx-x)*sin(p)+(yy-y)*cos(p)+y;
              xx=endx;yy=endy;
        }
        //再把虚拟起点和虚拟终点代入上面公式中化简就得出下面很长。。很长。。的式子了 
        x=((endx-stx*cos(endp)+sty*sin(endp))*(1-cos(endp))-(endy-stx*sin(endp)-sty*cos(endp))*sin(endp))/(2-2*cos(endp));
        y=((endx-stx*cos(endp)+sty*sin(endp))*(1-cos(endp))-(1-cos(endp))*(1-cos(endp))*x)/((1-cos(endp))*sin(endp));
        printf("%.10lf %.10lf %.10lf\n",x,y,endp);
     }    
}

 

HDU 4998

标签:des   style   blog   http   color   io   os   java   ar   

原文地址:http://www.cnblogs.com/qq1012662902/p/3970456.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!