0

所以我决定查找一些碰撞检测,但我一直无法找到有关两幅图像之间 2d 碰撞检测的正确信息,包括如何正确避免检测图像的透明区域,但我确实找到了一篇我自己附上的帖子到,但问题是我并不真正理解这个帖子,也不明白他为什么要做这些事情......

这是有问题的帖子:https ://stackoverflow.com/posts/336615/revisions

所以首先我想问一下这个解决方案是否真的是一个好的/合适的,或者我是否应该去别处看看。

其次,我想知道,在他的帖子中,他提到使用整数数组,而不是二维数组,设置 1 和 0 来决定像素是否透明,但我真的不知道我应该如何实现这个。起初我认为可以通过形成一串 1 和 0 并将其转换为 Long 来实现,但即使图像宽度仅为 25,Long 也会变得......太长......

我也试过这个,但没有运气,因为代码不适用于这个数组:

 long[] array = new long[30*30]; // height * width of the image
    int x = 0;
    int y = 0;

for(int i = 0; i<30*30; i++){
    if(image.getRGB(x,y) == 0){
         array[i] = 0;
    }
    else{ array[i] = 1; }

    x++;
    if (x==30){
         y++;
         x=0;
    } 
}

第三,我希望有人可以解释整个过程以及为什么他所做的事情是必要的。顺便说一句,我确实知道这些位操作员是如何工作的!换句话说,我不明白他在代码中做所有事情的思路/动机,我想了解这一切!

我现在真的不知道该怎么做嘿嘿...

4

1 回答 1

1

对于两个操作数中相应位为真的每个位,按位与运算( )的结果为真 (1),否则为假 (0)。&

他使用的想法是创建一个图像版本(掩码),其中原始图像中的每个不透明像素都存储为“1”位,每个透明像素都存储为“0”位。这些被打包成一个整数,可以通过一个 AND 操作针对另一个图像的掩码进行测试(在 AND 之前,他计算两个图像之间的水平距离并在必要时移动一个掩码)。

例如,假设我们有以下两个 4x1 像素的图像:

5, 0, 0, 5
      8, 8, 8, 8

尽管出于实用目的我将它们放在不同的行上,但您应该将它们视为在同一行上,因此左图像的最后两个像素与右图像的前两个像素重叠。

以二进制表示形式查看时,行的掩码为:

1001
1111

左右图像之间的距离为-2,因此我们将第一个掩码向左移动 2 位:

1001 << 2 => 100100

所以现在我们有了这些面具:

100100
001111

与这些相加给我们:

000100

非零结果告诉我们发生了碰撞。

于 2012-08-05T16:37:20.247 回答