用分离轴定理判断圆与旋转矩形相交的标准方法是:先将圆心变换到矩形本地坐标系(平移后逆旋转),再计算该点到轴对齐矩形的最短距离平方,若小于等于圆半径平方则相交;关键在于坐标变换必须严格正确,否则检测完全失效。

用分离轴定理(SAT)判断圆与旋转矩形是否相交
直接计算几何交点太麻烦,也容易漏边界情况;标准做法是把圆“收缩”成点、把矩形“膨胀”成带圆角的区域,再转为点与凸多边形的距离判断——但更稳定通用的是分离轴定理(SAT)配合点到线段距离。核心思路:若存在一条直线,能把圆和矩形完全分开,则不相交;否则相交。
实际操作中,我们不真找分离轴,而是检查两个关键条件是否**同时满足**:圆心到矩形中心的距离 > 圆半径 + 矩形在该方向上的半投影长度——但这对旋转矩形不直接适用,得先做坐标变换。
先把圆心变换到矩形局部坐标系下
旋转矩形本质是轴对齐矩形绕其中心旋转了 theta 角。只要把圆心坐标从世界系平移+旋转到矩形本地坐标系(即让矩形变回轴对齐),问题就简化为「点(变换后的圆心)到轴对齐矩形的最短距离 ≤ 半径」。
步骤必须严格按顺序:
- 用矩形中心
rect_center对圆心circle_center做平移:local_point = circle_center - rect_center - 用逆旋转矩阵(即转置,因为旋转矩阵正交)旋转该向量:
cos_t = cos(-theta); sin_t = sin(-theta),或直接用cos(theta), -sin(theta)构造旋转矩阵作用于local_point - 得到的
local_p就是圆心在矩形本地坐标系下的坐标
这步错一个符号(比如该用 -theta 却用了 theta),整个检测就会完全失效——常见错误是只平移没旋转,或旋转方向反了。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
计算本地坐标系下点到轴对齐矩形的最短距离
设矩形本地半宽为 hw、半高为 hh(即原矩形宽高的一半)。变换后的点 local_p = (x, y) 到矩形的最近距离平方可快速算出:
float dx = fmaxf(0.0f, fabsf(x) - hw); float dy = fmaxf(0.0f, fabsf(y) - hh); float dist_sq = dx * dx + dy * dy;
这个公式覆盖所有情况:点在矩形内部时 dx=dy=0,距离为 0;点在左右/上下延长区时只有一维有偏移;点在角外时两维都有偏移。最终只需判断 dist_sq 。
注意:必须用距离**平方**比较,避免开方——性能敏感场景里这是关键优化;且浮点误差比直接开方后比较更可控。
特殊情况:圆心非常靠近矩形边但因浮点精度被误判
当 dist_sq 非常接近半径平方时(比如差 1e-6),不同编译器或优化等级可能导致结果抖动。不要加固定 epsilon 比较,而应使用相对容差:
- 若
circle_radius较大(> 1.0),用abs(dist_sq - r_sq) - 若半径极小(如 0.001),改用
dist_sq - 永远不要对
dist_sq开方后再减半径——那会放大误差
还有一个隐藏坑:如果矩形退化(hw 或 hh 为 0),上述公式仍成立,但你要确认业务逻辑是否允许零尺寸矩形;若允许,需额外判断 hw 并提前返回 false。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










