#include <bits/stdc++.h>   #pragma GCC optimize( O3 )   using namespace std;   const int N = 1e5 + 5, M = 100 + 5, OO = 0x3f3f3f3f, mod = 1e9 + 7, base = 131,             MOD2 = 1000136437;   const double EPS = 1e-9;   long double w, h, theta;   complex<double> rotate(complex<double> &p, double a) {     return p * polar(1.0, a);   }   int doubleComp(const double &a, const double &b) {     return fabs(a - b) < EPS ? 0 : a < b ? -1 : 1;   }   bool lineInter(const complex<double> &A, const complex<double> &B,                  const complex<double> &P, const complex<double> &Q,                  complex<double> &R, bool isSegA = false, bool isSegB = false) {     double d1 = ((conj(P - A) * (B - A)).imag());     double d2 = ((conj(Q - A) * (B - A)).imag());     if (fabs(d1 - d2) < EPS) return false;     R = (d1 * Q - d2 * P) / (d1 - d2);     if (isSegA &&         doubleComp(hypot(A.real() - B.real(), A.imag() - B.imag()),                    hypot(A.real() - R.real(), A.imag() - R.imag()) +                        hypot(B.real() - R.real(), B.imag() - R.imag())) != 0)       return false;     if (isSegB &&         doubleComp(hypot(P.real() - Q.real(), P.imag() - Q.imag()),                    hypot(P.real() - R.real(), P.imag() - R.imag()) +                        hypot(Q.real() - R.real(), Q.imag() - R.imag())) != 0)       return false;     return true;   }   void polygonCut(const complex<double> &a, const complex<double> &b,                   const vector<complex<double> > &v,                   vector<complex<double> > &ret) {     ret.clear();     for (int i = 0; i < (int)(v).size(); i++) {       int j = (i + 1) % (int)(v).size();       if (((conj(((b) - (a))) * (((v[i]) - (a)))).imag()) >= 0)         ret.push_back(v[i]);       complex<double> r;       if (lineInter(a, b, v[i], v[j], r, 0, 1)) ret.push_back(r);     }   }   void polygonIntersection(const vector<complex<double> > &poly1,                            const vector<complex<double> > &poly2,                            vector<complex<double> > &ret) {     vector<complex<double> > r2;     ret = poly1;     for (int i = 0; i < (int)(poly2).size(); i++) {       int j = (i + 1) % (int)(poly2).size();       polygonCut(poly2[i], poly2[j], ret, r2);       ret = r2;     }   }   double areaPolygon(vector<complex<double> > p) {     double area = 0.0;     for (int i = 0, n = (int)(p).size(); i < n; i++)       area += ((conj(p[i]) * (p[(i + 1) % n])).imag());     return abs(area) / 2.0;   }   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     cin >> w >> h >> theta;     vector<complex<double> > p, p2, ans;     w /= 2;     h /= 2;     p.push_back(complex<double>(w, h));     p.push_back(complex<double>(-w, h));     p.push_back(complex<double>(-w, -h));     p.push_back(complex<double>(w, -h));     p2 = p;     theta = (theta / 180.0) * (2 * acos(0));     for (auto &i : p2) i = rotate(i, theta);     polygonIntersection(p, p2, ans);     cout << fixed << setprecision(6) << areaPolygon(ans);     return 0;   }   