旋转矩形内框矩形

时间:2018-11-12 13:11:15

标签: math rotation geometry

我的挑战是在另一个矩形内旋转一个矩形。

问题描述:

不允许将内部矩形称为B,将其跨过外部矩形,称为A。但是如果进一步旋转A,以便可能再次到达合法位置,则应将其旋转到它。因此,所需的行为是在旋转越过边界之前停止旋转,并在B重新获得合法地位后立即继续旋转。用鼠标旋转B可能不是每个单度都需要额外计算。因此,鼠标事件可能指向20度,而在下一次迭代中可能指向40度。

我的方法是通过计算和处理旋转来解决问题。我使alpha旋转指向鼠标。 Beta是从alpha到B右上角的旋转。 我计算了包围球(橙色)及其与A的碰撞点(左上,右上,右上,右下(未提及左和Bot不会使问题复杂化)。

进行的计算:

通过这种方法,我设法计算了何时必须停止,但仅分别针对顶部和右侧。 例如:顺时针旋转->顶部裁剪

If (B.leftTopCornerRotation < TopLeft ||  B.leftTopCornerRotation > TopRight) {
    Alpha = TopLeft - Beta;
} else if (B.leftBotCornerRotation < TopLeft ||  B. leftBotCornerRotation > TopRight) {
    Alpha = Topleft + Beta  + PI; // + PI rotates the value by 180 degree
} else if (B.rightBotCornerRotation < TopLeft ||  B. rightBotCornerRotation > TopRight) {
    Alpha = TopLeft - Beta + PI;
} else if (B.rightTopCornerRotation < TopLeft ||  B. rightTopCornerRotation > TopRight) {
    Alpha = TopLeft + Beta;
}

我的第一个问题是,如果B在多条线(例如,顶部和右侧)上超出范围,则存在以下情况:我校正了旋转,因此右侧没有超调,只不过校正了顶部没有超越。但是通过第二次更正,我在右侧造成了超车。这将导致无限循环。

我的第二个问题是,这种方法接缝确实很复杂。

我的问题是,是否有更好的/可行的方法来计算B沿顺时针和逆时针方向的有效旋转,以使其不会超出边界。最好的情况是它看起来就像在拐角处停下来一样。

1 个答案:

答案 0 :(得分:0)

对于每个B拐角,当其位于每个A边(为简单起见,为无限边)之外时,请找到角度间隔。

然后将这16个间隔合并(如果B不大,则大多数应为空),并从整个圆范围中排除所得的间隔设置。