세 점을 통한 원


13

평면에 세 점의 데카르트 좌표가 주어지면 그 점을 통해 원의 방정식을 찾으십시오. 세 점은 직선이 아닙니다.

프로그램에 입력의 각 줄은 포함 x하고 y순서대로 세 점의 좌표를 A(x),A(y),B(x),B(y),C(x),C(y). 이 좌표는 공간으로 구분 된 1,000,000 미만의 실수입니다.

해는 형식의 방정식으로 인쇄됩니다 (x-h)^2 + (y-k)^2 = r^2. 값은 h, k, r소수점 후 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 No. 그렇게하면 다른 답변과 비교하기가 어려울 것입니다.
fR0DDY

고유 한 솔루션이없는 경우 무엇을 출력해야합니까? 수치 적 견고성에는 어떤 제약이 있습니까?
피터 테일러

@ peter-taylor 문제 진술에서 '세 점은 직선이 아닙니다.'
fR0DDY

2
허용되는 것은 문자 수가 적기 때문에 내 솔루션이 몇 가지 더 짧고 솔직한 질문 일 수 있다는 것을 암시하지 않습니다 ... 그러나 공백이 출력 사양에있는 경우 필수적이지 않아야합니까? 그렇지 않으면 코드 골프에서 누군가 출력 사양을 충족하는 이유는 무엇입니까?
Rebecca Chernoff

답변:


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원의 중심입니다.


@Joey : 그래, 내 나쁜. 결정된.
키스 랜달

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 사이의 두 줄을 찾습니다. 그런 다음 두 선의 이등분이 교차하는 곳을 찾습니다. (방금 @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

에 할당을 인라인 x, y그리고 r통화에서하는 것은 할 %수 있다면, 도움이 될 것입니다.
Lowjacker

@Joey : 미안하지만, 질문을 읽을 때 그것을 놓쳤다. 지금 고쳤습니다.
Ventero

1

볼프람 알파 (27)

작업에 적합한 도구를 사용하십시오.

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

여기에 예가 있습니다 .


6
입력 처리가 없습니까? 여러 줄의 입력을 지원하지 않습니까? 나는 이것이 자격이 없다고 말하고 싶습니다.
Joey

0

자바 스크립트 (299)

내가 이것을 해결할 생각할 수있는 유일한 방법은 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
나침반과 직선으로 할 수 있습니다. 두 점을 취하여 양분하는 선을 그립니다. 두 점의 다른 쌍을 취하십시오. 교차로를 찾으십시오. 그것이 더 짧은 코드로 이어지는 지 여부는 아직 조사하지 않았습니다.
피터 테일러

이것은 한 줄의 입력 만 처리합니다.
Joey

@ 조이. 문제가 여러 줄 처리를 필요로합니까?
피터 올슨

1
작업에서 인용 :»프로그램의 각 입력 줄에는 세 점의 x 및 y 좌표가 포함됩니다 ...«
Joey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.