配方 · D² + E² − 4F
圆的标准方程与一般方程
圆是平面上到定点距离等于定长的点的集合。这句定义直接翻译成方程就是标准方程;把它展开并重新命名系数,得到便于联立求解的一般方程。两种写法各有专长,互相转换只需一次配方。
1 · 标准方程
圆心
C(a,b)、半径
r
的圆上任一点
(x,y)
满足
(x−a)2+(y−b)2=r,两边平方即
(x−a)2+(y−b)2=r2
三个参数一目了然,故凡是已知或要求圆心与半径的题目都用这一式。圆心在原点时简化为
x2+y2=r2。
2 · 一般方程与配方
把标准方程展开:x2+y2−2ax−2by+(a2+b2−r2)=0。记
D=−2a、E=−2b、F=a2+b2−r2,得
x2+y2+Dx+Ey+F=0
特征是
x2
与
y2
的系数相等且不为零,且没有
xy
项。反向转换靠配方:
(x+2D)2+(y+2E)2=4D2+E2−4F
圆心是
(−2D,−2E),而右端决定这个方程到底画出什么。
3 · 三种情形
定理 3.1 方程
x2+y2+Dx+Ey+F=0
表示圆当且仅当
D2+E2−4F>0,此时半径为
2D2+E2−4F。该式等于零时方程只有一个解——点
(−2D,−2E);小于零时无实数解,方程不表示任何图形。
x2+y2−2x+1=0
即
(x−1)2+y2=0,只有
(1,0)
一个解,习惯上称作点圆;x2+y2−2x+5=0
配方后右端是
−4,实平面上无图形。
图 3-1 · 一般方程的三种情形。可拖动
D、E、F
观察
D2+E2−4F
的符号如何在圆、点、无图形之间切换;另一栏给出三点定圆。
数值实现上这三种情形的判定次序要紧:必须先判右端的符号,再开平方。反过来先算
r=2D2+E2−4F
再检查,右端为负时 Math.sqrt 返回 NaN,而 NaN 不抛异常也不参与比较(任何与它的比较都是 false),一路传到绘图代码里表现为「圆凭空消失」,看不出是哪一步出的问题。circleFromGeneral 因此返回一个带
kind 字段的结果,把三种情形写进类型,调用方无从忽略。
4 · 三点定圆
不共线的三点唯一确定一个圆。求法用一般式而非标准式:把三点分别代入
x2+y2+Dx+Ey+F=0,得到关于
D、E、F
的三元一次方程组;若代入标准式,未知量
a、b、r
出现在平方项里,方程组是非线性的。这是一般方程存在的主要理由。
例 4.1 求过
(0,0)、(4,0)、(0,3)
的圆。代入得
F=0、16+4D+F=0、9+3E+F=0,解出
D=−4、E=−3、F=0,故圆心
(2,1.5)、半径
216+9=2.5。三点构成直角三角形,斜边中点恰是圆心、斜边之半恰是半径,与结果相符。
注 · circleThrough3 的第一版实现漏了一个负号:两式相减解出的是一般式的
D
与
E,而圆心是
(−2D,−2E),直接把解当圆心用就把圆心镜像到了原点另一侧。这个错误在图上不显眼——圆的大小对,位置也「像是那么回事」——但 oracle 单测的第一条(三点是否都落在算出的圆上)立刻给出
3.68
的残差。这类符号错误正是「拿独立参照实现比对」比「肉眼看图」有效的地方。
5 · 参考文献
- Circle. Wikipedia. 圆的方程、标准式与一般式的关系。https://en.wikipedia.org/wiki/Circle
- Circumscribed circle. Wikipedia. 三点定圆即三角形的外接圆。https://en.wikipedia.org/wiki/Circumscribed_circle
- Completing the square. Wikipedia. 配方法与一般式到标准式的转换。https://en.wikipedia.org/wiki/Completing_the_square