圆与直线相交当且仅当圆心到直线的距离≤半径;用一般式ax+by+c=0计算距离,需校验a、b不同时为0,调用std::abs和std::sqrt,比较时引入浮点容差。

用点到直线距离公式判断相交关系
核心思路是:圆与直线相交 ⇔ 圆心到直线的距离 ≤ 半径。C++ 里不需要解方程组,直接算几何距离最稳。
假设圆心为 (cx, cy)、半径为 r,直线由一般式 Ax + By + C = 0 表示(注意不是斜截式,避免除零),则距离公式为:
distance = abs(A * cx + B * cy + C) / sqrt(A * A + B * B)
实际编码时要注意:
-
A、B同时为 0 是非法直线,必须提前检查,否则sqrt(0)导致除零或 NaN - 用
std::abs和std::sqrt,别用abs(整数版)或忘记#include <cmath></cmath> - 比较时建议用
distance 防浮点误差,尤其当距离非常接近 <code>r时
从两点式直线快速转成一般式
如果直线给的是两个点 p1(x1, y1)、p2(x2, y2),得先转成 Ax + By + C = 0 才能套距离公式。
转换方法是利用向量法向量:A = y1 - y2,B = x2 - x1,C = x1*y2 - x2*y1。这样保证方向一致且数值稳定。
常见坑:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 顺序颠倒导致
A、B符号反了——不影响距离计算(有abs),但若后续要判断哪侧交点,就得统一约定 - 两点重合(即
x1==x2 && y1==y2)时,A和B全为 0,必须单独处理,这不是一条有效直线 - 不要用斜率
k=(y2-y1)/(x2-x1)再套y = kx + b转一般式——x1 == x2 时直接崩溃
需要区分相切、相交、不相交时怎么扩展
仅判断“是否相交”只需比较距离和半径;但若需分类,就看距离与半径的大小关系:
-
distance > r→ 不相交(无交点) -
distance == r(含浮点容差)→ 相切(1 个交点) distance → 相交(2 个交点)
注意:不要用 == 直接比浮点数。稳妥写法是:
if (distance > r + 1e-9) { /* 不相交 */ }<br>else if (distance else { /* 相切 */ }
容差值选 1e-9 适合 double 类型坐标;如果坐标是 float 或量级很大(比如地图经纬度 × 1e6),容差得相应放大。
要不要真算出交点坐标?
只判断是否相交,完全不用解二次方程。一旦开始求交点,就得联立直线参数式和圆方程,涉及开方、判别式、除法、分支逻辑——代码量翻倍,且浮点误差更难控。
除非业务明确需要交点位置(比如碰撞响应、裁剪),否则坚持用距离法。它快、稳、无分支、可向量化。
真要算交点时,别手推公式:用直线参数式 P(t) = p1 + t*(p2-p1) 代入圆方程,解关于 t 的二次方程,再过滤 t ∈ [0,1](如果是线段)。这时候才轮到 std::sqrt 和判别式 delta 上场。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










