#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;
}
