圆环是两个同心圆之间的区域,内圆半径为 $ r_{\text{inner}} $,外圆半径为 $ r_{\text{outer}} $,满足 $ 0 \leq r_{\text{inner}}
什么是圆环(Annulus)的数学定义
圆环是两个同心圆之间的区域:内圆半径
r_inner,外圆半径r_outer,且满足r_inner 。一个点 <code>(x, y)在圆环内部,当且仅当它到圆心的距离d满足:r_inner (严格不等式,不包含边界)。若需包含内/外边界,改用 ≤ 即可。C++中用
std::hypot计算距离更安全直接用
sqrt(x*x + y*y)容易溢出或精度丢失,尤其在坐标值很大时。std::hypot是标准库提供的稳健替代方案,能自动处理大数和小数。实操建议:
- 始终用
std::hypot(dx, dy)计算点到圆心的欧氏距离,其中dx = x - cx,dy = y - cy- 避免手写平方根逻辑,除非你明确控制了输入范围且追求极致性能
- 注意
std::hypot在 C++11 起可用,头文件为<cmath></cmath>bool in_annulus(double x, double y, double cx, double cy, double r_inner, double r_outer) { double dx = x - cx; double dy = y - cy; double d = std::hypot(dx, dy); return (d > r_inner) && (d <h3>边界情况必须显式约定</h3><p>“在圆环内部”在工程中常有歧义:是否包含内圆周?是否包含外圆周?C++ 不会替你做业务判断,必须由函数签名或文档明确。</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master"><img src="https://img.php.cn/upload/skill/000/000/081/179051228971575.jpg" alt="C++ Code Review Master" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="overflowclass">C++ Code Review Master</a> <p class="overflowclass">组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。</p> </div> <a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div><p>常见处理方式:</p>
- 若业务要求「开圆环」(纯内部),用
>和—— 这是最常见的数学默认- 若要包含外边界(如“落在圆环或外圆上”),改用
d- 若
r_inner == 0,圆环退化为实心圆,此时条件变为d ;但注意 <code>r_inner 仍需成立,否则逻辑失效- 传入
r_inner >= r_outer时,函数应返回false或抛异常,不能静默接受浮点比较带来的精度陷阱
用
>和直接比较浮点距离,可能因计算误差导致本该在边界的点被错误排除。例如 <code>d理论上等于r_inner,但计算后略小,就会误判为“在内圆内”。应对策略:
- 若需容忍微小误差,改用带 epsilon 的比较:
d > r_inner + eps && d- epsilon 值取决于坐标量级,常用
1e-9(双精度)或std::numeric_limits<double>::epsilon()</double>的倍数- 不要无脑用
==判断边界——几乎总是错的- 如果业务对边界极其敏感(如物理碰撞检测),建议统一使用距离平方比较,彻底规避 sqrt 和 hypot 的误差源:
r_inner*r_inner真正难的不是写对公式,而是想清楚你的“内部”到底指什么、能容忍多大误差、以及谁来为边界行为负责。这些决定往往比代码本身影响更大。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











