算法 - 旋转矩形内矩形的命中检测
algorithm - hit detection of rectangle inside rotated rectangle
我正在做一个图像编辑器项目,您可以在其中旋转和裁剪图像。
我目前面临的问题是一旦我旋转了图像,我希望能够将裁剪框拖动到旋转图像边界内的任何位置。到目前为止,我一直在查看 Liang-Barsky and Cohen-Sutherland line-clipping algorithms, and Separating Axis Theorem,但我正在努力了解如何为我的用例实现这些。
谁能指出我正确的方向?我是不是找错树了?
如果用户尝试进行的移动是 [dx,dy],则考虑从选区的角到由 [dx,dy] 平移的那些点的线段(下例中的黄线) .这些线可能在某些点(红点)与旋转图像边界(绿线)相交。如果没有交叉路口,则移动是合法的。如果有一个或多个交叉路口,这些会告诉您运动在哪一点之前是合法的;最接近其原始位置的交点(检查水平或垂直距离足以确定这一点)确定最大移动(示例中的右下角)。然后您可以将翻译限制在这一点上。
根据运动方向在哪个象限(示例中朝右上角),您可以跳过检查其中一个角(示例中左下角);其他角总是先碰到边界。
您还可以跳过检查两个边界(示例中的底部和左侧),方法是将移动方向与图像的旋转角度进行比较。
因此,您需要检查 3 条线段与 2 条线段的交点。对于线段相交代码,请参见例如this question.
如果用户只拖动一侧,并扩展矩形而不是移动它,那么您只需检查正在移动的两个角。
使用 Alain 的评论。要检查拐角的内侧,只需反向旋转图像以使其边缘与轴对齐即可。然后你有一个简单的轴对齐框点问题。
(我并不是说你真的必须旋转图像,只是几何图形。)
我正在做一个图像编辑器项目,您可以在其中旋转和裁剪图像。
我目前面临的问题是一旦我旋转了图像,我希望能够将裁剪框拖动到旋转图像边界内的任何位置。到目前为止,我一直在查看 Liang-Barsky and Cohen-Sutherland line-clipping algorithms, and Separating Axis Theorem,但我正在努力了解如何为我的用例实现这些。
谁能指出我正确的方向?我是不是找错树了?
如果用户尝试进行的移动是 [dx,dy],则考虑从选区的角到由 [dx,dy] 平移的那些点的线段(下例中的黄线) .这些线可能在某些点(红点)与旋转图像边界(绿线)相交。如果没有交叉路口,则移动是合法的。如果有一个或多个交叉路口,这些会告诉您运动在哪一点之前是合法的;最接近其原始位置的交点(检查水平或垂直距离足以确定这一点)确定最大移动(示例中的右下角)。然后您可以将翻译限制在这一点上。
根据运动方向在哪个象限(示例中朝右上角),您可以跳过检查其中一个角(示例中左下角);其他角总是先碰到边界。
您还可以跳过检查两个边界(示例中的底部和左侧),方法是将移动方向与图像的旋转角度进行比较。
因此,您需要检查 3 条线段与 2 条线段的交点。对于线段相交代码,请参见例如this question.
如果用户只拖动一侧,并扩展矩形而不是移动它,那么您只需检查正在移动的两个角。
使用 Alain 的评论。要检查拐角的内侧,只需反向旋转图像以使其边缘与轴对齐即可。然后你有一个简单的轴对齐框点问题。
(我并不是说你真的必须旋转图像,只是几何图形。)