poj 2242(几何,中垂线,两条线相交,平行于x、y轴的特殊情况的求解)


#include
#include
#define PI 3.141592653589793
using namespace std;
int main(){
    double x[3],y[3];
    double k[2][2],b[2][2],x0,y0,r;
    while(scanf("%lf%lf%lf%lf%lf%lf",&x[0],&y[0],&x[1],&y[1],&x[2],&y[2])==6){
        if(x[0]==x[1]){
            y0 = (y[0]+y[1])/2;
            //根据第二条线求
            if(y[0]==y[2]){
                x0 = (x[0]+x[2])/2;
            }
            else{
                k[1][0] = (y[0]-y[2])/(x[0]-x[2]);
                b[1][0] = y[0]-k[1][0]*x[0];
                k[1][1] = -1/k[1][0];
                b[1][1] = (y[0]+y[2])/2-k[1][1]*(x[0]+x[2])/2;
                x0 = (y0-b[1][1])/k[1][1];
            }
            goto l1;
        } 
        if(x[0]==x[2]){
            y0 = (y[0]+y[2])/2;
            //根据第一条线求
            if(y[0]==y[1]){
                x0 = (x[0]+x[1])/2;
            }
            else{
                k[0][0] = (y[0]-y[1])/(x[0]-x[1]);
                b[0][0] = y[0]-k[0][0]*x[0];
                k[0][1] = -1/k[0][0];
                b[0][1] = (y[0]+y[1])/2-k[0][1]*(x[0]+x[1])/2;
                x0 = (y0-b[0][1])/k[0][1];
            }
            goto l1; 
         }
         if(y[0]==y[1]){
             x0 = (x[0]+x[1])/2;
             //根据第二条线求
            k[1][0] = (y[0]-y[2])/(x[0]-x[2]);
            b[1][0] = y[0]-k[1][0]*x[0];
            k[1][1] = -1/k[1][0];
            b[1][1] = (y[0]+y[2])/2-k[1][1]*(x[0]+x[2])/2;
            y0 = k[1][1]*x0 + b[1][1];
            goto l1;
        }
        if(y[0]==y[2]){
            x0 = (x[0]+x[2])/2;
            //根据第一条线求 
            k[0][0] = (y[0]-y[1])/(x[0]-x[1]);
            b[0][0] = y[0]-k[0][0]*x[0];
            k[0][1] = -1/k[0][0];
            b[0][1] = (y[0]+y[1])/2-k[0][1]*(x[0]+x[1])/2;
            y0 = k[0][1]*x0+b[0][1]; 
            goto l1; 
        }
        k[0][0] = (y[0]-y[1])/(x[0]-x[1]);
        b[0][0] = y[0]-k[0][0]*x[0];
        k[0][1] = -1/k[0][0];
        b[0][1] = (y[0]+y[1])/2-k[0][1]*(x[0]+x[1])/2;
        
        k[1][0] = (y[0]-y[2])/(x[0]-x[2]);
        b[1][0] = y[0]-k[1][0]*x[0];
        k[1][1] = -1/k[1][0];
        b[1][1] = (y[0]+y[2])/2-k[1][1]*(x[0]+x[2])/2;
        
        x0 = -(b[1][1]-b[0][1])/(k[1][1]-k[0][1]);
        y0 = k[0][1]*x0+b[0][1];
        
l1:        r = sqrt((x0-x[0])*(x0-x[0])+(y0-y[0])*(y0-y[0]));
        printf("%.2lf\n",PI*r*2);
    }
    return 0;
}