给定旋转矩形的4个顶点,如何判断单点是否位于该矩形内部
旋转矩形的点包含检测实现方案
我们先统一约定输入参数的两种常见形式:
- 形式1:待检测点
P(x₀,y₀),矩形中心(cx, cy)、宽度w、高度h、绕中心旋转角度θ - 形式2:待检测点
P(x₀,y₀),矩形按顺序排列的四个顶点A、B、C、D
下面是三种常用的实现方案:
方法1:坐标逆变换法(最推荐,性能最优)
核心思路是消除矩形的旋转偏移,把问题转换为简单的轴对齐矩形点检测:
- 第一步:将待检测点相对于矩形中心做偏移,得到相对坐标
P1 = (x₀ - cx, y₀ - cy) - 第二步:对
P1做逆旋转(旋转角度为-θ),得到矩形局部坐标系下的坐标P_local:x_local = P1.x * cosθ + P1.y * sinθ y_local = -P1.x * sinθ + P1.y * cosθ - 第三步:直接用轴对齐矩形的判断逻辑,满足以下条件即说明点在矩形内部(含边界):
abs(x_local) ≤ w/2 且 abs(y_local) ≤ h/2
如果你的输入只有矩形四个顶点,可以先通过顶点计算所需参数:
- 中心:
cx = (Ax+Bx+Cx+Dx)/4,cy = (Ay+By+Cy+Dy)/4 - 宽高:
w = AB边长度,h = AD边长度 - 旋转角:
θ = atan2(By - Ay, Bx - Ax)(即AB边与x轴正方向的夹角)
该方法计算量极小,仅需要少量四则运算和三角函数调用,适合游戏碰撞检测、图形渲染等高频计算场景。
方法2:分离轴定理(SAT)法(通用性最强)
这是所有凸多边形包含/碰撞检测的通用标准方案,不需要提前计算角度、中心等参数,拿到四个顶点即可直接使用:
分离轴定理核心逻辑:两个凸图形不相交的充要条件是存在一条分离轴,使得两个图形在该轴上的投影无重叠。点属于特殊的凸图形,只需验证点和矩形的投影在所有必要轴上都重叠即可。
对于矩形来说,仅需要检测两条分离轴(矩形两条相邻边的法向量),步骤如下:
- 取矩形的两个相邻边向量,比如
AB和AD - 计算两个边向量的法向量,作为投影轴
- 将矩形四个顶点和待检测点
P分别投影到两个轴上 - 若两个轴上,
P的投影都落在矩形顶点的投影区间内部,即可判定点在矩形内
该方法可直接扩展到任意凸多边形的包含、碰撞检测场景,适配性极强。
方法3:面积求和法(仅适合原理学习,不推荐生产使用)
核心逻辑非常容易理解:如果点在矩形内部,那么点和矩形四条边分别组成的四个三角形的面积之和,等于矩形本身的总面积:
- 先计算矩形ABCD的总面积
S - 分别计算
△PAB、△PBC、△PCD、△PDA四个三角形的面积之和S_sum - 若
abs(S_sum - S) ≤ 浮点误差阈值(一般取1e-6~1e-8),即可判定点在矩形内部
该方法缺点明显:计算量大、浮点误差对结果影响高,仅适合学习原理使用,不推荐生产环境部署。
通用注意事项
所有涉及浮点计算的场景都需要设置合理的精度阈值,避免因为浮点运算精度损失导致的误判;如果需要严格区分「内部」和「边界」,只需将判断条件中的≤替换为<即可。
内容的提问来源于stack exchange,提问作者code writer 3000
相关产品推荐
相关产品推荐

