圆角矩形由矩形主体与四角圆弧构成,判断点是否在内需分区域:若点在中心矩形区(x∈[left+r, right−r]且y∈[top+r, bottom−r]),则在内;若在四角区域,则需分别判断到对应圆心的距离是否≤r。

圆角矩形的数学定义决定判断逻辑
圆角矩形本质是「矩形主体 + 四个象限的圆弧」。判断点 (x, y) 是否在边界内,不能简单套用普通矩形的 left ,必须分区域处理:先排除外侧,再对靠近圆角的四个角落做距离判断。
关键在于识别点落在哪个区域:是纯直边区(上下左右中间段),还是某个圆角影响区(左上、右上、左下、右下)。这决定了后续用不等式还是欧氏距离。
分区域判断的代码骨架
假设圆角矩形由 left、top、right、bottom 和圆角半径 r 定义(且 r >= 0,r ):
- 若
x right || y bottom→ 点在外,直接返回false - 若
x >= left + r && x → 点在垂直直边区,只需检查 <code>y是否在[top, bottom]内 - 若
y >= top + r && y → 点在水平直边区,只需检查 <code>x是否在[left, right]内 - 否则点落在某个圆角邻域:计算它到对应圆心的欧氏距离平方 ≤
r * r?
例如左上角圆心为 (left + r, top + r),需判断 (x - (left + r)) * (x - (left + r)) + (y - (top + r)) * (y - (top + r)) ;其他三个角同理替换圆心坐标。
容易漏掉的边界和性能细节
常见错误是把圆角半径 r 设得过大,导致圆角重叠——此时矩形实际退化为椭圆或更复杂形状,上述分区域逻辑失效。务必在调用前校验 r 是否合法。
浮点比较时避免直接用 == 判断边界,尤其当输入来自像素坐标或传感器数据时。建议用带 epsilon 的比较,比如 abs(val) 。
如果频繁调用该判断(如图形渲染每帧成千上万次),可预先计算并缓存四个圆心坐标和 r * r,避免重复运算。
一个最小可用示例
bool pointInRoundedRect(double x, double y,
double left, double top,
double right, double bottom,
double r) {
if (r right || y bottom) return false;
// 直边区域(不含圆角影响区)
if (x >= left + r && x = top + r && y <p>注意:这个函数判断的是“是否在圆角矩形内部或边界上”。若只需要严格内部(不包含边界),所有 <code> 改为 <code>,且直边条件中去掉等号。</code></code></p>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











