圆角矩形内点判断需分区域:先归一化坐标,再依dx、dy与r、w、h关系判别直边、圆角或安全区,且须满足r≤min(w/2,h/2)。

圆角矩形的数学定义决定判断逻辑
带圆角的矩形本质是:一个中心对齐(或左上对齐)的矩形,四角被半径为 r 的圆弧截去。判断点 (x, y) 是否在内,不能直接套用普通矩形的 x ∈ [left, right] 和 y ∈ [top, bottom],必须分区域处理——四个直边区域、四个圆角区域、以及中间“安全区”。关键前提是:你得明确矩形的参数表示方式,比如用 left, top, width, height, radius,且满足 radius ≤ min(width/2, height/2),否则圆角会重叠,定义失效。
坐标归一化 + 分区域判断最可靠
推荐做法是把点平移到矩形局部坐标系(以矩形中心为原点,或以左上为原点后做偏移),再按相对位置分类。以左上为 (lx, ty)、宽 w、高 h、圆角半径 r 为例:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 先算点相对于矩形的局部坐标:
dx = x - lx,dy = y - ty - 若
dx w || dy h→ 直接返回false - 若
dx >= r && dx = r && dy → 在中心矩形区,返回 <code>true - 否则进入圆角判断:例如左上角,检查
(dx - r)² + (dy - r)² ;右上角用 <code>(dx - (w - r))² + (dy - r)² ,依此类推
std::hypot 或手动平方比较?精度与性能取舍
圆角判断本质是点到圆心距离 ≤ r。用 std::hypot(dx, dy) 更语义清晰,但有函数调用开销和浮点误差累积风险;更常用、也更高效的是直接比较平方:dx*dx + dy*dy 。注意三点:
-
r必须是非负数,传入负值会导致逻辑崩溃 - 所有坐标和
r类型应一致(推荐double或float),避免隐式转换引入截断误差 - 若矩形由浮点坐标定义,而点是整数坐标(如像素),别忘了类型提升,否则
int * int可能溢出
边界情况:点恰在圆弧交界处或 r == 0
当 r == 0,应退化为普通矩形判断,避免除零或无效圆心计算;当点落在直边与圆弧衔接处(如 dx == r && dy == 0),手工推导可知它属于圆角区域,但用平方判据也能自然覆盖(因为 (r - r)² + (0 - r)² == r²)。最容易漏的是:没处理 r 超出合法范围的情形——比如 r > w/2 时,左上和右上圆角会重叠,此时整个上边实际变成一条圆弧,原有分区域逻辑失效。生产代码里建议加断言或日志:assert(r
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










