#include <bits/stdc++.h>
using namespace std;
long double safe_sqrt(long double x) { return sqrt(max((long double)0.0, x)); }
long long GI(long long& x) { return scanf("%lld", &x); }
void GN(long double& x) {
  long long t;
  GI(t);
  x = t;
}
const long double PI = acos(-1.0);
long double DEG_to_RAD(long double d) { return d * PI / 180.0; }
long double RAD_to_DEG(long double r) { return r * 180.0 / PI; }
inline long long cmp(long double a, long double b) {
  return (a < b - 1e-6) ? -1 : ((a > b + 1e-6) ? 1 : 0);
}
struct Point {
  long double x, y;
  Point(long double x = 0.0, long double y = 0.0) : x(x), y(y) {}
  Point operator+(const Point& a) const { return Point(x + a.x, y + a.y); }
  Point operator-(const Point& a) const { return Point(x - a.x, y - a.y); }
  Point operator*(long double k) const { return Point(x * k, y * k); }
  Point operator/(long double k) const { return Point(x / k, y / k); }
  long double operator*(const Point& a) const { return x * a.x + y * a.y; }
  long double operator%(const Point& a) const { return x * a.y - y * a.x; }
  long long cmp(Point q) const {
    if (long long t = ::cmp(x, q.x)) return t;
    return ::cmp(y, q.y);
  }
  bool operator>(Point q) const { return cmp(q) > 0; }
  bool operator<(Point q) const { return cmp(q) < 0; }
  bool operator==(Point q) const { return cmp(q) == 0; }
  bool operator>=(Point q) const { return cmp(q) >= 0; }
  bool operator<=(Point q) const { return cmp(q) <= 0; }
  bool operator!=(Point q) const { return cmp(q) != 0; }
  Point conj() { return Point(x, -y); }
  long double norm() { return x * x + y * y; }
  Point normalizeTo(long double len) { return Point(x, y) / norm() * len; }
  long double len() { return sqrt(norm()); }
  Point rotate(long double alpha) {
    long double cosa = cos(alpha), sina = sin(alpha);
    return Point(x * cosa - y * sina, x * sina + y * cosa);
  }
};
long long ccw(Point a, Point b, Point c) { return cmp((b - a) % (c - a), 0); }
long long RE_TRAI = ccw(Point(0, 0), Point(0, 1), Point(-1, 1));
long long RE_PHAI = ccw(Point(0, 0), Point(0, 1), Point(1, 1));
istream& operator>>(istream& cin, Point& p) {
  cin >> p.x >> p.y;
  return cin;
}
ostream& operator<<(ostream& cout, Point& p) {
  cout << p.x << ' ' << p.y;
  return cout;
}
struct Circle : Point {
  long double r;
  Circle(long double x = 0, long double y = 0, long double r = 0)
      : Point(x, y), r(r) {}
  Circle(Point p, long double r) : Point(p), r(r) {}
  bool contains(Point p) { return (*this - p).len() <= r + 1e-6; }
};
bool areIntersect(Circle u, Circle v) {
  if (cmp((u - v).len(), u.r + v.r) > 0) return false;
  if (cmp((u - v).len() + v.r, u.r) < 0) return false;
  if (cmp((u - v).len() + u.r, v.r) < 0) return false;
  return true;
}
vector<Point> circleIntersect(Circle u, Circle v) {
  vector<Point> res;
  if (!areIntersect(u, v)) return res;
  long double d = (u - v).len();
  long double alpha = acos((u.r * u.r + d * d - v.r * v.r) / 2.0 / u.r / d);
  Point p1 = (v - u).rotate(alpha);
  Point p2 = (v - u).rotate(-alpha);
  res.push_back(p1 / p1.len() * u.r + u);
  res.push_back(p2 / p2.len() * u.r + u);
  return res;
}
const long long MN = 200111;
Circle a[MN];
long long n;
Point start;
long double R;
long double segment_union(vector<pair<long double, long double> > segs) {
  long long n = ((long long)(segs).size());
  vector<pair<long double, bool> > x(n * 2);
  for (long long i = 0, _a = (n); i < _a; ++i) {
    x[i * 2] = make_pair(segs[i].first, false);
    x[i * 2 + 1] = make_pair(segs[i].second, true);
  }
  sort(x.begin(), x.end());
  long double res = 0.0;
  long long c = 0;
  for (long long i = 0, _a = (n * 2); i < _a; ++i) {
    if (c && i) res += x[i].first - x[i - 1].first;
    if (x[i].second)
      ++c;
    else
      --c;
  }
  return res;
}
long double directed_angle(Point a, Point o, Point b) {
  long double t = -atan2(a.y - o.y, a.x - o.x) + atan2(b.y - o.y, b.x - o.x);
  while (t < 0) t += 2 * PI;
  return t;
}
long double range(long double l, long double r) {
  if (l < r)
    return r - l;
  else
    return r - l + 2 * PI;
}
void solve() {
  for (long long i = (1), _b = (n); i <= _b; ++i)
    if (((a[i].x) * (a[i].x)) + ((a[i].y) * (a[i].y)) <
        ((a[i].r) * (a[i].r)) + 1e-10) {
      cout << 1.0 << endl;
      return;
    }
  Circle C;
  C.x = start.x;
  C.y = start.y;
  C.r = R;
  Point hor(1, 0);
  vector<pair<long double, long double> > segs;
  for (long long i = (1), _b = (n); i <= _b; ++i) {
    auto t = circleIntersect(C, a[i]);
    long double a1, a2;
    if (C.contains(a[i])) {
      long double mid = atan2(a[i].x, a[i].y);
      long double half = asin(a[i].r / a[i].len());
      a1 = mid - half;
      a2 = mid + half;
    } else if (((long long)(t).size()) == 2) {
      auto u = t[0];
      auto v = t[1];
      a1 = atan2(u.x, u.y);
      a2 = atan2(v.x, v.y);
    } else
      continue;
    while (a1 < 0) a1 += 2 * PI;
    while (a2 < 0) a2 += 2 * PI;
    while (a1 > 2 * PI) a1 -= 2 * PI;
    while (a2 > 2 * PI) a2 -= 2 * PI;
    if (fabs(a1 - a2) < 1e-10) continue;
    if (range(a1, a2) > PI) swap(a1, a2);
    if (a1 <= a2) {
      segs.emplace_back(a1, a2);
    } else {
      segs.emplace_back(a1, 2 * PI);
      segs.emplace_back(0, a2);
    }
  }
  long double sum = segment_union(segs);
  cout << sum / (long double)(2 * PI) << endl;
}
int main() {
  cout << (fixed) << setprecision(14);
  long double v, T;
  GN(start.x);
  GN(start.y);
  GN(v);
  GN(T);
  R = v * T;
  GI(n);
  for (long long i = (1), _b = (n); i <= _b; ++i) {
    GN(a[i].x);
    GN(a[i].y);
    GN(a[i].r);
    a[i].x -= start.x;
    a[i].y -= start.y;
  }
  start = Point(0, 0);
  solve();
}
