【问题标题】:multi image collision detection多图像碰撞检测
【发布时间】:2012-01-12 04:40:34
【问题描述】:

问题来了

我有 5 个球漂浮在屏幕周围,它们会在顶部和底部弹跳。效果很好。

我现在要做的是解决它们中的任何一个是否相互碰撞。

我知道

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

}

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

我到处检查但找不到答案,只有其他人在搜索相同的东西,有什么想法吗?

提前致谢

灵巧的

编辑:

我使用它来查找 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 对他们。快到了吗?

}

【问题讨论】:

    标签: ios collision-detection collision


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 好吧,我只是读了你的帖子,觉得我的脑袋几乎要爆炸了。希望它会比那更容易哈哈..
    • @user1139624 只要你只支持几个球,你不必担心使用暴力方法,但我希望你有一些资源来扩展它,如果你想要。
    【解决方案2】:

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

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

    如果需要,我可以用代码更详细地说明。

    编辑我无法抗拒

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

    【讨论】:

    • @user1139624 我更新了答案以显示逻辑。我同意 Ben 的观点,这不会很好地扩展,但如果你只有 5 个球,则需要 5+4+3+2+1 次测试。想象一下如果你需要用 100 个球进行测试会变得多么糟糕
    • 太棒了,非常感谢,立即工作,每天上学,我还在学习
    猜你喜欢
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多