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; }