#include <bits/stdc++.h>
using namespace std;
enum STATE { PARALLEL, COLLINEAR, INTERSECT };
STATE lineLineIntersection(const complex<double>& p1, const complex<double>& p2,
                           const complex<double>& p3, const complex<double>& p4,
                           complex<double>& intersectionPoint) {
  double D = p4.imag() - p3.imag();
  double A = p2.real() - p1.real();
  double B = p4.real() - p3.real();
  double C = p2.imag() - p1.imag();
  double numerator =
      ((((p3.real() - p1.real())) * D) + ((p1.imag() - p3.imag()) * B));
  double denominator = ((A * D) - (C * B));
  STATE ret;
  if (fabs(denominator) < 1e-9) {
    if (fabs(numerator) < 1e-9) {
      ret = COLLINEAR;
    } else {
      ret = PARALLEL;
    }
  } else {
    double t = numerator / denominator;
    intersectionPoint = ((p1) + ((t) * ((p2) - (p1))));
    ret = INTERSECT;
  }
  return ret;
}
bool isOnLine(const complex<double>& p1Line, const complex<double>& p2Line,
              const complex<double>& pToCheck) {
  double d = ((conj(((p2Line) - (p1Line))) * (((pToCheck) - (p1Line)))).imag());
  return fabs(d) < 1e-9;
}
bool isOnRay(const complex<double>& rayStart, const complex<double>& pOnRay,
             const complex<double>& pToCheck) {
  return isOnLine(rayStart, pOnRay, pToCheck) &&
         ((conj(((pOnRay) - (rayStart))) * (((pToCheck) - (rayStart))))
              .real()) > -1e-9;
}
bool isOnSegment(const complex<double>& p1, const complex<double>& p2,
                 const complex<double>& pToCheck) {
  return isOnRay(p1, p2, pToCheck) && isOnRay(p2, p1, pToCheck);
}
vector<complex<double> > polygonCut(const vector<complex<double> >& polygon,
                                    const complex<double>& p1,
                                    const complex<double>& p2) {
  vector<complex<double> > ret;
  complex<double> vect = ((p2) - (p1));
  for (int i = 0; i < polygon.size(); i++) {
    double c1 = ((conj(vect) * (((polygon[i]) - (p2)))).imag());
    double c2 =
        ((conj(vect) * (((polygon[(i + 1) % polygon.size()]) - (p2)))).imag());
    if (c1 < -1e-9 && c2 < -1e-9) {
      ret.push_back(polygon[i]);
    } else {
      complex<double> pnt;
      STATE inter = lineLineIntersection(
          polygon[i], polygon[(i + 1) % polygon.size()], p1, p2, pnt);
      if (inter == INTERSECT) {
        if (c1 < -1e-9) ret.push_back(polygon[i]);
        if (isOnSegment(polygon[i], polygon[(i + 1) % polygon.size()], pnt))
          ret.push_back(pnt);
      }
    }
  }
  return ret;
}
double polygonArea(const vector<complex<double> >& poly) {
  double tot = 0.0;
  for (int i = 1; i < ((int)poly.size()) - 1; i++) {
    tot += ((conj(((poly[i]) - (poly[0]))) * (((poly[i + 1]) - (poly[0]))))
                .imag());
  }
  return abs(tot / 2.);
}
const double PI = 2 * acos(0.0);
int main() {
  int x, y, theta;
  scanf("%d %d %d", &x, &y, &theta);
  double halfX = x / 2., halfY = y / 2.;
  vector<complex<double> > poly;
  poly.push_back(complex<double>(-halfX, -halfY));
  poly.push_back(complex<double>(halfX, -halfY));
  poly.push_back(complex<double>(halfX, halfY));
  poly.push_back(complex<double>(-halfX, halfY));
  vector<complex<double> > cutter(poly.begin(), poly.end());
  for (int i = 0; i < cutter.size(); i++) {
    cutter[i] = ((cutter[i]) * exp(complex<double>(0, ((theta / 180.) * PI))));
  }
  poly = polygonCut(poly, cutter[1], cutter[0]);
  poly = polygonCut(poly, cutter[0], cutter[3]);
  poly = polygonCut(poly, cutter[2], cutter[1]);
  poly = polygonCut(poly, cutter[3], cutter[2]);
  printf("%.15lf", polygonArea(poly));
  return 0;
}
