几何内切指两圆恰有一个公共点且小圆完全在大圆内部,圆心距等于半径差绝对值且半径不等;外切为外部相切,相交有两个交点,包含则无交点;代码中需用平方距离与半径差平方比较,并处理半径相等、零半径及浮点误差等边界情况。

什么是几何内切,和相交、外切有什么区别
两个圆内切,指的是它们恰好有一个公共点,且一个圆完全在另一个圆内部(不包括边界重合)。这和外切(两圆在外部相切)、相交(有两个交点)、包含(无交点但小圆完全在大圆内)都不同。关键判断依据是:圆心距 d 等于两圆半径之差的绝对值,且小圆半径必须严格小于大圆半径——否则就是外切或退化情况。
用 C++ 计算圆心距并判断内切的代码逻辑
假设每个圆用 struct Circle { double x, y, r; }; 表示,核心是先算欧氏距离,再与 abs(r1 - r2) 比较。注意浮点误差,不能直接用 ==:
double dx = c1.x - c2.x; double dy = c1.y - c2.y; double d_sq = dx * dx + dy * dy; double r_diff = std::abs(c1.r - c2.r); // 用平方避免开方,也规避 sqrt 的精度和性能问题 if (std::abs(d_sq - r_diff * r_diff)
-
c1.r != c2.r必须检查,否则半径相等时r_diff == 0,d_sq == 0会被误判为内切(实际是同心重合) - 用
d_sq和r_diff * r_diff对比,比算sqrt(d_sq)更快、更稳 - 容差选
1e-9是针对 double 的常见选择;若坐标量级很大(如 1e6),容差需按比例放大
容易被忽略的边界情况
内切判定不是纯数学等式,实际编码中几个坑常导致误判:
- 输入圆半径为负数:应提前校验
r > 0,否则abs(r1 - r2)无几何意义 - 一个圆半径为 0(点圆):此时“内切”退化为点在另一圆边界上,需单独处理——判断
d_sq == r*r即可,和普通内切逻辑不同 - 浮点下
d_sq 且非常接近时,可能是计算误差导致的“假包含”,不是内切;只有严格落在容差范围内才算 - 如果使用整数坐标和半径,可完全避免浮点误差,直接用
d_sq == (r1 - r2) * (r1 - r2),但要注意溢出(尤其int)
内切判定真正麻烦的地方不在公式本身,而在于半径相等、零半径、浮点精度这三类边界——它们不满足“一大一小+单点接触”的基本前提,却容易混进通用分支里。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











