题意:给一个平面,将平面旋转n次,每次旋转都是围绕一个点,得到平面D,求围绕一个点转rad弧度得到平面D。
思路分析:每次旋转平面,平面上的点都会跟着一起转动,旋转角度可以确定,等于每次旋转的弧度之和。在平面上任取一个点,模拟每次旋转得到终点。然后初始点、终点、弧度确定,然后求旋转中心。解一个方程就可以了
代码如下:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<cstring>
#include<string>
#define inf 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 10e-6
using namespace std;
struct point
{
double x,y;
point(double a = 0,double b = 0):x(a),y(b){ }
};
typedef point vector;
vector operator -(point a,point b)
{
return vector(a.x-b.x,a.y-b.y);
}
vector rotation(vector A,double rad)//向量A旋转rad个弧度
{
return vector(A.x*cos(rad)-A.y*sin(rad), A.x*sin(rad)+A.y*cos(rad) );
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,i;
scanf("%d",&n);
point a(0,0);
double sum = 0;
for(i = 0; i < n; i++)
{
point b;
double rad;
scanf("%lf%lf%lf",&b.x,&b.y,&rad);
sum += rad;
vector A = b-a;
vector B = rotation(A,rad);
a = b-B;
}
while(sum-2*pi > eps) sum-=2*pi;
double c = a.x - a.y*sin(sum)/(1-cos(sum));
double d = 1 - cos(sum) + sin(sum)*sin(sum)/(1-cos(sum));
double resx = c/d;
double resy = (resx*sin(sum) + a.y)/(1-cos(sum));
printf("%.9lf %.9lf %.9lf\n",resx,resy,sum);
}
return 0;
}