两圆完全分离当且仅当圆心距严格大于半径之和;应使用距离平方比较避免开方误差,即(x1−x2)²+(y1−y2)²>(r1+r2)²,无需eps或排除内含等其他关系。

判断两圆心距离是否大于半径之和
两个圆形在二维平面中完全分离,等价于圆心距离严格大于两圆半径之和。这是最直接、最可靠的几何判定条件,无需考虑坐标系变换或边界情况。
注意:必须用「严格大于」(>),等于时为外切(接触但不重叠),不属于“完全分离”;小于则相交或内含。
- 设圆 A 圆心为
(x1, y1)、半径r1,圆 B 为(x2, y2)、r2 - 计算欧氏距离平方避免开方:用
(x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) - 比较时用
dist_sq > (r1 + r2) * (r1 + r2),更高效且无浮点误差风险
处理浮点数精度问题的必要措施
当使用 double 或 float 表示坐标或半径时,直接比较距离可能因舍入误差误判。尤其在 dist 非常接近 r1 + r2 时,== 或 > 都不可靠。
- 推荐统一用距离平方比较,绕过
sqrt()引入的额外误差 - 若必须用实际距离,应引入小量
eps,例如:dist > r1 + r2 + 1e-9 - 不要用
abs(dist - (r1+r2)) 来判断“是否相切”,因为“完全分离”是单向不等式,加 eps 只会扩大误判区间
避免常见逻辑错误:内含关系不干扰分离判定
有人误以为“不相交”就等于“完全分离”,但两圆还存在「内含」(一个圆完全在另一个内部且无交点)的情况。此时圆心距 ,它们也不相交,但显然不是分离。
所以,“完全分离”是独立条件,只由 dist > r1 + r2 决定;内含、外离、相交、相切是互斥的四种关系,不能靠排除法推导。
- 内含时
dist + min(r1, r2) ,与分离无关 - 只要
dist > r1 + r2成立,无论半径悬殊多大,都算完全分离 - 不需要额外检查内含——那属于另一类问题
C++ 实现示例:简洁安全的判断函数
bool isSeparate(double x1, double y1, double r1,
double x2, double y2, double r2) {
double dx = x1 - x2;
double dy = y1 - y2;
double dist_sq = dx * dx + dy * dy;
double sum_r = r1 + r2;
return dist_sq > sum_r * sum_r; // 严格大于,无 sqrt,无 eps 混淆
}
这个函数覆盖所有实数输入(包括负半径?别这么干——调用前应确保 r1 > 0 且 r2 > 0,否则几何定义失效。库函数不负责校验业务约束。
真正容易被忽略的是:分离判定只依赖相对位置和半径,跟坐标原点、象限、正交投影都无关;但一旦坐标来自传感器或变换矩阵,要先确认单位一致、无缩放残留——这些不在公式里,却常让 isSeparate 返回意外结果。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











