1 3 0 0 1 1 1 1 2 2 1
1.8088715944 0.1911284056 3.0000000000
绕(xf,yf)点的旋转变换
R代表 绕着(x,y)旋转θ度角。
R = R1 * R2 * ... * Rn
算出R的具体的值,代入公式并求解。
总结:这题对于精度的要求很严格,而且在求三角函数时,传是弧度,我传成角度了,样例一直出不来。
#include <cstring> #include <cstdio> #include <cmath> #define N 100 #define PI acos(-1) using namespace std; int n; struct Node { double x,y,p; }p[N],ans; double mat[N][3][3]; void multi(double sum[][3],double a[][3]) { double tmp[3][3]; for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { tmp[i][j] = 0; } } for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { for(int k = 0; k < 3; k++) { tmp[i][j] += sum[i][k] * a[k][j]; } } } memcpy(sum,tmp,sizeof(tmp)); } int main() { int T; double cosa,sina; scanf("%d",&T); while (T--) { scanf("%d",&n); ans.p = 0; for (int i = 0; i < n; i++) { scanf("%lf%lf%lf",&p[i].x,&p[i].y, &p[i].p); ans.p += p[i].p; if(ans.p >= 2 * PI) { ans.p -= 2 * PI; } cosa = cos(p[i].p); sina = sin(p[i].p); mat[i][0][0] = cosa; mat[i][0][1] = sina; mat[i][0][2] = 0; mat[i][1][0] = -sina; mat[i][1][1] = cosa; mat[i][1][2] = 0; mat[i][2][0] = p[i].x * (1-cosa) + p[i].y * sina; mat[i][2][1] = p[i].y * (1-cosa) - p[i].x * sina; mat[i][2][2] = 1; } double sum[3][3]; for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { sum[i][j] = mat[0][i][j]; } } for(int i = 1; i < n; i++) { multi(sum,mat[i]); } cosa = sum[0][0]; sina = sum[0][1]; double a,b,c,d; a = 1 - cosa; b = sina; c = sum[2][0]; d = sum[2][1]; ans.x = (a*c - b*d) / (a*a + b*b); ans.y = (c*b + a*d) / (a*a + b*b); printf("%.10lf %.10lf %.10lf\n",ans.x,ans.y,ans.p); } return 0; }