Vòng qua ba điểm


13

Cho tọa độ Descartes của ba điểm trên một mặt phẳng, tìm phương trình của đường tròn qua tất cả chúng. Ba điểm sẽ không nằm trên một đường thẳng.

Mỗi dòng đầu vào cho chương trình của bạn sẽ chứa xytọa độ của ba điểm, theo thứ tự A(x),A(y),B(x),B(y),C(x),C(y). Các tọa độ này sẽ là các số thực nhỏ hơn 1.000.000 được phân tách với nhau bằng khoảng trắng.

Giải pháp là được in dưới dạng phương trình của biểu mẫu (x-h)^2 + (y-k)^2 = r^2. Giá trị cho h, k, rphải được in bằng ba chữ số sau dấu thập phân. Các dấu cộng và dấu trừ trong các phương trình nên được thay đổi khi cần thiết để tránh nhiều dấu hiệu trước một số.

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

Chúng ta có thể sử dụng phương trình cực hoặc tham số thay thế?
Peter Olson

@peter Không. Bằng cách đó, sẽ rất khó để so sánh với các câu trả lời khác.
fR0DY

Điều gì sẽ là đầu ra trong trường hợp không có một giải pháp duy nhất? Những hạn chế nào về độ mạnh của số?
Peter Taylor

@ peter-taylor Nó được đưa ra trong tuyên bố vấn đề rằng 'Ba điểm sẽ không nằm trên một đường thẳng.'
fR0DDY

2
Cấp, nó chỉ có một vài ký tự nên đây không phải là một câu nói hay mà giải pháp của tôi có thể ngắn hơn một chút, chỉ là một câu hỏi trung thực ... nhưng nếu khoảng trắng nằm trong thông số đầu ra, thì có nên bắt buộc không? Nếu không, trong một golf-code, tại sao mọi người sẽ đáp ứng thông số kỹ thuật đầu ra?
Rebecca Chernoff

Câu trả lời:


6

Python, 176 189 ký tự

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ó phải tất cả công việc của nó trong mặt phẳng phức tạp. Tôi đi toán từ cuối trang này . -clà tâm của vòng tròn.


@Joey: vâng, xấu của tôi. Đã sửa.
Keith Randall

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

Điều này tìm thấy 2 dòng giữa AB và BC. Sau đó, nó tìm thấy nơi chia đôi của hai dòng đó giao nhau. (Điều tôi vừa nhận thấy là những gì @PeterTaylor đã đề cập trong bình luận của anh ấy với @PeterOfTheCorn.)


2

Ruby, 192 ký tự

$<.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]}

Ví dụ sử dụng:

$ 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

Nội tuyến công việc để x, yrtrong các cuộc gọi đến %nên giúp đỡ, nếu có thể.
Lowjacker

@Joey: Xin lỗi, dường như đã bỏ lỡ điều đó khi đọc câu hỏi. Đã sửa nó ngay.
Ventero

1

Wolfram Alpha (27)

Tôi nói, sử dụng các công cụ thích hợp cho công việc.

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

Ví dụ ở đây .


6
Không xử lý đầu vào? Không hỗ trợ cho nhiều dòng đầu vào? Tôi muốn nói điều này không đủ điều kiện.
Joey

0

Javascript (299)

Cách duy nhất mà tôi có thể nghĩ đến để giải quyết điều này là giải đại số ba phương trình cho ba ẩn số để tìm h, k và 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+"²");

Ví dụ 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²

Lỗi duy nhất mà tôi thấy là nếu h hoặc k âm, nó xuất ra --thay vì +.


2
Nó có thể được thực hiện với la bàn và cạnh thẳng. Lấy hai điểm, vẽ đường thẳng chia đôi chúng. Lấy một cặp khác nhau của hai điểm, ditto. Tìm giao điểm. Cho dù điều đó dẫn đến mã ngắn hơn, tôi vẫn chưa điều tra.
Peter Taylor

Điều này chỉ xử lý một dòng đầu vào, phải không?
Joey

@Jey, vâng. Có vấn đề yêu cầu xử lý nhiều dòng?
Peter Olson

1
Trích dẫn từ tác vụ: »Mỗi dòng đầu vào cho chương trình của bạn sẽ chứa tọa độ x và y của ba điểm ...«
Joey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.