#include<bits/stdc++.h>

using namespace std;

struct I{I(){
     ios::sync_with_stdio(false);cin.tie(0);
    cout<<fixed<<setprecision(10);
}}init;

typedef double D;
const D eps=1e-10;
#define X real()
#define Y imag()
#define sz size()
#define pb(x) push_back(x)

int sgn(D a,D b=0){
    if(a>b+eps)return 1;
    if(a<b-eps)return -1;
    return 0;
}

typedef complex<D> P;
const D pi=acos(-1);
D calc_left(P l,P r){
    if(sgn(l.X,0)==0)return l.Y;
    P v=l-r;
    v=v/abs(v.X);
    v=v*abs(r.X);
    v=r+v;
    return v.Y;
}
D calc_right(D W,D h,D u,D v){
    return (u*h-v*W)/(u-W);
}
bool check(P p,P q){
    return sgn(p.X,q.X)!=0;
}
bool comp(P l,P r){
    return l.X<r.X;
}

D sekibun(D s,D t,D u,D v,D w){
    D A=(1-w/u)/2,B=v*w/u;
    return A*(t*t-s*s)+B*(t-s);
}
int main(){
    for(int W,H,N;cin>>W>>H>>N,N;){
        N*=2;
        D res=0;
        vector<P> p(N);
        for(auto &it:p){
            D x,y;
            cin>>x>>y;
            it=P(x,y);
        }
        sort(p.begin(),p.end(),comp);
        vector<D> ys;
        ys.pb(0);ys.pb(H);
        for(int i=0;i<N;i++)
            for(int j=i+1;j<N;j++)
                if(check(p[i],p[j])){
                        D y=calc_left(p[i],p[j]);
                        if(0<=y&&y<=H)
                            ys.pb(y);
                    }
        sort(ys.begin(),ys.end());
        int M=ys.size()-1;
        for(int i=0;i<M;i++){
            if(sgn(ys[i],ys[i+1])==0)continue;
            P q(0.0,(ys[i]+ys[i+1])/2);
            using T=tuple<D,D,D>;
            vector<T> tmp(N);
            for(int j=0;j<N;j++){
                P qq=p[j]-q;
                D d=atan2(qq.Y,qq.X);
                tmp[j]=T(d,p[j].X,p[j].Y);
            }
            sort(tmp.begin(),tmp.end());
            int half=N/2;
            D d1,u1,v1,d2,u2,v2;
            tie(d1,u1,v1)=tmp[half-1];
            tie(d2,u2,v2)=tmp[half];
            
            if(sgn(u1,0)==0)u1+=eps;
            if(sgn(u2,0)==0)u2+=eps;
            if(sgn(u1,W)==0)u1-=eps;
            if(sgn(u2,W)==0)u2-=eps;
            
            D y10=calc_right(W,0,u1,v1);
            D y1H=calc_right(W,H,u1,v1);
            D y20=calc_right(W,0,u2,v2);
            D y2H=calc_right(W,H,u2,v2);

            vector<D> st({y10,y1H,y20,y2H});
            sort(st.begin(),st.end());
            
            D s,t,lb,ub,add;
            if(y2H>=y10||y1H>=y20){
                ub=st[2],lb=st[1];
                s=min(ub,max(lb,ys[i]));
                t=min(ub,max(lb,ys[i+1]));
                if(sgn(t-s))res+=add=H*(t-s);
            }
            else{         
                ub=st[2],lb=st[1];
                s=min(ub,max(lb,ys[i]));
                t=min(ub,max(lb,ys[i+1]));
                if(sgn(t-s))res+=add=sekibun(s,t,u2,v2,W)-sekibun(s,t,u1,v1,W);
            }
            //cout<<add<<endl;
            
            
            ub=st[3],lb=st[2];
            s=min(ub,max(lb,ys[i]));
            t=min(ub,max(lb,ys[i+1]));
            if(sgn(t-s))res+=add=sekibun(s,t,u2,v2,W);
           
            //cout<<add<<endl;

            ub=st[1],lb=st[0];
            s=min(ub,max(lb,ys[i]));
            t=min(ub,max(lb,ys[i+1]));
            if(sgn(t-s))res+=add=H*(t-s)-sekibun(s,t,u1,v1,W);
            
            //cout<<add<<endl;cout<<endl;
        }
        cout<<res/(H*H)<<endl;

    }
    return 0;
}

Measured memory_bytes: 3716