多图像碰撞检测



这是的问题

我有5个球在屏幕上飘来飘去,上面和下面都有反弹。工作得很好。

我现在想做的是弄清楚它们中是否有任何一个相互碰撞。

我知道

 if (CGRectIntersectsRect(image1.frame, image2.frame)) 
{
}

但这只检查两个图像,我需要检查所有图像和每个图像。。

我到处都查了,但都找不到答案,只有其他人在找同样的东西,有什么想法吗?

提前感谢

Spriggsy

编辑:

我用这个来找到CGRect并将其存储在阵列中

ball1 = NSStringFromCGRect(image1.frame);
ball2 = NSStringFromCGRect(image2.frame);
ball3 = NSStringFromCGRect(image3.frame);
ball4 = NSStringFromCGRect(image4.frame);
ball5 = NSStringFromCGRect(image5.frame);
bingoarray = [NSMutableArray arrayWithObjects:ball1,ball2,ball3,ball4,ball5,nil];

然后将其传递给碰撞检测方法

-(void)collision   {

    for (int i = 0;  i<[bingoarray count]-1 ; i++) {
        CGRect ballA = CGRectFromString([bingoarray objectAtIndex:i]);
        if (CGRectIntersectsRect(ballA, image1.frame)) {
            NSLog(@"test"); 
        }
    }

我想这应该能让一个球与其他球相抗衡。

因此,球1被检查对其他人,但没有检查球2对他们。这快到了吗?

}

理想的解决方案是将所有矩形存储到区间树或分段树中,以便有效地计算任何重叠区域。注意,对于您的用例,您必须将其推广到二维。

另一种有效的方法是使用K-d树来找到最近的其他球,并与最近的邻居进行比较,直到没有碰撞。

简单的方法是简单地对所有球进行迭代,并将它们与ID较高的所有其他球进行比较(以避免重复检查ball1->ball2ball2->ball1)。

由于一次只有5个球,迭代方法可能足够快,不会在动画中丢帧,但如果你计划支持更多的球,你应该考虑一个更可扩展的解决方案,因为简单的apprepach在二次时间内运行。

这是一道有趣的小数学题,可以避免多余。

您可以创建一个图像阵列。并循环通过它,检查每个成员是否与任何连续的成员碰撞。

如果需要的话,我可以用代码拼写更多。

EDIT我无法抗拒

// the images are in imagesArray
//where you want to check for a collision
int ballCount = [imagesArray count];
int v1Index;
int v2Index;
UIImageView * v1;
UIImageView * v2;
for (v1Index = 0; v1Index < ballCount; v1Index++) {
  v1 = [imagesArray objectAtIndex:v1Index];
  for (v2Index = v1Index+1; v2Index < ballCount; v2Index++) {
    v2 = [imagesArray objectAtIndex:v2Index];
    if (CGRectIntersectsRect(v1.frame, v2.frame)) {
      // objects collided
      // react to collision here
    }
  }
}

最新更新