#include #include #include struct coor{ double x,y; }; double X,Y,R,Ax,Ay,Bx,By; double obsah(coor a, coor b) { double x1 = a.x-X; double y1 = a.y-Y; double x2 = b.x-X; double y2 = b.y-Y; return -(x1*y2-y1*x2)/2; } double dist(double x1,double y1, double x2, double y2) { return std::sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } std::pair Xintersect(int height) { double l=X; double r=2000; while(std::abs(l-r)>1e-8) { double m = (l+r)/2; if(dist(X,Y,m,height) > R) r=m; else l=m; } double ret1 = r; l=-2000; r=X; while(std::abs(l-r)>1e-8) { double m = (l+r)/2; if(dist(X,Y,m,height) > R) l=m; else r=m; } std::pair ret = {ret1, l}; return ret; } std::pair Yintersect(int width) { double u=Y; double d=2000; while(std::abs(u-d)>1e-8) { double m = (u+d)/2; if(dist(X,Y,width,m) > R) d=m; else u=m; } double ret1 = d; u=-2000; d=Y; while(std::abs(u-d)>1e-8) { double m = (u+d)/2; if(dist(X,Y,width,m) > R) u=m; else d=m; } std::pair ret = {ret1, u}; return ret; } double vysec(coor a, coor b) { double a1 = atan2(a.y-Y, a.x-X); double a2 = atan2(b.y-Y, a.x-X); if(a1 < 0) a1 += 2*M_PI; if(a2 < 0) a2 += 2*M_PI; if(a2 < a1) a2 += 2*M_PI; return (a2-a1)*R*R/2; } int main() { std::cin >> X >> Y >> R >> Ax >> Ay >> Bx >> By; if(Ay>By) std::swap(Ay,By); if(Ax>Bx) std::swap(Ax,Bx); std::vector v1; std::vector v; if(std::abs(Ay-Y) A = Xintersect(Ay); if(A.first > Ax && A.first < Bx) v.push_back({A.first,Ay}); if(A.second > Ax && A.second < Bx) v.push_back({A.second,Ay}); if(dist(Ax,Ay,X,Y) C = Yintersect(Ax); if(C.second > Ay && C.second < By) v.push_back({Ax,C.second}); if(C.first > Ay && C.first < By) v.push_back({Ax,C.first}); if(dist(Bx,By,X,Y) B = Xintersect(By); if(B.second > Ax && B.second < Bx) v.push_back({B.second,By}); if(B.first > Ax && B.first < Bx) v.push_back({B.first,By}); if(dist(Ax,By,X,Y) D = Yintersect(Bx); if(D.first > Ay && D.first < By) v.push_back({Bx,D.first}); if(D.second > Ay && D.second < By) v.push_back({Bx,D.second}); if(dist(Bx,Ay,X,Y) v[i].x && v[i].y == By) || (v[i-1].x v[i].y && v[i].x == Ax)) { area += vysec(v[i-1],v[i]); } else area+=obsah(v[i-1],v[i]); } else area+=vysec(v[i-1],v[1]); } if(v.size() == 2) { } if(v.size() < 2) if(XAx && YAy) area = 2*M_PI*R*R; std::cout << area << std::endl; }