bool cmp(point left, point right) { point a = left - points[0], b = right - left; if(a.x * b.y > b.x * a.y) return 1; if(a.x * b.y == b.x * a.y) return left.len() < right.len(); return 0; }
circle( point a,point b,point c ) { double A,B,C,D,E,F; A=2*a.x-2*b.x; B=2*a.y-2*b.y; C=SQ( a.len() )-SQ( b.len() ); D=2*a.x-2*c.x; E=2*a.y-2*c.y; F=SQ( a.len() )-SQ( c.len() ); ct.x=( C*E-B*F )/( A*E-B*D ); ct.y=( A*F-C*D )/( A*E-B*D ); r=( a-ct ).len(); }
double areaCT(const circle &cir, point pa, point pb) { pa = pa - cir.o; pb = pb - cir.o; double R = cir.r; if (pa.len() < pb.len()) swap(pa, pb); if (pb.len() < EPS) return 0; point pc = pb - pa; double a = pa.len(), b = pb.len(), c = pc.len(); double cosB = dot(pb, pc) / b / c, B = acos(cosB); double cosC = dot(pa, pb) / a / b, C = acos(cosC); double S, h, theta; if (b > R) { S = C * 0.5 * R * R; h = b * a * sin(C) / c; if (h < R && B < PI * 0.5) S -= acos(h / R) * R * R - h * sqrt(R * R - h * h); } else if (a > R) { theta = PI - B - asin(sin(B) / R * b); S = 0.5 * b * R * sin(theta) + (C - theta) * 0.5 * R * R; } else S = 0.5 * sin(C) * b * a; return S; }
double get_dis(point v,point p) { if(fabs(v.x*p.y - p.x*v.y) < eps) return 0; double si = (v.x*p.y-p.x*v.y)/dis(point(0,0),v)/p.len(); return p.len() * fabs(si); }