import static java.lang.Math.*; import static java.util.Arrays.*; import java.util.*; public class Main { Scanner sc = new Scanner(System.in); double INF = Double.POSITIVE_INFINITY; void run() { while (sc.hasNext()) { int W = sc.nextInt(), H = sc.nextInt(), N = sc.nextInt(); if ((W|H|N) == 0) return; int[] xs = new int[N * 2 + 2], ys = new int[N * 2 + 2]; for (int i = 0; i < N * 2; i++) { xs[i] = sc.nextInt(); ys[i] = sc.nextInt(); } xs[N * 2] = xs[N * 2 + 1] = W; ys[N * 2 + 1] = H; ArrayList list = new ArrayList(); list.add(0.0); list.add((double)H); for (int i = 0; i < xs.length; i++) { for (int j = 0; j < i; j++) if (xs[i] != xs[j]) { double y = (double)(xs[i] * ys[j] - xs[j] * ys[i]) / (xs[i] - xs[j]); if (0 < y && y < H) list.add(y); } } Collections.sort(list); double res = 0; for (int i = 0; i < list.size() - 1; i++) { double sy = list.get(i), ty = list.get(i + 1); double y = (sy + ty) / 2; double[] ds = new double[N * 2]; for (int j = 0; j < N * 2; j++) { if (xs[j] == 0) { if (ys[j] >= y) ds[j] = INF; else ds[j] = -INF; } else { ds[j] = (ys[j] - y) / xs[j]; } } sort(ds); double s = min(H, max(0, y + ds[N - 1] * W)); double t = min(H, max(0, y + ds[N] * W)); res += (t - s) * (ty - sy) / (H * H); } System.out.printf("%.10f%n", res); } } public static void main(String[] args) { new Main().run(); } }