旋转图像的碰撞检测

时间:2014-02-23 16:33:03

标签: ios objective-c collision-detection

我希望能够判断两个图像何时发生碰撞(而不仅仅是它们的帧)。但这里有一个问题:图像正在旋转。 所以我知道如何查找图像中的像素是否透明,但在这种情况下不会有用,因为它只会找到相对于非旋转图像的帧中的位置。 此外,我已经尝试了打击盒子,但即使是那些也无法工作,因为我找不到一种方法来检测包含在不同子视图中的UIViews的碰撞。

我想做的甚至可能吗? 提前致谢

2 个答案:

答案 0 :(得分:1)

我不知道如何检查旋转图像上的像素碰撞。那很难。我认为您必须将旋转的图像渲染到上下文中,然后从上下文中获取像素以检查透明度。那将是非常缓慢的。

我建议采用不同的方法。想出一条映射不规则图像边界的路径。然后,您可以使用CGPathContainsPoint检查路径中是否包含一组点(该方法采用变换,您将使用该变换来描述图像路径的旋转。)

即使这样,你也会遇到性能问题,因为你必须从另一个图像中调用大量点的方法,以确定它们是否相交。

答案 1 :(得分:0)

我建议你根据寻找矩形交叉点来解决这个问题。

关键在于创建一个简化的图像表示,其中一组矩形正确地布置为图像不同部分的边界框(就像使用legos构建图像一样)。为了获得更好的性能,请使用一小组矩形(一些大的支柱),以便更精确地使用最大数量的矩形来精确地跟随图像轮廓。

您的问题等同于找到矩形之间的交叉点。或者更准确地说,找到对象A的矩形的至少一个顶点在对象B(CGRectContainsPoint)的至少一个矩形内或者如果rect相交(CGRectIntersectsRect)。

如果您更喜欢点查找,则应该按照4个顶点定义矩形,然后在旋转图像时将相同的仿射变换(使用CGPointApplyAffineTransform)应用于矩形顶点以获得点的坐标后很容易回转。但是,您当然可以使用标准CGRect结构查找帧交叉并使用矩形表示矩形。

您还可以使用CGPath(如下面的另一个答案中所述)而不是一组矩形,并使用CGPathContainsPoint查找其他路径中的任何顶点。这实际上会得到相同的结果,但在很多情况下,矩形方法可能更快。

唯一的技巧是将其中一个对象作为参考轴。想象一下,你在对象A上,你只看到B在你身边移动。然后,如果必须旋转A,则需要进行轴变换,使其始终相对于A进行B变换,而不是屏幕或任何其他参考。如果您的变换仅围绕对象中心旋转,则旋转A乘以n弧度相当于将B旋转-n弧度。

然后循环遍历定义对象A的顶点,并查找是否在对象A的矩形内。

你可能需要调查一下才能实现这一目标,但至少你有一些关于如何解决这个问题的线索。