2012-08-04 67 views
0

因此我決定查找一些碰撞檢測,但我一直無法找到有關兩幅圖像之間的二維碰撞檢測的正確信息 ,包括如何正確地避免檢測透明的 區域的圖像,但我沒有找到一個我自己附加的帖子,但問題是,我不 真正理解這個帖子,也不明白他爲什麼做這些事情...忽略透明零件的2D碰撞檢測

這裏的帖子問題:https://stackoverflow.com/posts/336615/revisions

所以首先我想問這個解決方案是否是實際的一個好的/適當的,或者我應該看看其他地方。

其次,我想知道他在帖子中提到使用整數數組,而不是2d數組,看起來, 設置1和0來決定像素是否透明或不,但我真的不知道如何我認爲 來實現這一目標。起初,我認爲它可以通過只形成1和0的字符串並將其轉換爲長 來實現,但即使僅具有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; 
    } 
} 

第三,我希望有人能解釋也許全過程,以及爲什麼他做的事情,是必要的。順便說一句,我知道那些聰明的操作員是如何工作的! 換句話說,我不明白他在代碼中做所有事情的思路/動機,我想了解所有這些!

我真的不知道該怎麼現在嘿嘿繼續...

+1

除非您有非常特殊的要求(例如,使用基元很難描述非常不規則的形狀),測試與碰撞幾何體的碰撞更快,更直接,更有可能產生有用的結果。 「其次,我想知道,在他的文章中,他提到了使用整數數組,而不是2d數組,看起來」您可以使用一維數組來表示二維數據:int arr [H] [W] => int arr [H * W ],arr [y] [x] => arr [y * W + x]。 – Cubic 2012-08-04 20:57:12

+0

什麼是碰撞幾何?谷歌搜索不給太多! 即便如此,我仍然想了解代碼。我試圖用1和0填充一個數組[h * x],但是在代碼中實現時,它不起作用。我真的很想理解代碼,但我不明白他所做的事情的過程/動機,我試圖找出它,但沒有運氣! – Deragon 2012-08-05 15:28:48

+1

他在做什麼是檢查與位掩碼的衝突。 (谷歌應該產生相關的結果)。碰撞幾何僅僅是幾何 - 而不是想着「這兩個圖像是否碰撞」,認爲「做這些矩形/三角形/圓形/這些碰撞的任意組合」。優點是這比使用位掩碼更快(例如,如果它們的距離小於它們的半徑的總和,則兩個2D圓相互碰撞),並且還產生如下結果:「我必須應用於該對象的最小偏移是什麼它不會再相撞「。在這裏考慮分離軸定理。 – Cubic 2012-08-05 16:18:05

回答

1

bitwise AND operation&)的結果爲真(1)每次每一位當相應位爲在兩個操作數真,否則爲(0)。

他使用的想法是創建一個圖像版本(掩碼),其中原始圖像中的每個非透明像素存儲爲1位,每個透明像素存儲爲0位。它們被壓縮成一個整數,可以用一個AND操作在另一個圖像上對其進行測試(在AND之前,他計算兩幅圖像之間的水平距離並在必要時移動一個蒙版)。

例如,假設我們有以下兩個4X1像素圖片:

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

雖然我把它們放在不同的行這裏出於實用的目的,您應該視其爲是在同一行,所以左圖像的最後兩個像素與右圖像的前兩個重疊。

在二進制表示觀察時,針對行掩模將是:

左和右圖像之間的距離爲-2,所以我們移位2位離開第一掩模:

1001 << 2 => 100100 

所以現在我們有這些面具:

100100 
001111 

取與這些給我們:

000100 

非零結果告訴我們,我們有碰撞。