#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:102400000,102400000")
template <class T>
inline void gmax(T &a, T b) {
  if (b > a) a = b;
}
template <class T>
inline void gmin(T &a, T b) {
  if (b < a) a = b;
}
using namespace std;
const int N = 1e5 + 10, M = 2e6 + 10, Z = 1e9 + 7, maxint = 2147483647,
          ms1 = 16843009, ms31 = 522133279, ms63 = 1061109567,
          ms127 = 2139062143;
const double PI = acos(-1.0), eps = 1e-8;
void fre() {
  freopen("/Users/luras/Desktop/in.txt", "r", stdin);
  freopen("/Users/luras/Desktop/out.txt", "w", stdout);
}
int casenum, casei;
inline int sgn(double n) { return fabs(n) < eps ? 0 : (n < 0 ? -1 : 1); }
inline double sqr(double x) { return x * x; }
inline double Sqrt(double a) { return a <= 0 ? 0 : sqrt(a); }
struct point {
  double x, y;
  point() {}
  point(double a, double b) : x(a), y(b) {}
  friend point operator+(const point &a, const point &b) {
    return point(a.x + b.x, a.y + b.y);
  }
  friend point operator-(const point &a, const point &b) {
    return point(a.x - b.x, a.y - b.y);
  }
  friend bool operator==(const point &a, const point &b) {
    return sgn(a.x - b.x) == 0 && sgn(a.y - b.y) == 0;
  }
  friend point operator*(const point &a, const double &b) {
    return point(a.x * b, a.y * b);
  }
  friend point operator*(const double a, const point &b) {
    return point(a * b.x, a * b.y);
  }
  friend point operator/(const point &a, const double &b) {
    return point(a.x / b, a.y / b);
  }
  double norm() { return sqrt(sqr(x) + sqr(y)); }
};
double det(const point &a, const point &b) { return a.x * b.y - a.y * b.x; }
double dot(const point &a, const point &b) { return a.x * b.x + a.y * b.y; }
double dist(const point &a, const point &b) { return (a - b).norm(); }
point rotate_point(const point &p, double A) {
  double tx = p.x, ty = p.y;
  return point(tx * cos(A) - ty * sin(A), tx * sin(A) + ty * cos(A));
}
const double INF = 10000;
inline double cross(complex<double> a, complex<double> b) {
  return (conj(a) * b).imag();
}
inline double dot(complex<double> a, complex<double> b) {
  return (conj(a) * b).real();
}
inline double satisfy(complex<double> a,
                      pair<complex<double>, complex<double> > p) {
  return sgn(cross(a - p.first, p.second - p.first)) <= 0;
}
inline bool satisfy2(complex<double> a,
                     pair<complex<double>, complex<double> > p) {
  return sgn(cross(a - p.first, p.second - p.first)) < 0;
}
complex<double> crosspoint(const pair<complex<double>, complex<double> > &a,
                           const pair<complex<double>, complex<double> > &b) {
  double k = cross(b.first - b.second, a.first - b.second);
  k = k / (k - cross(b.first - b.second, a.second - b.second));
  return a.first + (a.second - a.first) * k;
}
bool Halfcmp(const pair<complex<double>, complex<double> > &a,
             const pair<complex<double>, complex<double> > &b) {
  int res = sgn(arg(a.second - a.first) - arg(b.second - b.first));
  return res == 0 ? satisfy2(a.first, b) : res < 0;
}
vector<complex<double> > halfplaneIntersection(
    vector<pair<complex<double>, complex<double> > > v) {
  sort(v.begin(), v.end(), Halfcmp);
  deque<pair<complex<double>, complex<double> > > q;
  deque<complex<double> > ans;
  q.push_back(v[0]);
  for (int i = 1; i < int(v.size()); i++) {
    if (sgn(arg(v[i].second - v[i].first) -
            arg(v[i - 1].second - v[i - 1].first)) == 0) {
      continue;
    }
    while (ans.size() > 0 && !satisfy(ans.back(), v[i])) {
      ans.pop_back();
      q.pop_back();
    }
    while (ans.size() > 0 && !satisfy(ans.front(), v[i])) {
      ans.pop_front();
      q.pop_front();
    }
    ans.push_back(crosspoint(q.back(), v[i]));
    q.push_back(v[i]);
  }
  while (ans.size() > 0 && !satisfy(ans.back(), q.front())) {
    ans.pop_back();
    q.pop_back();
  }
  while (ans.size() > 0 && !satisfy(ans.front(), q.back())) {
    ans.pop_front();
    q.pop_front();
  }
  ans.push_back(crosspoint(q.back(), q.front()));
  return vector<complex<double> >(ans.begin(), ans.end());
}
vector<complex<double> > convexIntersection(vector<complex<double> > v1,
                                            vector<complex<double> > v2) {
  vector<pair<complex<double>, complex<double> > > h;
  for (int i = 0; i < int(v1.size()); i++)
    h.push_back(pair<complex<double>, complex<double> >(
        v1[i], v1[(i + 1) % v1.size()]));
  for (int i = 0; i < int(v2.size()); i++)
    h.push_back(pair<complex<double>, complex<double> >(
        v2[i], v2[(i + 1) % v2.size()]));
  return halfplaneIntersection(h);
}
double w, h, a;
point p0, p1, p2, p3, p00, p10, p20, p30;
int main() {
  while (~scanf("%lf%lf%lf", &w, &h, &a)) {
    a = a / 180 * PI;
    vector<complex<double> > v1, v2;
    p0 = point(w / 2, h / 2);
    p1 = point(-w / 2, h / 2);
    p2 = point(-w / 2, -h / 2);
    p3 = point(w / 2, -h / 2);
    v1.push_back(complex<double>(w / 2, h / 2));
    v1.push_back({-w / 2, h / 2});
    v1.push_back({-w / 2, -h / 2});
    v1.push_back({w / 2, -h / 2});
    p00 = rotate_point(p0, a);
    p10 = rotate_point(p1, a);
    p20 = rotate_point(p2, a);
    p30 = rotate_point(p3, a);
    v2.push_back({p00.x, p00.y});
    v2.push_back({p10.x, p10.y});
    v2.push_back({p20.x, p20.y});
    v2.push_back({p30.x, p30.y});
    vector<complex<double> > v0 = convexIntersection(v1, v2);
    double sum = 0;
    v0.push_back(v0[0]);
    for (int i = 0; i < v0.size() - 1; i++) {
      point t1, t2;
      t1.x = v0[i + 1].real();
      t1.y = v0[i + 1].imag();
      t2.x = v0[i].real();
      t2.y = v0[i].imag();
      sum += det(t1, t2);
    }
    printf("%.10f\n", fabs(sum / 2));
  }
  return 0;
}
