#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; static const double EPS = 1e-8; static const double PI = 4.0 * atan(1.0); static const double PI2 = 8.0 * atan(1.0); typedef long long ll; #define ALL(c) (c).begin(), (c).end() #define CLEAR(v) memset(v,0,sizeof(v)) #define MP(a,b) make_pair((a),(b)) #define REP(i,n) for(int i=0;i<(int)n;++i) typedef complex P; int main() { double D; for (int N; cin >> N >> D && N; ) { P center(0.0, 0.0); double theta = 0.0; // LからRへの向き REP(n, N) { double R, L, T; cin >> L >> R >> T; if (R == L) { // 前進 center += polar(PI2 / 360 * R * T, theta + PI * 0.5); } else if (R == 0) { // Rを中心に回転 const double deltaTheta = -PI2 / 360 * L * T / (2 * D); const P rotCenter = center + polar(D, theta); center -= rotCenter; center *= polar(1.0, deltaTheta); center += rotCenter; theta += deltaTheta; } else if (L == 0) { // Lを中心に回転 const double deltaTheta = PI2 / 360 * R * T / (2 * D); const P rotCenter = center + polar(-D, theta); center -= rotCenter; center *= polar(1.0, deltaTheta); center += rotCenter; theta += deltaTheta; } else { const double t = D * (R + L) / (L - R); assert(abs(abs(t) - D) > EPS); const double deltaTheta = PI2 / 360 * R * T / (D - t); const P rotCenter = center + polar(t, theta); center -= rotCenter; center *= polar(1.0, deltaTheta); center += rotCenter; theta += deltaTheta; } } printf("%.20f\n%.20f\n", center.real(), center.imag()); } }