Megumin的爆裂魔法 UESTC P1508

#include<bits/stdc++.h>
using namespace std;

#define rep(a,b) for(int i=a;i<=b;i++)
#define red(a,b) for(int i=a;i>=b;i--)
#define ULL unsigned long long 
#define LL long long 

const double inf =10e-8;
double x[3],y[3];

double cal(double x,double y)
{
    if(abs(x-y)<inf)return 0;
    else
    {
        return (x-y);
    } 
}

void _()
{
    printf("%.4lf %.4lf %.4lf",0.0,x[0],y[0]);
}

void __()
{
    double x1=(x[0]+x[1])/2;
    double y1=(y[0]+y[1])/2;
    double d=(x1-x[0])*(x1-x[0])+(y1-y[0])*(y1-y[0]);
    d=sqrt(d);
    printf("%.4lf %.4lf %.4lf",d,x1,y1);    
}

bool w(int i,int j)
{
    if(cal(x[i],x[j])==0&&cal(y[i],y[j])==0)
    return true;
    else return false;
}

bool ____()
{
    if(w(0,1)&&w(1,2)&&w(0,2))
    {
        printf("%.4lf %.4lf %.4lf",0.0,x[0],y[0]);
        return true;
    }
    else if(w(0,1))
    {
        x[0]=x[2];
        y[0]=y[2];
        __();
        return true;
    }
    else if(w(1,2))
    {
        x[0]=x[2];
        y[0]=y[2];
        __();
        return true;
    }
    else if(w(0,2))
    {
        x[1]=x[2];
        y[1]=y[2];
        __();
        return true;
    }
    return false;
}

bool check()
{
    if(____())return true;
    double k=100000000;
    vector<double>v;
    vector<int>X,Y;
    for(int i=0;i<=1;i++)
        for(int j=i+1;j<=2;j++)
        {
            v.push_back(sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])));
            X.push_back(i);
            Y.push_back(j);
        }
    for(int i=0;i<=2;i++)
    {
        double H=v[(i+1)%3]*v[(i+1)%3]+v[(i+2)%3]*v[(i+2)%3]-v[i]*v[i];
        H/=2*v[(i+1)%3]*v[(i+2)%3];
        if(H<0)
        {
            double r=v[i]/2;
            double x_=(x[X[i]]+x[Y[i]])/2;
            double y_=(y[X[i]]+y[Y[i]])/2;
            printf("%.4lf %.4lf %.4lf",r,x_,y_);    
            return  true;
        }
    }
    return false;
}

void ___()
{
    double xr,yr,r;
    double a1,a2,a3,a4,b1,b2,b3,b4;
    double x1=x[0],x2=x[1],x3=x[2];
    double y1=y[0],y2=y[1],y3=y[2];
    if(check())return ;
    a1=(x1+x2)/2,a2=(y1+y2)/2,a3=(y1-y2),a4=(x2-x1);
    b1=(x2+x3)/2,b2=(y2+y3)/2,b3=(y2-y3),b4=(x3-x2);    
    double T=b1*b4-b2*b3-b4*a1+a2*b3;
    T/=(a3*b4-b3*a4);
    xr=T*a3+a1;
    yr=T*a4+a2;
    r=sqrt((xr-x1)*(xr-x1)+(yr-y1)*(yr-y1));
    printf("%.4lf %.4lf %.4lf",r,xr,yr);
    return ;
}


int main()
{
    int n,cnt;
    cin>>n;
    rep(1,n)
    cin>>x[i-1]>>y[i-1];
    if(n==1)_();
    else if(n==2)__();
    else ___();
    system("pause");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值