矩形绕左上角在图像内的可旋转角度范围算法及衍生问题
矩形旋转角度范围的高效算法及衍生问题解答
原问题:矩形绕自身左上角在目标矩形内的可旋转角度范围
核心思路是用几何约束替代分支判断:通过目标矩形与旋转矩形的宽、高、对角线对应圆的交集,确定各顶点的有效旋转扇区,再取扇区交集得到最终可行角度范围。基于@MBo思路的伪代码如下:
box1 = Polygon(*box1_pts) # 以旋转中心(box2左上角)为圆心,分别以box2的宽、高、对角线为半径作圆 box2_wc = Circle(c=top_left_pt, r=box2_w) box2_hc = Circle(c=top_left_pt, r=box2_h) box2_dc = Circle(c=top_left_pt, r=box2_d) # 计算box2对角线与x轴的夹角 angle_diag = angle(Line(top_left_pt, top_left_pt+box2_size)) # 找出每个圆与box1交集对应的有效旋转扇区角度范围 angle_range_w = find_sector( points=box1.intersection(box2_wc), center=top_left_pt, ).angle_range angle_range_h = find_sector( points=box1.intersection(box2_hc), center=top_left_pt, ).angle_range angle_range_d = find_sector( points=box1.intersection(box2_dc), center=top_left_pt, ).angle_range # 调整高、对角线对应的扇区角度(对应顶点的初始偏移角度) angle_range_h += 90 angle_range_d += angle_diag # 取三个扇区的交集,即为最终可旋转角度范围 angle_range = intersect_angle_range(angle_range_w, angle_range_h, angle_range_d)
衍生问题:固定左上角的红色矩形容纳蓝色矩形的自由旋转范围
存在类似的高效算法,核心是通过三角函数不等式求解可行角度,避免分支判断:
算法思路
蓝色矩形可在红色矩形内自由旋转(允许平移位置)的前提是:旋转后的蓝色矩形的水平投影最大宽度不超过红色矩形宽度,垂直投影最大高度不超过红色矩形高度。设红色矩形宽为Rw、高为Rh,蓝色矩形宽为Bw、高为Bh,旋转角度为θ,需满足以下两个不等式:
Bw * |cosθ| + Bh * |sinθ| ≤ Rw Bw * |sinθ| + Bh * |cosθ| ≤ Rh
求解步骤
- 利用三角函数周期性,仅需计算
θ ∈ [0, π/2]的范围,再对称扩展到全角度区间; - 令
t = tanθ(θ ∈ [0, π/2)),将不等式转化为关于t的代数不等式,通过平方整理为二次不等式; - 求解二次不等式得到
t的有效范围,再反推得到θ的范围; - 结合
θ ∈ [π/2, π]等区间的对称性,补全所有可行角度范围。
这种方法通过数学推导直接求解,无需大量分支判断,与原问题的几何约束思路一致,具备高效性。
内容的提问来源于stack exchange,提问作者zhoay
相关产品推荐
相关产品推荐

