多图像碰撞检测

时间:2012-01-11 20:22:29

标签: ios collision-detection collision

继承问题

我有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对他们。这差不多了?

}

2 个答案:

答案 0 :(得分:0)

理想的解决方案是将所有矩形存储到interval treesegment tree中,以便有效地计算任何重叠区域。请注意,您必须为您的用例推广到2个维度。

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

简单的方法是简单地遍历所有球并将它们与具有更高ID的所有其他球进行比较(以避免重复检查ball1 - &gt; ball2ball2 - &gt; ball1)。

由于你一次只有5个,所以迭代方法可能足够快,不能在动画中删除帧,但是如果你计划支持更多的球,你应该考虑一个更具可扩展性的解决方案,因为在{{中运行简单的appreach 3}}

答案 1 :(得分:-1)

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

您可以创建图像数组。并循环遍历它,检查每个成员是否与任何连续成员发生碰撞。

如果需要,我可以用代码拼出更多。

编辑我无法抗拒

// 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
    }
  }
}