旋转矩形内部矩形
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不大,大部分区间应该是空的),从全圆区间中排除结果区间集。
我的挑战是在另一个矩形内旋转一个矩形。
问题描述:
里面的矩形,姑且称之为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不大,大部分区间应该是空的),从全圆区间中排除结果区间集。