两圆完全分离的条件是圆心距大于半径之和,即(dx)²+(dy)²>(r₁+r₂)²;编程中应避免开方,用平方比较,并校验半径非负、坐标有限及防溢出。

判断两圆完全分离的数学条件
两个圆形完全分离,意味着它们没有任何公共点,包括边界也不接触。核心判断依据是:圆心距大于两圆半径之和。
设圆 A 圆心为 (x1, y1)、半径 r1,圆 B 圆心为 (x2, y2)、半径 r2,则需满足:
sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) > r1 + r2
但实际编码中应避免直接开方——既慢又可能引入浮点误差。更稳妥的做法是比较平方距离与半径和的平方:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
(x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) > (r1 + r2) * (r1 + r2)
用 C++ 实现时的关键细节
- 必须使用
double 或 float 类型存储坐标和半径,整数运算会丢失精度
- 半径必须为非负值;若输入可能为负,应在计算前做校验(如
assert(r1 >= 0 && r2 >= 0))
- 若任一圆半径为 0,它退化为点,此时“完全分离”等价于该点到另一圆心距离 > 另一圆半径
- 不要写成
dist > r1 + r2 再对 dist 开方,除非你明确需要距离值本身
double 或 float 类型存储坐标和半径,整数运算会丢失精度 assert(r1 >= 0 && r2 >= 0)) dist > r1 + r2 再对 dist 开方,除非你明确需要距离值本身 示例函数:
立即学习“C++免费学习笔记(深入)”;
bool circles_separated(double x1, double y1, double r1,
double x2, double y2, double r2) {
double dx = x2 - x1;
double dy = y2 - y1;
double r_sum = r1 + r2;
return dx * dx + dy * dy > r_sum * r_sum;
}
容易踩的坑:浮点精度与边界情况
- 浮点比较不能用
== 判断相切(即刚好不分离),但本问题只需严格大于,所以无需 epsilon 修正——只要逻辑是“完全分离”,> 本身已排除相切和相交
- 如果传入 NaN 或无穷大坐标,
dx <em> dx + dy </em> dy 可能返回 NaN,导致结果未定义;生产环境建议加 std::isfinite 检查
- 当两圆半径极大而坐标差极小时,
r_sum * r_sum 可能溢出(如 r1 = r2 = 1e155),此时应先比较数量级或改用对数/分段逻辑(极少见,但金融或天文仿真中可能出现)
和其它相交状态的区分关系
- 完全分离(本函数返回 true) ⇔ 不相交且不相切
- 若你想同时支持“相切”“相交”“内含”等更多状态,不要堆砌多个 if,推荐统一计算平方距离
d2 和两个关键阈值:(r1 - r2) <em> (r1 - r2)</em>(内切/内含临界)和 (r1 + r2) (r1 + r2)(外切/分离临界)
- 注意:当
r1 == r2 且圆心重合时,(r1 - r2) * (r1 - r2) == 0,此时 d2 == 0 表示两圆完全重合,不属于“完全分离”
== 判断相切(即刚好不分离),但本问题只需严格大于,所以无需 epsilon 修正——只要逻辑是“完全分离”,> 本身已排除相切和相交 dx <em> dx + dy </em> dy 可能返回 NaN,导致结果未定义;生产环境建议加 std::isfinite 检查 r_sum * r_sum 可能溢出(如 r1 = r2 = 1e155),此时应先比较数量级或改用对数/分段逻辑(极少见,但金融或天文仿真中可能出现) - 完全分离(本函数返回 true) ⇔ 不相交且不相切
- 若你想同时支持“相切”“相交”“内含”等更多状态,不要堆砌多个 if,推荐统一计算平方距离
d2和两个关键阈值:(r1 - r2) <em> (r1 - r2)</em>(内切/内含临界)和(r1 + r2) (r1 + r2)(外切/分离临界) - 注意:当
r1 == r2且圆心重合时,(r1 - r2) * (r1 - r2) == 0,此时 d2 == 0 表示两圆完全重合,不属于“完全分离”
真正麻烦的不是公式本身,而是忘记检查输入有效性,或者在高精度场景下默认 float 足够用。

















