#include #include #include #define MAX_SIZE 50 typedef struct tag_point{ double x, y; } POINT; /* 4階のテンソル方程式(って書くとすごそうじゃないですか?(ぉぃ)) */ /* 線形じゃん。もっと要素増やしましょうよー 10000とか100000とか。データ作るの大変そうだけど・・・。誤差がかさむかも。*/ void solve(double *dest, const POINT *points, const double *angles, int n) { int i, cur; double cell[MAX_SIZE * 2][2], b[MAX_SIZE * 2]; double cos_a, sin_a, tmp; cos_a = cos(angles[n-1]); sin_a = sin(angles[n-1]); cell[0][0] = - cos_a; cell[0][1] = sin_a; cell[1][0] = - sin_a; cell[1][1] = - cos_a; b[0] = (1-cos_a) * points[n-1].x + sin_a * points[n-1].y; b[1] = -sin_a * points[n-1].x + (1-cos_a) * points[n-1].y; for(i = 0; i < n-1; ++i) { cos_a = cos(angles[i]); sin_a = sin(angles[i]); cur = i * 2; cell[cur+2][0] = cell[cur][0] * cos_a - cell[cur+1][0] * sin_a; cell[cur+2][1] = cell[cur][1] * cos_a - cell[cur+1][1] * sin_a; cell[cur+3][0] = cell[cur][0] * sin_a + cell[cur+1][0] * cos_a; cell[cur+3][1] = cell[cur][1] * sin_a + cell[cur+1][1] * cos_a; b[cur+2] = b[cur] * cos_a - b[cur+1] * sin_a + (1-cos_a) * points[i].x + sin_a * points[i].y; b[cur+3] = b[cur] * sin_a + b[cur+1] * cos_a - sin_a * points[i].x + (1-cos_a) * points[i].y; } cell[2*n-2][0] += 1; cell[2*n-1][1] += 1; tmp = cell[2*n-2][0] * cell[2*n-1][1] - cell[2*n-2][1] * cell[2*n-1][0]; dest[2*n-2] = (cell[2*n-1][1] * b[2*n-2] - cell[2*n-2][1] * b[2*n-1]) / tmp; dest[2*n-1] = (cell[2*n-2][0] * b[2*n-1] - cell[2*n-1][0] * b[2*n-2]) / tmp; for(i = 0; i < 2*n-2; ++i) { dest[i] = b[i] - cell[i][0] * dest[2*n-2] - cell[i][1] * dest[2*n-1]; } for(i = 0; i < 2*n; ++i) { if( fabs(dest[i]) < 0.005 ) dest[i] = 0; /* avoid "-0.00" */ } } int main() { double x[MAX_SIZE * 2]; POINT points[MAX_SIZE]; double angles[MAX_SIZE]; int i, n, fst; fst = 1; while( scanf("%d", &n) > 0 ){ for(i = 0; i < n; ++i) { scanf("%lf%lf", &points[i].x, &points[i].y); } for(i = 0; i < n; ++i) { scanf("%lf", &angles[i]); angles[i] *= M_PI / 180; } solve(x, points, angles, n); if( fst ) { fst = 0; } else { printf("\n"); } for(i = 0; i < n; ++i) { printf("%.2f %.2f\n", x[2*i], x[2*i+1]); } } return 0; }