通过三点圈


13

给定平面上三个点的笛卡尔坐标,通过它们全部找到圆的方程。这三个点将不在一条直线上。

程序输入的每一行将按顺序包含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将被印刷有小数点后三位数字。应根据需要更改方程式中的正号和负号,以避免在数字前出现多个正号。

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

我们可以改用极性或参数方程吗?
彼得·奥尔森

@peterNo。那样将很难与其他答案进行比较。
fR0DDY 2011年

如果没有独特的解决方案,应该输出什么?数值鲁棒性有哪些约束?
彼得·泰勒

@ peter-taylor问题说明中给出了“这三点不会成一直线”。
fR0DDY 2011年

2
当然,它只有几个字符,所以我的解决方案可能要短一些,这不是一个问题,这只是一个老实的问题……但是,如果输出规范中包含空格,这不是强制性的吗?否则,在代码高尔夫球中,为什么有人会满足输出规范?
丽贝卡·切诺夫

Answers:


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之间的2条线。然后找到这两条线的二等分线相交的位置。(我刚刚注意到的是@PeterTaylor在对@PeterOfTheCorn的评论中提到的内容。)


2

Ruby,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,将分配内联到中,yr在调用中%应该会有所帮助。
Lowjacker

@Joey:对不起,在阅读问题时显然错过了。立即修复。
Ventero

1

沃尔夫勒姆·阿尔法(27)

我说,使用适当的工具完成工作。

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

这里的例子。


6
没有输入处理?不支持多行输入?我会说这不符合条件。
乔伊,

0

Javascript(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
可以用指南针和直边完成。取两点,画出将它们一分为二的线。取两点不同,同上。找到路口。是否会导致代码缩短,我尚未进行调查。
彼得·泰勒

这样只能处理一行输入,对吗?
乔伊

@乔伊,是的。问题是否需要多次处理?
彼得·奥尔森

1
引用任务:»程序的每一行输入将包含三个点的x和y坐标...«
Joey
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.