#include <iostream>
#define _USE_MATH_DEFINES
#include <math.h>
#include <iomanip>
using namespace std;
struct Point
{
double x, y;
};
struct Vector2
{
double x, y;
};
double deg(double rad) // Zamień radiany na stopnie
{
return rad/M_PI*180;
}
double rad(double deg) // Zamień stopnie na radiany
{
return deg*M_PI/180;
}
double angle(Vector2 a, Vector2 b) // oblicz kąt pomiędzy wektorami
{
return acos ( (a.x * b.x + a.y * b.y) / ( sqrt( pow(a.x, 2) + pow(a.y, 2) ) * sqrt( pow(b.x, 2) + pow(b.y, 2) )) );;
}
Point rotate(Point A, Point S, double alpha) // oblicz kąt pomiędzy wektorami
{
Point B;// szukany punkt
if(A.x == S.x && A.y == S.y)
return A;
Vector2 a, b; // wektory a i b
a.x = A.x - S.x;
a.y = A.y - S.y;
double r = sqrt(pow(a.x, 2) + pow(a.y, 2)); // długość wektora a
Point tmp; tmp.x = S.x+1; tmp.y = S.y; // punkt pomocniczy
Vector2 t; // wektor pomocniczy
t.x = 2; // zapis troszkę sktócony :)
t.y = 0;
double beta = angle(a, t); // kąt pomiędzy wektorami a i t
double gamma = beta + alpha;// kąt pomiędzy wektoami a i b
Vector2 c; // kolejny wektor pomocniczny(dla zobrazowania)
c.x = r;
c.y = 0;
b.x = cos(gamma) * r;// C.x
b.y = sin(gamma) * r;
// oblicz pozycję B mając dany wektor b i punkt S
B.x = S.x + b.x;
B.y =S.y + b.y;
return B;
}
int main()
{
Point a, s;
double alfa;
// Wejście:
// Ax Ay Sx Sy Alfa
// Wyjście:
// Bx By
while(cin>>a.x>>a.y>>s.x>>s.y>>alfa)
{
Point b = rotate(a, s, rad(alfa));// oblicz pozycje punktu B
cout<<fixed <<b.x<<" "<<b.y<<" "<<endl; // Wypisz pozycje punktu B
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojZGVmaW5lIF9VU0VfTUFUSF9ERUZJTkVTCiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxpb21hbmlwPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBQb2ludAp7CiAgICAgICAgZG91YmxlIHgsIHk7Cn07CgpzdHJ1Y3QgVmVjdG9yMgp7CiAgICAgICAgZG91YmxlIHgsIHk7Cn07Cgpkb3VibGUgZGVnKGRvdWJsZSByYWQpIC8vIFphbWllxYQgcmFkaWFueSBuYSBzdG9wbmllCnsKCXJldHVybiByYWQvTV9QSSoxODA7Cn0KZG91YmxlIHJhZChkb3VibGUgZGVnKSAvLyBaYW1pZcWEIHN0b3BuaWUgbmEgcmFkaWFueQp7CglyZXR1cm4gZGVnKk1fUEkvMTgwOwp9Cgpkb3VibGUgYW5nbGUoVmVjdG9yMiBhLCBWZWN0b3IyIGIpIC8vIG9ibGljeiBrxIV0IHBvbWnEmWR6eSB3ZWt0b3JhbWkKewogICAgICAgIHJldHVybiBhY29zICggKGEueCAqIGIueCArIGEueSAqIGIueSkgLyAoIHNxcnQoIHBvdyhhLngsIDIpICsgcG93KGEueSwgMikgKSAqICBzcXJ0KCBwb3coYi54LCAyKSArIHBvdyhiLnksIDIpICkpICk7Owp9CgpQb2ludCByb3RhdGUoUG9pbnQgQSwgUG9pbnQgUywgZG91YmxlIGFscGhhKSAvLyBvYmxpY3oga8SFdCBwb21pxJlkenkgd2VrdG9yYW1pCnsKCVBvaW50IEI7Ly8gc3p1a2FueSBwdW5rdAoJaWYoQS54ID09IFMueCAmJiBBLnkgPT0gUy55KQoJCXJldHVybiBBOwoJVmVjdG9yMiBhLCBiOyAvLyB3ZWt0b3J5IGEgaSBiCgkJYS54ID0gQS54IC0gUy54OwoJCWEueSA9IEEueSAtIFMueTsKCglkb3VibGUgciA9IHNxcnQocG93KGEueCwgMikgKyBwb3coYS55LCAyKSk7IC8vIGTFgnVnb8WbxIcgd2VrdG9yYSBhCgoJUG9pbnQgdG1wOyB0bXAueCA9IFMueCsxOyB0bXAueSA9IFMueTsgLy8gcHVua3QgcG9tb2NuaWN6eQoJVmVjdG9yMiB0OyAvLyB3ZWt0b3IgcG9tb2NuaWN6eQoJCXQueCA9IDI7IC8vIHphcGlzIHRyb3N6a8SZIHNrdMOzY29ueSA6KQoJCXQueSA9IDA7CgoJZG91YmxlIGJldGEgPSBhbmdsZShhLCB0KTsgLy8ga8SFdCBwb21pxJlkenkgd2VrdG9yYW1pIGEgaSB0CgoJZG91YmxlIGdhbW1hID0gYmV0YSArIGFscGhhOy8vIGvEhXQgcG9tacSZZHp5IHdla3RvYW1pIGEgaSBiCgoJVmVjdG9yMiBjOyAvLyBrb2xlam55IHdla3RvciBwb21vY25pY3pueShkbGEgem9icmF6b3dhbmlhKQoJCWMueCA9IHI7CgkJYy55ID0gMDsKCgliLnggPSBjb3MoZ2FtbWEpICogcjsvLyBDLngKCWIueSA9IHNpbihnYW1tYSkgKiByOwoKCS8vIG9ibGljeiBwb3p5Y2rEmSBCIG1hasSFYyBkYW55IHdla3RvciBiIGkgcHVua3QgUwoJQi54ID0gUy54ICsgYi54OwoJQi55ID1TLnkgKyAgIGIueTsKCglyZXR1cm4gQjsKfQoKaW50IG1haW4oKQp7CglQb2ludCBhLCBzOwoJZG91YmxlIGFsZmE7CgkvLyBXZWrFm2NpZToKCS8vIEF4IEF5IFN4IFN5IEFsZmEKCS8vIFd5asWbY2llOgoJLy8gQnggQnkKCXdoaWxlKGNpbj4+YS54Pj5hLnk+PnMueD4+cy55Pj5hbGZhKQoJewoJCVBvaW50IGIgPSByb3RhdGUoYSwgcywgcmFkKGFsZmEpKTsvLyBvYmxpY3ogcG96eWNqZSBwdW5rdHUgQgoJCWNvdXQ8PGZpeGVkIDw8Yi54PDwiICI8PGIueTw8IiAiPDxlbmRsOyAvLyBXeXBpc3ogcG96eWNqZSBwdW5rdHUgQgoJfQoKCXJldHVybiAwOwp9