http://poj.org/problem?id=1813
#include<iostream>
#include"math.h"
#include"stdio.h"
using namespace std;
struct point
{double x,y;};
const double pi=3.14159265359;
inline double cheng(point a,point b,point c)
{return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);}
inline double dcheng(point a,point b,point c)
{return (b.x-a.x)*(c.x-a.x)+(c.y-a.y)*(b.y-a.y);}
double doit(point p1,point p2,point o,double r)
{point px,p[16];int set[16];int s=0;double t;
p1.x-=o.x;
p1.y-=o.y;
p2.x-=o.x;
p2.y-=o.y;
o.x=0;
o.y=0;
if(fabs(p1.y)<=r){px.x=-sqrt(r*r-p1.y*p1.y);px.y=p1.y;
if(fabs(p1.x)<=fabs(px.x)||fabs(p2.x)<=fabs(px.x))
{
t=px.x;
set[s]=0;px.x=p1.x<px.x?px.x:p1.x;p[s++]=px;
px.x=-t;
set[s]=1;px.x=p2.x>px.x?px.x:p2.x;p[s++]=px;
}
}
if(fabs(p2.x)<=r){px.y=-sqrt(r*r-p2.x*p2.x);px.x=p2.x;
if(fabs(p1.y)<=fabs(px.y)||fabs(p2.y)<=fabs(px.y))
{
t=px.y;
set[s]=0;px.y=p1.y<px.y?px.y:p1.y;p[s++]=px;
px.y=-t;
set[s]=1;px.y=p2.y>px.y?px.y:p2.y;p[s++]=px;
}
}
if(fabs(p2.y)<=r){px.x=sqrt(r*r-p2.y*p2.y);px.y=p2.y;
if(fabs(p1.x)<=fabs(px.x)||fabs(p2.x)<=fabs(px.x))
{
t=px.x;
set[s]=0;px.x=p2.x>px.x?px.x:p2.x;p[s++]=px;
px.x=-t;
set[s]=1;px.x=p1.x<px.x?px.x:p1.x;p[s++]=px;
}
}
if(fabs(p1.x)<=r){px.y=sqrt(r*r-p1.x*p1.x);px.x=p1.x;
if(fabs(p1.y)<=fabs(px.y)||fabs(p2.y)<=fabs(px.y))
{
t=px.y;
set[s]=0;px.y=p2.y>px.y?px.y:p2.y;p[s++]=px;
px.y=-t;
set[s]=1;px.y=p1.y<px.y?px.y:p1.y;p[s++]=px;
}
}
double area=0;
for(int i=0;i<s;i++)
{p1=p[i];p2=p[(i+1)%s];
if(set[(i+1)%s])area+=cheng(o,p1,p2)/2;
else {if(cheng(o,p2,p1)<0)area+=acos(dcheng(o,p1,p2)/r/r)*r*r/2;
else if(cheng(o,p2,p1)>0)area+=(2*pi-acos(dcheng(o,p1,p2)/r/r))*r*r/2;
}
}
if(!s){if(p1.x<0&&p2.x>0&&p1.y<0&&p2.y>0)return pi*r*r;
else return 0;
}
return area;
}
int main()
{point p1,p2,p3,p4;
double r1,r2,r,da,db,l,area;
int t;
double x1,x2,y1,y2;char c1,c2;
cin>>t;
while(t--)
{cin>>c1;
cin>>p1.x>>p1.y;
if(c1=='R')cin>>p2.x>>p2.y;
else cin>>r1;
cin>>c2;
cin>>p3.x>>p3.y;
if(c2=='R')cin>>p4.x>>p4.y;
else cin>>r2;
if(c1=='R'&&c2=='R'){x1=p1.x>p3.x?p1.x:p3.x;x2=p2.x>p4.x?p4.x:p2.x;
y1=p1.y>p3.y?p1.y:p3.y;y2=p2.y>p4.y?p4.y:p2.y;
if(x2>x1&&y2>y1)printf("%.0fn",(x2-x1)*(y2-y1));
else printf("0n");
}
else if(c1=='C'&&c2=='C'){if(p1.x==p3.x&&p1.y==p3.y){r=r1<r2?r1:r2;printf("%.0fn",pi*r*r);continue;}
l=sqrt((p1.x-p3.x)*(p1.x-p3.x)+(p1.y-p3.y)*(p1.y-p3.y));
if(l>=r1+r2){printf("0n");continue;}
da=acos((l*l+r1*r1-r2*r2)/2/l/r1);
db=acos((l*l+r2*r2-r1*r1)/2/l/r2);
area=r1*r1*da+r2*r2*db-r1*l*sin(da);
printf("%.0fn",area);
}
else {if(c1=='C')printf("%.0fn",doit(p3,p4,p1,r1));
else printf("%.0fn",doit(p1,p2,p3,r2));
}
}
return 0;
}