#include <bits/stdc++.h>
using namespace std;
struct point {
  double x, y;
  point(double x = 0, double y = 0) : x(x), y(y) {}
  double operator*(const point &p) const { return x * p.x + y * p.y; }
  double operator^(const point &p) const { return x * p.y - y * p.x; }
  point operator+(const point &p) const { return point(x + p.x, y + p.y); }
  point operator-(const point &p) const { return point(x - p.x, y - p.y); }
  point operator*(double scale) { return point(scale * x, scale * y); }
  double norm() { return (*this) * (*this); }
};
point rotate(point p, double theta) {
  double rad = theta * acos(-1) / 180.0;
  return point(p.x * cos(rad) - p.y * sin(rad),
               p.x * sin(rad) + p.y * cos(rad));
}
double AreaOfPolygon(vector<point> &P) {
  double Area = 0;
  int j = (int)P.size() - 1;
  for (int i = 0; i < P.size(); i++) {
    Area += (P[i].x + P[j].x) * (P[j].y - P[i].y);
    j = i;
  }
  return abs(Area / 2.0);
}
int LineLineInter(point a, point b, point c, point d, point &p) {
  point v1 = b - a;
  point v2 = d - c;
  point v3 = c - a;
  point v4 = b - c;
  if (abs(v1 ^ v2) > 0) {
    double d = (v3 ^ v2) / (v1 ^ v2);
    p = v1 * d + a;
    return 1;
  }
  if (abs(v1 ^ v4) > 0) return 0;
  return -1;
}
int SegSegInter(point a, point b, point c, point d, point &p) {
  int s = LineLineInter(a, b, c, d, p);
  if (s == 0) return 0;
  if (s == -1) {
    if ((a - c) * (a - d) <= 0) {
      p = a;
      return 2;
    }
    if ((b - c) * (b - d) <= 0) {
      p = b;
      return 2;
    }
    if ((c - a) * (c - b) <= 0) {
      p = c;
      return 2;
    }
    return -1;
  }
  if ((p - a) * (p - b) <= 0 && (p - c) * (p - d) <= 0) return 1;
  return -2;
}
struct Rectangle {
  point UL, UR;
  point DL, DR;
  Rectangle(point UL, point UR, point DL, point DR)
      : UL(UL), UR(UR), DL(DL), DR(DR) {}
  void Intersect(Rectangle R, vector<point> &P) {
    point inter;
    if (SegSegInter(UL, UR, R.UL, R.UR, inter) > 0) P.push_back(inter);
    if (SegSegInter(UL, UR, R.UR, R.DR, inter) > 0) P.push_back(inter);
    if (SegSegInter(UL, UR, R.DL, R.DR, inter) > 0) P.push_back(inter);
    if (SegSegInter(UL, UR, R.UL, R.DL, inter) > 0) P.push_back(inter);
    if (SegSegInter(UL, DL, R.UL, R.UR, inter) > 0) P.push_back(inter);
    if (SegSegInter(UL, DL, R.UR, R.DR, inter) > 0) P.push_back(inter);
    if (SegSegInter(UL, DL, R.DL, R.DR, inter) > 0) P.push_back(inter);
    if (SegSegInter(UL, DL, R.UL, R.DL, inter) > 0) P.push_back(inter);
    if (SegSegInter(DR, UR, R.UL, R.UR, inter) > 0) P.push_back(inter);
    if (SegSegInter(DR, UR, R.UR, R.DR, inter) > 0) P.push_back(inter);
    if (SegSegInter(DR, UR, R.DL, R.DR, inter) > 0) P.push_back(inter);
    if (SegSegInter(DR, UR, R.UL, R.DL, inter) > 0) P.push_back(inter);
    if (SegSegInter(DL, DR, R.UL, R.UR, inter) > 0) P.push_back(inter);
    if (SegSegInter(DL, DR, R.UR, R.DR, inter) > 0) P.push_back(inter);
    if (SegSegInter(DL, DR, R.DL, R.DR, inter) > 0) P.push_back(inter);
    if (SegSegInter(DL, DR, R.UL, R.DL, inter) > 0) P.push_back(inter);
  }
};
bool half(point p) {
  assert(p.x != 0 || p.y != 0);
  return p.y > 0 || (p.y == 0 && p.x < 0);
}
void polarSort(vector<point> &v) {
  sort(v.begin(), v.end(), [](point v, point w) {
    return make_tuple(half(v), 0, v.norm()) <
           make_tuple(half(w), (v ^ w), w.norm());
  });
}
int main() {
  double W, H, theta;
  scanf("%lf%lf%lf", &W, &H, &theta);
  if (H > W) swap(H, W);
  if (theta == 0 || theta == 180) {
    return 0 * printf("%.6lf\n", W * H);
  } else if (theta == 90) {
    return 0 * printf("%.6lf\n", H * H);
  }
  W /= 2.0;
  H /= 2.0;
  point p1 = {+W, +H};
  point p2 = {+W, -H};
  point p3 = {-W, +H};
  point p4 = {-W, -H};
  Rectangle R1(p3, p1, p4, p2);
  Rectangle R2(rotate(p3, theta), rotate(p1, theta), rotate(p4, theta),
               rotate(p2, theta));
  vector<point> polygon;
  R1.Intersect(R2, polygon);
  polarSort(polygon);
  printf("%.6lf\n", AreaOfPolygon(polygon));
  return 0;
}
