You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

矩形绕左上角在图像内的可旋转角度范围算法及衍生问题

矩形旋转角度范围的高效算法及衍生问题解答

原问题:矩形绕自身左上角在目标矩形内的可旋转角度范围

核心思路是用几何约束替代分支判断:通过目标矩形与旋转矩形的宽、高、对角线对应圆的交集,确定各顶点的有效旋转扇区,再取扇区交集得到最终可行角度范围。基于@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

求解步骤

  1. 利用三角函数周期性,仅需计算θ ∈ [0, π/2]的范围,再对称扩展到全角度区间;
  2. 令t = tanθ(θ ∈ [0, π/2)),将不等式转化为关于t的代数不等式,通过平方整理为二次不等式;
  3. 求解二次不等式得到t的有效范围,再反推得到θ的范围;
  4. 结合θ ∈ [π/2, π]等区间的对称性,补全所有可行角度范围。

这种方法通过数学推导直接求解,无需大量分支判断,与原问题的几何约束思路一致,具备高效性。

内容的提问来源于stack exchange,提问作者zhoay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 08:13:17