0

そこで、衝突検出を調べることにしましたが、画像の透明な領域の検出を適切に回避する方法など、2つの画像間の2D衝突検出に関する適切な情報を見つけるのに苦労していましたが、自分が添付された1つの投稿を見つけましたしかし、問題は、私がその投稿を本当に理解しておらず、なぜ彼がそれらのことのいくつかを行うのか理解していないということです...

問題の投稿は次のとおりです:https ://stackoverflow.com/posts/336615/revisions

したがって、まず最初に、このソリューションが実際に優れた/適切なものであるかどうか、または他の場所を探す必要があるかどうかを尋ねたいと思います。

次に、彼の投稿で、ピクセルが透明かどうかを判断するために1と0を設定するために、2D配列ではなく整数配列を使用することに言及しているのではないかと思いますが、どのように達成すべきかはよくわかりません。これ。最初は、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

ビット単位のAND演算( )の結果は&、対応するビットが両方のオペランドでtrueである場合は各ビットに対してtrue(1)であり、それ以外の場合はfalse(0)です。

彼が使用しているアイデアは、元の画像の各不透明ピクセルが「1」ビットとして格納され、各透明ピクセルが「0」ビットとして格納されるバージョンの画像(マスク)を作成することです。これらは単一の整数にパックされ、単一のAND演算で別の画像のマスクに対してテストできます(ANDの前に、2つの画像間の水平距離を計算し、必要に応じてマスクの1つをシフトします)。

たとえば、次の2つの4x1ピクセル画像があるとします。

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

ここでは実用的な目的で別々の行に配置しましたが、同じ行にあると見なす必要があるため、左の画像の最後の2つのピクセルが右の画像の最初の2つのピクセルと重なっています。

バイナリ表現で表示した場合の行のマスクは次のようになります。

1001
1111

左右の画像間の距離は-2なので、最初のマスクを2ビット左にシフトします。

1001 << 2 => 100100

これで、次のマスクができました。

100100
001111

これらをANDすると、次のようになります。

000100

ゼロ以外の結果は、衝突があることを示しています。

于 2012-08-05T16:37:20.247 に答える