POJ 1329 求三角形外接圆

题意给出三角形三点坐标让求出该三角形的外接圆标准方程和一般方程。

这题输出很恶心,注意0.000的时候要输出并且前面的符号为“ + ”,那么外接圆的半径r通过S=(a*b*c)/(4*r)可以求出r=(a*b*c)/(4*S),然后外心坐标是三边垂直平分线的交点,求出两个垂直平分线方程然后可以得出交点坐标。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef double PointType;
struct point
{
    PointType x,y;
};
PointType TriangleArea(point pi,point pj,point pk) //判断向量PiPj在向量PiPk的顺逆时针方向 +顺-逆0共线
{
    return fabs((pj.x-pi.x)*(pk.y-pi.y)-(pk.x-pi.x)*(pj.y-pi.y))/2;
}
PointType Dis(point a,point b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main()
{
    point a,b,c;
    double r;
    int f=0;
    while(~scanf("%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y))
    {
        if(f)
            cout<<endl;
        f++;
        r=Dis(a,b)*Dis(a,c)*Dis(b,c)/TriangleArea(a,b,c)/4;
        double c1=(a.x*a.x+a.y*a.y-b.x*b.x-b.y*b.y)/2;
        double c2=(a.x*a.x+a.y*a.y-c.x*c.x-c.y*c.y)/2;
        point centre;
        centre.x=(c1*(a.y-c.y)-c2*(a.y-b.y))/((a.x-b.x)*(a.y-c.y)-(a.x-c.x)*(a.y-b.y));
        centre.y=(c1*(a.x-c.x)-c2*(a.x-b.x))/((a.y-b.y)*(a.x-c.x)-(a.y-c.y)*(a.x-b.x));
        //圆心为Center 半径为r
        cout<<"(x";
        if(centre.x>0)
            cout<<" - ",printf("%.3f",centre.x);
        else if(centre.x<=0)
            cout<<" + ",printf("%.3f",-centre.x);
        cout<<")^2 + (y";
        if(centre.y>0)
            cout<<" - ",printf("%.3f",centre.y);
        else if(centre.y<=0)
            cout<<" + ",printf("%.3f",-centre.y);
        cout<<")^2 = ",printf("%.3f",r),cout<<"^2"<<endl;
        //第二行输出开始
        cout<<"x^2 + y^2";
        if(centre.x>0)
            cout<<" - ",printf("%.3fx",2*centre.x);
        else if(centre.x<=0)
            cout<<" + ",printf("%.3fx",2*-centre.x);
        if(centre.y>0)
            cout<<" - ",printf("%.3fy",2*centre.y);
        else if(centre.y<=0)
            cout<<" + ",printf("%.3fy",2*-centre.y);
        if(centre.x*centre.x+centre.y*centre.y-r*r>=0)
            cout<<" + ",printf("%.3f",centre.x*centre.x+centre.y*centre.y-r*r);
        else if(centre.x*centre.x+centre.y*centre.y-r*r<0)
            cout<<" - ",printf("%.3f",-(centre.x*centre.x+centre.y*centre.y-r*r));
        cout<<" = 0"<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值