#include <bits/stdc++.h>
using namespace std;
clock_t __START, __END;
double __TOTALTIME;
void _MS() { __START = clock(); }
void _ME() {
  __END = clock();
  __TOTALTIME = (double)(__END - __START) / CLOCKS_PER_SEC;
  cout << "Time: " << __TOTALTIME << " s" << endl;
}
const double E = 2.718281828;
const double PI = acos(-1.0);
const long long INF = (1LL << 60);
const int inf = (1 << 30);
const double ESP = 1e-9;
const int mod = (int)1e9 + 7;
const int N = (int)1e6 + 10;
bool zero(double x) { return (x > 0 ? x : -x) < ESP; }
struct point {
  double x, y;
};
struct line {
  point a, b;
};
double xmult(point p1, point p2, point p0) {
  return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);
}
double dmult(point p1, point p2, point p0) {
  return (p1.x - p0.x) * (p2.x - p0.x) + (p1.y - p0.y) * (p2.y - p0.y);
}
double distance(point p1, point p2) {
  return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}
bool isIntersected(point s1, point e1, point s2, point e2) {
  return (max(s1.x, e1.x) >= min(s2.x, e2.x)) &&
         (max(s2.x, e2.x) >= min(s1.x, e1.x)) &&
         (max(s1.y, e1.y) >= min(s2.y, e2.y)) &&
         (max(s2.y, e2.y) >= min(s1.y, e1.y)) &&
         (xmult(s1, s2, e1) * xmult(s1, e1, e2) > 0) &&
         (xmult(s2, s1, e2) * xmult(s2, e2, e1) > 0);
}
point intersection(point u1, point u2, point v1, point v2) {
  point ret = u1;
  double t = ((u1.x - v1.x) * (v1.y - v2.y) - (u1.y - v1.y) * (v1.x - v2.x)) /
             ((u1.x - u2.x) * (v1.y - v2.y) - (u1.y - u2.y) * (v1.x - v2.x));
  ret.x += (u2.x - u1.x) * t;
  ret.y += (u2.y - u1.y) * t;
  return ret;
}
point rotate(point p0, double alpha) {
  alpha = alpha / 180 * PI;
  return {p0.x * cos(alpha) - p0.y * sin(alpha),
          p0.y * cos(alpha) + p0.x * sin(alpha)};
}
point Pin[20];
int cmp(point a, point b) {
  if (xmult(a, b, Pin[1]) > ESP) return 1;
  if (fabs(xmult(a, b, Pin[1])) < ESP &&
      distance(b, Pin[1]) - distance(a, Pin[1]) > ESP)
    return 1;
  return 0;
}
point Stack[N];
int top;
void Graham(int n, point p[]) {
  top = 3;
  sort(p + 2, p + 1 + n, cmp);
  Stack[1] = p[1];
  Stack[2] = p[2];
  Stack[3] = p[3];
  for (int i = 4; i <= n; i++) {
    while (top >= 1 && xmult(p[i], Stack[top], Stack[top - 1]) > ESP) {
      top--;
    }
    Stack[++top] = p[i];
  }
}
double getArea() {
  double sum = fabs(xmult(Stack[2], Stack[3], Stack[1]));
  for (int i = 3; i < top; i++)
    sum += fabs(xmult(Stack[i], Stack[i + 1], Stack[1]));
  return sum / 2.0;
}
int main() {
  double w, h, alpha;
  scanf("%lf%lf%lf", &w, &h, &alpha);
  if (alpha == 0 || alpha == 180) {
    printf("%.10lf\n", w * h);
    return 0;
  }
  if (alpha == 90 && w == h) {
    printf("%.10lf\n", w * h);
    return 0;
  }
  line line1[10];
  point p1 = {-w / 2, h / 2};
  point p2 = {w / 2, h / 2};
  point p3 = {w / 2, -h / 2};
  point p4 = {-w / 2, -h / 2};
  line1[1] = {p1, p2};
  line1[2] = {p2, p3};
  line1[3] = {p3, p4};
  line1[4] = {p4, p1};
  line line2[10];
  p1 = rotate(p1, alpha);
  p2 = rotate(p2, alpha);
  p3 = rotate(p3, alpha);
  p4 = rotate(p4, alpha);
  line2[1] = {p1, p2};
  line2[2] = {p2, p3};
  line2[3] = {p3, p4};
  line2[4] = {p4, p1};
  int cp = 0;
  for (int i = 1; i <= 4; ++i) {
    for (int j = 1; j <= 4; ++j) {
      if (isIntersected(line1[i].a, line1[i].b, line2[j].a, line2[j].b))
        Pin[++cp] =
            intersection(line1[i].a, line1[i].b, line2[j].a, line2[j].b);
    }
  }
  Graham(cp, Pin);
  printf("%.10lf\n", getArea());
  return 0;
}
