C++如何求两个圆的交点坐标_C++计算几何基础算法实现【数学】-C++

两圆相交当且仅当 |r1−r2| r1+r2 或 d

判断两圆是否相交及交点个数

两圆交点是否存在,取决于圆心距 d 与两半径 r1、r2 的关系。直接计算前必须先分类:
— 若 d > r1 + r2:外离,无交点;
— 若 d :内含(或内离),无交点;
— 若 d == 0 && r1 == r2:同心圆重合,无穷多交点(通常视为退化情况,按题意忽略);
— 其余情况:有 0、1 或 2 个交点。特别地,d == r1 + r2 或 d == abs(r1 - r2) 时为相切,仅 1 个交点。

用向量投影法解交点坐标(推荐)

设圆 A 圆心为 p1 = (x1, y1),半径 r1;圆 B 圆心为 p2 = (x2, y2),半径 r2。核心思路是:先求出两圆心连线上的垂足位置(即公共弦中点),再沿垂直方向偏移得到两个交点。
关键中间量:
— d = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1))(圆心距);
— a = (r1*r1 - r2*r2 + d*d) / (2*d)(从 p1 到垂足的投影长度);
— h = sqrt(r1*r1 - a*a)(垂足到交点的垂直距离)。
然后构造单位方向向量:
— 沿 p1→p2 方向单位向量:ex = ((x2-x1)/d, (y2-y1)/d);
— 垂直单位向量:ey = (-ey.y, ey.x) 或直接用 (-(y2-y1)/d, (x2-x1)/d)。

两个交点为:
sol1 = p1 + a*ex + h*ey
sol2 = p1 + a*ex - h*ey

注意浮点误差与退化情形处理

实际编码中,h 可能因浮点误差变成极小负数(如 -1e-15),直接开方会得到 NaN。务必做容错判断:
— 计算 h_sq = r1*r1 - a*a 后,先检查 h_sq → 视为无交点;
— 若 h_sq 但大于 -1e-10,设 h = 0(即相切);
— d 接近 0 时(同心),要单独判断避免除零;
— 所有比较都应使用带 epsilon 的近似判断,而非 ==。

立即学习“C++免费学习笔记(深入)”;

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C++如何求两个圆的交点坐标_C++计算几何基础算法实现【数学】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3997535+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3997535+
  • 本周更新: 0+
  • 最后更新: 2026-03-16