旋转矩形内部矩形

Rotate rectangle insider rectangle

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

问题描述:

里面的矩形,姑且称之为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 顺时针和逆时针的有效旋转,这样它就不会越界。最好的情况是它看起来就像停在拐角处。

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

然后对这16个区间进行并集(如果B不大,大部分区间应该是空的),从全圆区间中排除结果区间集。