#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define rep(i, a, n) for (int i = (a); i < (n); i++)
#define per(i, a, n) for (int i = (n) - 1; i >= (a); i--)
#define FOR(i, n) rep(i, 0, (n))
#define fi first
#define se second
#define pt pair<double,double>
double PI=3.141592653589;
char endl = '\n';
double eps=0.0000001;
pt S;int R;
int vzd(pt A,pt B){
    return (A.fi-B.fi)*(A.fi-B.fi)+(A.se-B.se)*(A.se-B.se);
}
double cross(pt A, pt B){
    return A.fi*B.se-A.se*B.fi;
}
double obsah(pt A, pt B){
    double x=sqrt((A.fi-B.fi)*(A.fi-B.fi)+(A.se-B.se)*(A.se-B.se));
    double c,d;
    if(x/(2*R)<1) c=asin(x/(2*R));
    else c=PI/2;
    if(R*R-(x*x/4)>=0) d=sqrt(R*R-(x*x/4));
    else d=0;
    return c*R*R-x*d/2;
}
double obsah2(pt A, pt B){
    double x=sqrt((A.fi-B.fi)*(A.fi-B.fi)+(A.se-B.se)*(A.se-B.se));
    double c,d;
    if(x/(2*R)<1) c=asin(x/(2*R));
    else c=PI/2;
    if(R*R-(x*x/4)>=0) d=sqrt(R*R-(x*x/4));
    else d=0;
    return (PI-c)*R*R+x*d/2;
}
int main(void) {
	ios_base::sync_with_stdio(false);
	pt A,B,C,D,E,F;
    double x=0.5;
    //cout << asin(x) << '\n';
	cin >> S.fi >> S.se >> R >> E.fi >> E.se >> F.fi >> F.se;
	if(E.fi<F.fi&&E.se<F.se) {A=E; C=F; B={C.fi,A.se}; D={A.fi,C.se};}
	else if(E.fi<F.fi) {D=E; B=F; A={E.fi, F.se}; C={F.fi,E.se};}
	else if(E.se<F.se) {D=F; B=E; A={F.fi,E.se}; C={E.fi,F.se};}
	else {A=F; C=E; B={C.fi,A.se}; D={A.fi,C.se};}
	vector<pair<pt,int> > v;

	if(vzd(A,S)<=R*R) v.push_back({A, 0});
	//if(vzd(A,S)==R*R) {v.push_back({A,true}); if(A.fi!=S.fi-R&&A.fi!=S.fi+R&&A.se!=S.se-R&&A.se!=S.se+R) v.push_back({A,true});}
	if(R*R>(A.se-S.se)*(A.se-S.se)){
        double e,f;
        e=-sqrt(R*R-(A.se-S.se)*(A.se-S.se))+S.fi;
        f=sqrt(R*R-(A.se-S.se)*(A.se-S.se))+S.fi;
        if(e>A.fi+eps&&e<B.fi-eps) v.push_back({{e,A.se},true});
        if(f>A.fi+eps&&f<B.fi-eps) v.push_back({{f,A.se},true});
	}

	if(vzd(B,S)<=R*R) v.push_back({B, false});
	//if(vzd(B,S)==R*R) {v.push_back({B,true}); if(B.fi!=S.fi-R&&B.fi!=S.fi+R&&B.se!=S.se-R&&B.se!=S.se+R) v.push_back({B,true});}
	if(R*R>(B.fi-S.fi)*(B.fi-S.fi)){
        double e,f;
        e=-sqrt(R*R-(B.fi-S.fi)*(B.fi-S.fi))+S.se;
        f=sqrt(R*R-(B.fi-S.fi)*(B.fi-S.fi))+S.se;
        if(e>B.se+eps&&e<C.se-eps) v.push_back({{B.fi,e},true});
        if(f>B.se+eps&&f<C.se-eps) v.push_back({{B.fi,f},true});
	}


	if(vzd(C,S)<=R*R) v.push_back({C, false});
	//if(vzd(C,S)==R*R) {v.push_back({C,true}); if(C.fi!=S.fi-R&&C.fi!=S.fi+R&&C.se!=S.se-R&&C.se!=S.se+R) v.push_back({C,true});}
	if(R*R>(C.se-S.se)*(C.se-S.se)){
        double e,f;
        e=-sqrt(R*R-(C.se-S.se)*(C.se-S.se))+S.fi;
        f=sqrt(R*R-(C.se-S.se)*(C.se-S.se))+S.fi;
        if(f>A.fi+eps&&f<B.fi-eps) v.push_back({{f,C.se},true});
        if(e>A.fi+eps&&e<B.fi-eps) v.push_back({{e,C.se},true});

	}


	if(vzd(D,S)<=R*R) v.push_back({D, false});
	//if(vzd(D,S)==R*R) {v.push_back({D,true}); if(D.fi!=S.fi-R&&D.fi!=S.fi+R&&D.se!=S.se-R&&D.se!=S.se+R) v.push_back({A,true});}
	if(R*R>(D.fi-S.fi)*(D.fi-S.fi)){
        double e,f;
        e=-sqrt(R*R-(D.fi-S.fi)*(D.fi-S.fi))+S.se;
        f=sqrt(R*R-(D.fi-S.fi)*(D.fi-S.fi))+S.se;
        if(f>B.se+eps&&f<C.se-eps) v.push_back({{D.fi,f},true});
        if(e>B.se+eps&&e<C.se-eps) v.push_back({{D.fi,e},true});

	}
	int i;
	/*for(i=0;i<v.size();i++){
        cout << v[i].fi.fi << " " <<  v[i].fi.se << '\n';
	}*/
    double res=0;
    if(v.size()<2){
        if(S.fi>A.fi&&S.fi<B.fi&&S.se<C.se&&S.se>A.se) {
            if(vzd(A,S)>R) cout << setprecision(9) << PI*R*R << '\n';
            else cout << setprecision(9) << (C.se-B.se)*(B.fi-A.fi) << '\n';
        }
        else cout << 0.0000 << '\n';
        return 0;
    }

    else if(v.size()==2){
        if(S.fi>A.fi&&S.fi<B.fi&&S.se<C.se&&S.se>A.se) cout << setprecision(9) << obsah2(v[0].fi,v[1].fi) << '\n';
        else cout << setprecision(9) << obsah(v[0].fi,v[1].fi) << '\n';
        return 0;
    }
    for(i=0;i<v.size()-1;i++){
        res+=cross(v[i].fi,v[i+1].fi);
    }
    if(v.size()>=2) res+=cross(v[v.size()-1].fi,v[0].fi);
    res=abs(res)/2;

    int N=v.size();
    v.push_back(v[0]);
    for(i=0;i<N;i++){
        if(v[i].fi.fi==v[i+1].fi.fi&&(v[i].fi.fi==A.fi||v[i].fi.fi==B.fi)) continue;
        if(v[i].fi.se==v[i+1].fi.se&&(v[i].fi.se==A.se||v[i].fi.se==C.se)) continue;
        else res+=obsah(v[i].fi,v[i+1].fi);
    }
    cout << res << '\n';
	return 0;
}