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;
}
Beispiel #2
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);
}