两圆外切当且仅当圆心距等于半径之和,即d = r₁ + r₂;内切当且仅当圆心距等于半径差的绝对值且两圆不重合,即d = |r₁ − r₂|且r₁ ≠ r₂或d > 0。

判断两圆是否外切:看圆心距是否等于半径之和
外切的本质是两圆有且仅有一个公共点,且该点在两圆边界上、位于圆心连线上。数学上等价于圆心距离 d 精确等于 r1 + r2。
实操中绝不能直接用 == 比较浮点距离,必须引入容差(epsilon):
d = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2))- 检查
abs(d - (r1 + r2)) ,推荐 <code>epsilon = 1e-9(对 double 足够) - 若用整数坐标+整数半径,可完全避免浮点误差,直接用
d*d == (r1+r2)*(r1+r2)
判断两圆是否内切:看圆心距是否等于半径之差的绝对值
内切要求一圆在另一圆内部,且两者边界相切于一点。此时圆心距 d 应等于 abs(r1 - r2),且必须满足 d > 0(否则为同心圆,不构成内切)。
注意顺序无关,但需先确保两圆不重合:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 先排除
r1 == r2 && d == 0(同心等圆,非内切) - 再判断
abs(d - abs(r1 - r2)) - 若
r1 == r2且d > 0,则不可能内切(只能外切或分离)
如何避免把相交误判为相切
相切是相交的临界状态,极易因精度或逻辑疏漏被混淆。关键要区分三种情况:
- 外离:
d > r1 + r2 - 外切:
abs(d - (r1 + r2)) - 相交(两个交点):
abs(r1 - r2) - 内切:
abs(d - abs(r1 - r2)) 0 - 内含(无交点):
d
常见错误是只检查“是否相等”,却没排除 d == 0 或 r1 == r2 的退化情形,导致把同心圆当成内切。
性能与数值稳定性建议
频繁调用时,平方距离比开方更高效也更稳定:
- 用
dx*dx + dy*dy替代sqrt(...) - 外切条件转为:
abs(dx*dx + dy*dy - (r1+r2)*(r1+r2)) (<code>epsilon_sq ≈ 1e-18) - 内切条件转为:
abs(dx*dx + dy*dy - (r1-r2)*(r1-r2)) ,但必须额外确认 <code>r1 != r2或d > 0 - 若输入可能为负半径,务必先做
abs(r1)、abs(r2)校验——几何上半径不能为负
真正容易被忽略的是:内切判定里,r1 和 r2 谁大谁小不影响结果,但 d == 0 必须显式排除,否则 abs(r1 - r2) == 0 会误触发内切分支。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










