两圆完全分离当且仅当圆心距离大于半径之和,即 dist > r1 + r2;推荐用 std::hypot(dx, dy) 计算距离以避免溢出,需校验半径非负、坐标有限且无 nan。

判断两圆是否完全分离的核心逻辑
两个圆完全分离,意味着它们的圆心距离大于两圆半径之和。这是唯一可靠、无需分支讨论的判定条件。只要 distance > r1 + r2 成立,就一定无任何交点(包括相切也不算分离)。
用 std::hypot 计算圆心距离更安全
直接用 sqrt(dx*dx + dy*dy) 容易因中间项溢出或精度丢失导致误判,尤其当坐标值很大时。推荐用 std::hypot(dx, dy) —— 它内部做了防溢出缩放,数值更稳健。
示例:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
double dx = x1 - x2; double dy = y1 - y2; double dist = std::hypot(dx, dy); bool separated = dist > r1 + r2;
- 注意:
r1和r2必须是非负值;若可能为负,需先取std::abs() - 浮点比较不建议用
==或>=判分离,严格用>即可(相切属于“接触”,不算分离)
避免整数坐标引发的隐式转换陷阱
如果圆心坐标是 int 类型,但半径是 double,直接参与运算可能触发整数溢出(如 dx*dx 超出 int 范围),或因整数除法丢失精度。
- 统一转为
double再计算:double dx = static_cast<double>(x1) - x2;</double> - 不要依赖自动类型提升,尤其在表达式含混合类型时
- 若所有数据都是整数且范围可控,也可用整数平方比较(避免开方):
dx*dx + dy*dy > (r1 + r2)*(r1 + r2),但要注意右侧可能溢出,需确保r1 + r2不超int上限
边界情况必须显式考虑
实际工程中容易忽略这些点:
-
r1或r2为0:退化为点,仍适用同一公式(dist > r1 + r2) - 其中一个圆无效(如半径为
NaN):std::hypot返回NaN,后续比较结果为false,需前置校验 - 坐标为
INF或NaN:同样导致std::hypot返回非数,应先用std::isfinite检查
真正可靠的判断总要包含校验,而不仅是数学公式本身。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










