Python

2 min read

http://www.checkio.org/mission/task/info/three-points-circle/python-27/
问题简化下来就是:给出三个点,求这三个点所在圆的方程
说实话,这个问题看起来很简单的,全是初中数学知识。求园的方程无非就是两点:

  1. 圆心座标
  2. 半径

求圆心座标是很简单的事情:用这三个点做两条线段,做这两条线的中垂线,两条中垂线的交点就是圆心。在知道圆心座标后,半径自然就非常简单了。不过在过程中还是有些需要注意的地方:

1. 两条线段的表示方式

无非就是两种方式y=ax+c或者ax+by+c=0两种,但是考虑到线段所在的直线可能平行于X轴或者Y轴,第一种方式相对来说就有一些局限了——因为无法表示平行于Y轴的线段。当然除此之外,都是可以的。所以我除此之外都将b固定为-1,平行的时候设置为0。

在确定了表示方法后,就是需要求出a和c两个常量,对应的方法很简单——先求斜率a,在求c

2. 有了两条线段所在直线的方程后,求中垂线方程

线段的中间点很简单,不需要任何技巧。而且对于已知斜率为k的直线,垂线斜率为-1/k。

当然还是需要把平行于X轴和Y轴这两种情况单独拿出来,-1/k是不行的。

3. 两条中垂线的交点与半径

对于已知的两条直线,交点座标可以用百科上的方法来得到。在有了圆心座标后,半径也就很方便的可以得到了。

4. 如何表示成要求的形式

以前我一直都使用这样的方式格式化字符串:

'x-%d' % 4.0这样的方式当浮点数后面全是0的时候,无法表示成整形的样子。也就是说,4.1要不只能4.1,要不只能4;4.0要不只能4.0,要不只能4

而题目所需要的表示方式是,当小数点后面全是0的时候,表示成整数的形式,其他时候表示成两位小数。难道我还需要手动判断吗?

恕我孤陋寡闻,在google以后才知道还有另外的方式表示
'x-{:g}'.format(4.0)这种方式从文档中看更加灵活,而且有一个超方便的g参数,可以实现我们的要求。实在爽翻了!

下面是代码

Ken Lai

Read more posts by this author.