高速矩形交差判定

自分はいつも、

private boolean isCross(int x1, int y1, int w1, int h1,
                        int x2, int y2, int w2, int h2)
{
    return ((x1 + w1 > x2) && (x1 < x2 + w2) &&
            (y1 + h1 > y2) && (y1 < y2 + h2));
}

こうやって書いていたんですが、これより速い判定方法があるとのこと。


こんな判定文。

private boolean isCross(int x1, int y1, int w1, int h1,
                        int x2, int y2, int w2, int h2)
{
    return (((x1 - x2 - w2) & (x2 - x1 - w1) &
             (y1 - y2 - h2) & (y2 - y1 - h1)) < 0);
}

それぞれの4つの条件が全てマイナスだったときに、trueを返すようになってます。
確かにこっちのほうが高速っぽいですね。
……でも、Javaだとほとんど変わらないんだろなぁ……(;´Д`)


Cだったら、0より小さいかどうかを判定するのではなく、右に31bitシフトして返すと更に高速に。

return (((DWORD)((x1 - x2 - w2) & (x2 - x1 - w1) &
                 (y1 - y2 - h2) & (y2 - y1 - h1))) >> 31);