求outerSquare旋转A弧度后与innerSquare的最近距离
旋转后两正方形边界最近距离求解方法
现有两个方形视图outerSquare和innerSquare,外正方形初始左上角坐标为(x₁,y₁),内正方形左上角坐标为(x₂,y₂)。未旋转时,外正方形左边界与内正方形左边界的最近距离可直接用x₂ - x₁计算;但外正方形旋转A弧度后边界交叉,就得用下面的方法求解:
先明确关键参数
首先得确定外正方形的旋转中心,一般默认是自身几何中心:
- 假设外正方形边长为
L₁,初始中心坐标为(x₁ + L₁/2, y₁ + L₁/2) - 内正方形边长为
L₂,中心坐标为(x₂ + L₂/2, y₂ + L₂/2)
核心逻辑:凸多边形最短距离计算
正方形属于凸多边形,两个凸多边形的最短距离,是以下三类情况的最小值:
- 一个多边形的顶点到另一个多边形边的最短距离
- 两个多边形顶点之间的最短距离
- 两个多边形边之间的最短距离
具体计算步骤
1. 算出外正方形旋转后的四个顶点坐标
绕中心(x₀,y₀)旋转A弧度的坐标变换公式(逆时针为正,顺时针为负):
x' = (x - x₀) * cos(A) - (y - y₀) * sin(A) + x₀ y' = (x - x₀) * sin(A) + (y - y₀) * cos(A) + y₀
外正方形的四个初始顶点:
- 左上角:
(x₁, y₁) - 右上角:
(x₁ + L₁, y₁) - 右下角:
(x₁ + L₁, y₁ + L₁) - 左下角:
(x₁, y₁ + L₁)
把这四个点代入公式,就能得到旋转后的顶点坐标。
2. 遍历计算所有候选距离
(1)外顶点到内正方形边的距离
把内正方形的四条边看作线段,比如上边是y=y₂,x∈[x₂, x₂+L₂],右边是x=x₂+L₂,y∈[y₂, y₂+L₂]等。计算点到线段的最短距离规则:
- 先看点在这条线段上的投影是否在线段范围内:在的话取垂直距离;不在的话取点到线段两个端点的距离最小值。
(2)内顶点到外正方形边的距离
用旋转后的外正方形四条线段,按同样方法计算内正方形四个顶点到这些线段的最短距离。
(3)所有顶点间的直线距离
计算外正方形4个顶点和内正方形4个顶点之间的欧氏距离,取其中最小值。
(4)两条边之间的最短距离
对两个正方形的每一组线段,计算它们的最短距离:如果线段相交,距离为0;不相交的话,取其中一条线段的端点到另一条线段的距离最小值。
3. 取最小值得最终结果
把上面所有计算出的距离放在一起,最小的那个就是旋转后两正方形的最近距离。
特殊情况
- 如果两个正方形重叠(比如一个顶点在对方内部,或者边相交),直接判定最短距离为0。
- 当旋转角度为0时,这个方法会自动退化为初始的
x₂ - x₁(内正方形在外正方形右侧的情况),验证方法有效。
内容的提问来源于stack exchange,提问作者Parmar Abhishek
相关产品推荐
相关产品推荐

