Üç Noktadan Daire


13

Bir düzlemde üç noktanın Kartezyen koordinatları göz önüne alındığında, dairenin denklemini hepsinden bulun. Üç nokta düz bir çizgide olmayacak.

Programınıza her girdi satırı , sırayla üç noktanın xve ykoordinatlarını içerecektir A(x),A(y),B(x),B(y),C(x),C(y). Bu koordinatlar, boşlukla birbirinden ayrılmış 1.000.000'dan küçük gerçek sayılar olacaktır.

Çözelti, formun bir denklemi olarak yazdırılmalıdır (x-h)^2 + (y-k)^2 = r^2. İçin değerler h, k, rondalık noktadan sonra üç haneli basılacak. Bir sayıdan önce çoklu işaretleri önlemek için denklemlerdeki artı ve eksi işaretleri gerektiği gibi değiştirilmelidir.

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

Bunun yerine polar veya parametrik denklemler kullanabilir miyiz?
Peter Olson

Bu şekilde diğer cevaplarla karşılaştırmak zor olacaktır.
fR0DDY

Benzersiz bir çözüm bulunmaması durumunda ne elde edilmelidir? Sayısal sağlamlık konusunda ne gibi kısıtlamalar var?
Peter Taylor

@ peter-taylor Problem ifadesinde 'Üç nokta düz bir çizgide olmayacak' şeklinde belirtilmiştir.
fR0DDY

2
Verilen, sadece birkaç karakter, bu yüzden benim çözümümün daha kısa olabileceği bir rant değil, sadece dürüst bir soru ... ama eğer boşluk çıktı özelliğinde ise, zorunlu olmamalı mı? Aksi halde, bir kod golfünde, neden çıktı spesifikasyonunu karşılayalım ki?
Rebecca Chernoff

Yanıtlar:


6

Piton, 176 189 karakter

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))

Tüm çalışmalarını karmaşık düzlemde yapar. Bu sayfanın alt kısmından matematiğe gidiyorum . -cdairenin merkezidir.


@Joey: evet, benim hatam. Sabit.
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");}}}

Bu AB ve BC arasındaki 2 çizgiyi bulur. Sonra bu 2 çizginin ikililerinin kesiştiği yeri bulur. (@PeterTaylor @PeterOfTheCorn'a yaptığı yorumda bahsettiğim şey sadece fark ettim.)


2

Ruby, 192 karakter

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

Kullanım örnekleri:

$ 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

Mümkünse x, yve rçağrısındaki atamaların satır içine %alınması yardımcı olacaktır.
Lowjacker

@Joey: Üzgünüm, soruyu okurken bunu kaçırdılar. Şimdi düzeltildi.
Ventero

1

Wolfram Alfa (27)

Diyorum ki, iş için uygun aracı kullanın.

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

Burada örnek .


6
Giriş işleme yok mu? Birden çok girdi satırı için destek yok mu? Bunun yeterli olmadığını söyleyebilirim.
Joey

0

Javascript (299)

Bunu çözmeyi düşünebilmemin tek yolu, üç bilinmeyen için h, k ve r'yi bulmak için üç denklemi cebirsel olarak çözmekti.

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+"²");

Örnek G / Ç:

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²

Gördüğüm tek hata, h veya k negatifse, bunun --yerine çıktılar olmasıdır +.


2
Pusula ve düz kenar ile yapılabilir. İki puan al, onları ikiye ayıran çizgiyi çiz. Farklı bir iki nokta al, aynen. Kavşağı bulun. Bu kısa kod yol açar olsun, ben henüz araştırmak zorunda.
Peter Taylor

Bu sadece tek bir satır giriş yapar, değil mi?
Joey

@Joey, evet. Sorun birden fazla satır işleme gerektiriyor mu?
Peter Olson

1
Görevden alıntı: »Programınıza her girdi satırı üç noktanın x ve y koordinatlarını içerecektir ...«
Joey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.