直线与圆 · 从方程到位置关系
解析几何的做法是给平面配上坐标,让每条直线、每个圆对应一个方程,于是「两条线是否垂直」「直线与圆交于几点」这类几何判断变成了系数之间的运算。本系列走的正是这条路:先把直线的各种写法与它们各自的适用范围理清,再把平行、垂直、距离三件事写成公式,最后处理圆——它的方程有两种写法,而位置关系的判据全都落在距离与半径的比较上。
两处贯穿全篇的取舍值得先说。其一是为什么内部统一用一般式:斜截式 y = kx + b 写不出竖直线,而「斜率不存在」这一支若渗进每个函数,平行判定、垂直判定、交点、距离都要各带一套分情形;改用一般式之后,平行是 A₁B₂ − A₂B₁ = 0、垂直是 A₁A₂ + B₁B₂ = 0,两式都不含分母也不含例外。其二是判定与计算的先后:弦长公式 2√(r² − d²) 在相离时开出的是负数的平方根,圆的一般式在 D² + E² − 4F < 0 时同样如此。先判分类再算数值,得到的是「无图形」这个结论;反过来先算再判,得到的是一路传下去而不抛错的 NaN。
倾斜角取值 [0°, 180°),每条直线都有;斜率是它的正切,竖直线没有斜率。方程的四种写法各要求某个量存在,一般式对全体直线成立。平行、垂直与距离三件事都能写成只含系数的表达式。
倾斜角与斜率
倾斜角是直线与 x 轴正方向所成的角,取值 [0°, 180°),每条直线都有;斜率是它的正切,竖直线没有斜率。两者不是线性关系,倾斜角接近 90° 时斜率急速增大。
直线方程的五种形式
点斜式、斜截式、两点式、截距式各有失效的情形,一般式 Ax + By + C = 0 没有例外但系数不唯一。选哪种写法取决于题目给出的条件,最后一律可化为一般式。
平行、垂直与距离
平行判据 A₁B₂ − A₂B₁ = 0、垂直判据 A₁A₂ + B₁B₂ = 0 都不含分母,无须讨论斜率是否存在。点到直线的距离由 |Ax₀ + By₀ + C| / √(A² + B²) 给出,两平行线的距离须先归一化系数。
「斜率不存在」在浮点里没有标记
Math.tan(Math.PI / 2) 不返回 Infinity,而是 1.6331e16:π/2 无法被双精度精确表示,Math.PI / 2 与它相差约 6e-17,正切在那个近似值处是个有限的大数。于是「竖直线没有斜率」这件事在数值上没有任何标记可查,拿到的只是一个很大的数。判据因此必须落在系数上——一般式的 B 是否为零、两点的横坐标是否相等——而不是看 k 的量级。倾斜角 89.99999° 对应的斜率已是 5.73e6,与真正的竖直线在图上无从分辨,但它会一路带着这个大数进入后续计算。标准式给出圆心与半径,一般式便于代入求解——三点定圆靠的就是它给出的线性方程组。直线与圆比较 d 与 r,圆与圆比较圆心距与 r₁ ± r₂ 两个界;相切都是测度为零的临界情形。
圆的标准方程与一般方程
标准方程直接给出圆心与半径,一般方程 x² + y² + Dx + Ey + F = 0 便于代入求解。后者表示圆的条件是 D² + E² − 4F > 0,等于零是一个点,小于零无实图形。
直线与圆的位置关系
比较圆心到直线的距离 d 与半径 r 即得相离、相切、相交三种关系,与联立后的判别式等价。弦长为 2√(r² − d²);过圆外一点可作两条切线,切点由切点弦确定。
圆与圆的位置关系
五种位置关系由圆心距 d 与 r₁ + r₂、|r₁ − r₂| 的比较给出。两圆方程相减消去平方项,得到根轴:相交时它是公共弦所在的直线,相切时是公切线。
两处必须「先判后算」的地方
2√(r² − d²):实测 r = 2、d = 2.0000001 时被开方的量是 −4.0e-7,结果 NaN。圆的一般式:D² + E² − 4F 为负时先开方同样得 NaN。两处的正确写法都是先按符号分类,再决定要不要开这个方——相离时本就没有弦,D² + E² − 4F < 0 时本就没有图形。NaN 的麻烦在于它不抛异常、也不参与比较(与它的任何比较都是 false),一路传到绘图代码里只表现为「图形凭空消失」,看不出是哪一步出的问题。相关链接
直线
- Slope — Wikipedia en.wikipedia.org 斜率的定义、两点公式与倾斜角的关系。
- Linear equation — Wikipedia en.wikipedia.org 直线方程的各种形式及其相互转换。
- Distance from a point to a line — Wikipedia en.wikipedia.org 点到直线距离公式的多种推导。
- Cramer's rule — Wikipedia en.wikipedia.org 二元一次方程组的行列式解法, 交点公式的来历。
圆与位置关系
- Circle — Wikipedia en.wikipedia.org 圆的方程、标准式与一般式的关系。
- Circumscribed circle — Wikipedia en.wikipedia.org 三点定圆即三角形的外接圆。
- Tangent lines to circles — Wikipedia en.wikipedia.org 切线的性质、切线长, 以及两圆公切线的条数。
- Chord (geometry) — Wikipedia en.wikipedia.org 弦、弦心距与弦长公式。
- Radical axis — Wikipedia en.wikipedia.org 根轴的定义、与圆心连线垂直, 以及三圆的根心。
- Circle-Circle Intersection — Wolfram MathWorld mathworld.wolfram.com 两圆交点的坐标公式与分类。
数值实现
- Condition number — Wikipedia en.wikipedia.org 行列式趋零时解的敏感性, 近平行两线求交的失准来源。
-
IEEE 754 — Wikipedia
en.wikipedia.org
双精度的表示范围, 以及
π/2无法精确表示的后果。 -
NaN — Wikipedia
en.wikipedia.org
NaN的传播规则与「与它的任何比较都为假」这一性质。