1329:Circle Through Three Points

keyword

幾何 外心 C++

概要

平面上の3点が与えられたとき、外接円の方程式を出力する問題。
既にライブラリがあったが、sin2A, sin2B, sin2Cの重み付き平均を利用したものだったせいか誤差死。ググってみると面積をつかって求める方法発見。実装してみてsubmit->AC。

template<typename T>
P ccenter(P a, P b, P c){
    T A = norm(b-c), B = norm(a-c), C = norm(a-b);
    return (A*(B+C-A)*a + B*(C+A-B)*b + C*(A+B-C)*c)/(16*getArea(a,b,c)*getArea(a,b,c));
}

int main(){
    double x, y, a, b, r, c, d, e;
    char sa, sb, sc, sd, se;
    int cnt=0;
    point p1, p2, p3, cc;
    while(scanf("%lf%lf",&x,&y)!=EOF){
        if(cnt++)printf("\n");
        p1 = point(x,y);
        scanf("%lf%lf",&x,&y);
        p2 = point(x,y);
        scanf("%lf%lf",&x,&y);
        p3 = point(x,y);
        cc = ccenter(p1, p2, p3);

        a = cc.real();
        b = cc.imag();
        r = abs(cc-p1);
        sa = (a<0)?'+':'-';
        sb = (b<0)?'+':'-';

        printf("(x %c %.3f)^2 + (y %c %.3f)^2 = %.3f^2\n",sa,fabs(a),sb,fabs(b),r);

        c = 2*a;
        d = 2*b;
        e = -r*r + a*a + b*b;
        sc = (c<0)?'+':'-';
        sd = (d<0)?'+':'-';
        se = (e>0)?'+':'-';

        printf("x^2 + y^2 %c %.3fx %c %.3fy %c %.3f = 0\n",sc,fabs(c),sd,fabs(d),se,fabs(e));
    }

    return 0;
}