3点を通る円


13

平面上の3点のデカルト座標が与えられると、それらすべてを通る円の方程式を見つけます。3つのポイントは直線上にありません。

プログラムへの入力の各行には、3つのポイントxy座標が順番に含まれA(x),A(y),B(x),B(y),C(x),C(y)ます。これらの座標は、スペースで区切られた1,000,000未満の実数になります。

解はの方程式として印刷され(x-h)^2 + (y-k)^2 = r^2ます。値はhkr小数点以下3桁で印刷されることになります。方程式のプラス記号とマイナス記号は、数値の前に複数の記号が付かないように、必要に応じて変更する必要があります。

Sample Inputs

7.0 -5.0 -1.0 1.0 0.0 -6.0
1.0 7.0 8.0 6.0 7.0 -2.0

Sample Outputs

(x - 3.000)^2 + (y + 2.000)^2 = 5.000^2
(x - 3.921)^2 + (y - 2.447)^2 = 5.409^2

代わりに極方程式またはパラメトリック方程式を使用できますか?
ピーターオルソン

@peterいいえ。そうすれば、他の回答と比較するのが難しくなります。
fR0DDY

独自のソリューションがない場合、何を出力する必要がありますか?数値の堅牢性にはどのような制約がありますか?
ピーターテイラー

@ peter-taylor問題文には、「3つの点は直線上にない」と書かれています。
fR0DDY

2
確かに、それはほんの数文字ですので、これは私の解決策が少し短くなる可能性があるということではなく、正直な質問です...しかし、空白が出力仕様にある場合、それは必須ではないでしょうか?さもなければ、コードゴルフで、なぜ誰もが出力仕様を満たすのでしょうか?
レベッカチェルノフ

回答:


6

Pythonの、176の 189文字

import sys,re
for s in sys.stdin:x,y,z=eval(re.sub(r'(\S+) (\S+)',r'\1+\2j,',s));w=z-x;w/=y-x;c=(x-y)*(w-abs(w)**2)/2j/w.imag-x;print'(x%+.3f)^2+(y%+.3f)^2=%.3f^2'%(c.real,c.imag,abs(c+x))

すべての作業を複雑な平面で行います。このページの下から数学に行きます-c円の中心です。


@ジョーイ:うん、悪い。修繕。
キースランドール

2

C#-490

using System;class C{static void Main(){Func<string,double>p=s=>double.Parse(s);Func<double,string>t=s=>(s<0?"+ ":"- ")+Math.Abs(s).ToString("F3");foreach(var l in System.IO.File.ReadAllLines("i")){var v=l.Split();double a=p(v[0]),b=p(v[1]),c=p(v[2]),d=p(v[3]),e=p(v[4]),f=p(v[5]),m=(d-b)/(c-a),n=(f-d)/(e-c),x=(m*n*(b-f)+n*(a+c)-m*(c+e))/(2*(n-m)),y=-(x-(a+c)/2)/m+(b+d)/2,r=Math.Sqrt((x-a)*(x-a)+(y-b)*(y-b));Console.WriteLine("(x "+t(x)+")^2+(y "+t(y)+")^2 = "+r.ToString("F3")+"^2");}}}

これにより、ABとBCの間の2行が見つかります。次に、これらの2本の線の二等分線が交差する場所を見つけます。(気づいたのは、@ PeterTaylorが@PeterOfTheCornへのコメントで言及したことです。)


2

ルビー、192文字

$<.map{|l|a,b,c,d,e,f=l.split.map &:to_f
n=(f-d)/(e-c)
puts"(x%+.3f)^2+(y%+.3f)^2=%.3f^2"%[x=-(n*(a+c)+(n*(b-f)-(c+e))*m=(d-b)/(c-a))/2/n-=m,y=-(x+(a+c)/2)/m-(b+d)/2,((a+x)**2+(b+y)**2)**0.5]}

使用例:

$ echo "7.0 -5.0 -1.0 1.0 0.0 -6.0
1.0 7.0 8.0 6.0 7.0 -2.0" | ruby circle.rb
(x-3.000)^2+(y+2.000)^2=5.000^2
(x-3.921)^2+(y-2.447)^2=5.409^2

割り当てをインライン化xyおよびrコールには、することが%可能な場合に、役立つはずです。
ロージャッカー

@ジョイ:ごめんなさい、質問を読んでいるときにそれを見逃したようです。今それを修正しました。
ヴェンテロ

1

ウルフラムアルファ(27)

私は言う、仕事に適切なツールを使用します。

equation circle ([Input1],[Input2]),([Input3],[Input4]),([Input5],[Input6])

ここに例。


6
入力処理はありませんか?複数行の入力はサポートされていませんか?これは資格がないと思います。
ジョーイ

0

Javascript(299)

これを解決することを考えることができる唯一の方法は、3つの未知数に対して3つの方程式を代数的に解いてh、k、rを見つけることでした。

p=prompt().split(' ');a=p[0],b=p[1],c=p[2],d=p[3],e=p[4],f=p[5];h=((a*a+b*b)*(f-d)+(c*c+d*d)*(b-f)+(e*e+f*f)*(d-b))/(a*(f-d)+c*(b-f)+e*(d-b))/2;k=((a*a+b*b)*(e-c)+(c*c+d*d)*(a-e)+(e*e+f*f)*(c-a))/(b*(e-c)+d*(a-e)+f*(c-a))/2;r=Math.sqrt((a-h)*(a-h)+(b-k)*(b-k));alert("(x-"+h+")²+(y-"+k+")²="+r+"²");

I / Oの例:

7.0 -5.0 -1.0 1.0 0.0 -6.0 -> (x-3)²+(y--2)²=5²

1.0 7.0 8.0 6.0 7.0 -2.0 -> (x-3.9210526315789473)²+(y-2.4473684210526314)² =5.409159155551175²

私が見る唯一のバグは、hまたはkが負の場合、の--代わりに出力することです+


2
コンパスとストレートエッジで行うことができます。2点を取り、それらを二分する線を引きます。2点の異なるペアを取得します。交差点を見つけます。それがコードの短縮につながるかどうかは、まだ調査していません。
ピーターテイラー

これは、1行の入力のみを処理しますか?
ジョーイ

@ジョイ、はい。問題には複数行の処理が必要ですか?
ピーターオルソン

1
タスクからの引用:»プログラムへの入力の各行には、3点のx座標とy座標が含まれます...«
Joey
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.