圆角矩形由中心矩形与四个象限圆弧组成,关键参数为left、top、right、bottom及radius(需满足r≤min((right−left)/2,(bottom−top)/2));判断点(x,y)是否在内,先验其是否在外包围矩形内,再按所在象限计算平移后坐标(dx,dy),通过dx²+dy²≤r²判定是否落入对应圆角区,radius=0时退化为普通矩形判断。

圆角矩形的数学定义和关键参数
带圆角的矩形本质上是「中心对齐的轴对齐矩形」+「四角用四分之一圆弧替代」。判断点 (x, y) 是否在内,核心在于:先看它是否落在「去角后的内矩形」里(直接命中),否则再逐个检查四个圆角区域。
你需要明确传入的参数:矩形左上角 topLeft(或中心 center)、宽 width、高 height、圆角半径 radius。注意:radius 不能超过 min(width, height) / 2,否则退化为椭圆或无效——实际中建议做断言:assert(radius
坐标归一化到局部坐标系再判断
别在全局坐标上硬算。先把点平移到以矩形“内矩形”区域为基准的局部坐标系:让矩形左上角为 (0, 0),右下角为 (width, height),圆角发生在四个角的 radius × radius 区域内。
具体步骤:
立即学习“C++免费学习笔记(深入)”;
- 计算点相对于矩形左上角的偏移:
localX = x - rect.x,localY = y - rect.y - 排除明显在外的点:
if (localX width || localY height) return false; - 若点落在中间区域(即
radius ≤ localX ≤ width - radius且radius ≤ localY ≤ height - radius),直接返回true - 否则进入圆角判断分支
四个圆角的象限式距离判据
每个圆角本质是「以角点为圆心、半径为 radius 的四分之一圆」。例如右下角圆角,圆心在 (width, height),只保留 x ≥ width - radius 且 y ≥ height - radius 的部分。
统一做法:对每个角,计算点到该角点的欧氏距离平方(避免开方),再和 radius * radius 比较:
- 左上角:
dx = localX,dy = localY→ 若dx ≤ radius && dy ≤ radius && dx*dx + dy*dy ≤ radius*radius - 右上角:
dx = width - localX,dy = localY→ 若dx ≤ radius && dy ≤ radius && dx*dx + dy*dy ≤ radius*radius - 左下角:
dx = localX,dy = height - localY→ 同理 - 右下角:
dx = width - localX,dy = height - localY→ 同理
只要任一满足,就属于圆角覆盖区。
边界情况与浮点精度陷阱
圆角矩形的边界是连续曲线,但浮点数比较容易出错。尤其当点恰好落在圆弧上(距离平方等于 radius²)时,因计算误差可能被误判为外侧。
稳妥做法:
- 使用
std::abs(a - b) 替代 <code>a == b,其中epsilon取1e-9或根据坐标量级调整 - 所有比较都用距离平方,避免
sqrt()引入额外误差和性能开销 - 如果输入坐标来自 GUI 坐标系(y 向下为正),确保
rect.y和height方向一致;Web Canvas 和多数 GUI 框架都是 y 向下,但数学惯常 y 向上——这点极易搞反
真正麻烦的是半透明渲染或抗锯齿场景下的“视觉边缘”,纯几何判断无法覆盖;若需像素级精确,得结合 rasterization 规则,那已超出本问题范畴。


















