所以我决定查找一些碰撞检测,但我一直无法找到适当的信息 关于两个图像之间的2d碰撞检测,包括如何正确地避免检测透明 图像的区域,但我找到了一个我自己附加的帖子,但问题是我没有 我真的理解这个帖子,也不明白为什么他会做这些事情......
以下是相关帖子:https://stackoverflow.com/posts/336615/revisions
首先,我想问一下这个解决方案是否真的是一个好的解决方案,或者我应该只看其他地方。
其次我想知道,在他的帖子中,他提到使用整数数组,而不是2d数组 设置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;
}
}
第三,我希望有人可以解释整个过程以及为什么他所做的事情是必要的。 顺便说一句,我确实知道那些有点聪明的操作员是如何工作的! 换句话说,我不理解他在代码中做所有事情的思路/动机,我想了解这一切!
我现在真的不知道如何继续他......
答案 0 :(得分:1)
对于每个位,bitwise AND operation(&
)的结果为真(1),其中两个操作数中相应位为真,否则为假(0)。
他正在使用的想法是创建一个图像版本(一个遮罩),其中原始图像中的每个非透明像素都存储为&#39; 1&#39;位,每个透明像素为&#39; 0&#39;位。这些被打包成一个整数,可以使用单个AND操作针对另一个图像对掩码进行测试(在AND之前,他计算两个图像之间的水平距离,并在必要时移动其中一个掩码)。
例如,我们假设我们有以下两个4x1像素图像:
5, 0, 0, 5
8, 8, 8, 8
虽然我出于实际目的将它们放在不同的行上,但您应将它们视为位于同一行,因此左图像的最后两个像素与右图像的前两个像素重叠。
以二进制表示方式查看行的掩码为:
1001
1111
左右图像之间的距离为-2,因此我们将第一个掩模左移2位:
1001 << 2 => 100100
现在我们有了这些面具:
100100
001111
ANDing这些给了我们:
000100
非零结果告诉我们我们发生了碰撞。