1

LibGDX を使用してゲームを作成していますが、長方形の衝突検出に関する問題が発生しました。

public class Rectangle{
   final float width = 1f;
   final float height = 0.5f;
   Point topLeft;
   Point topRight;
   Point bottomRight;
   Point bottomLeft;  
   //The point of rotation is the middle of the rectangle
   float angle;
}

public class Point{
   float x;
   float y;
}

この情報を使用して (これらの変数はすべて事前に計算されます)、2 つの長方形が重なっているかどうかを計算したいですか?

4

2 に答える 2

2

2 つの長方形が交差する場合、一方の長方形の内側にも点があり、もう一方の長方形の内側にも点があります。

各長方形は 4 本の線と見なすことができます。四角形の内側にあるには、点が左の線の右、右の線の左、下の線の上、上の線の下にある必要があります。したがって、長方形は、解を持つ 4 つの線形不等式のシステムとして表すことができます。

1 つの長方形の 4 つの線形不等式を別の長方形の 4 つの線形不等式と組み合わせて 8 つの不等式システムを作成すると、新しいシステムは長方形が交差する場合にのみ解を持ちます。

于 2013-04-14T19:51:57.023 に答える
1

これが私が最終的に使用したものです。まだコードを最適化する気がまったくないことに注意してください。

private boolean isColliding(Point p){
    float countCol = 0f;
    // BottomLeft - BottomRight
    float slope = ((player.getBottomLeft().getY() - player.getBottomRight().getY()) / (player.getBottomLeft().getX() - player.getBottomRight().getX()));
    float intercept = (player.getBottomLeft().getY() - (player.getBottomLeft().getX() * slope));

    // BottomLeft - TopLeft
    float slope2 = ((player.getBottomLeft().getY() - player.getTopLeft().getY()) / (player.getBottomLeft().getX() - player.getTopLeft().getX()));
    float intercept2 = (player.getTopLeft().getY() - (player.getTopLeft().getX() * slope2));

    // TopLeft - TopRight
    float slope3 = ((player.getTopLeft().getY() - player.getTopRight().getY()) / (player.getTopLeft().getX() - player.getTopRight().getX()));
    float intercept3 = (player.getTopRight().getY() - (player.getTopRight().getX() * slope3));

    // TopRight - BottomRight
    float slope4 = ((player.getTopRight().getY() - player.getBottomRight().getY()) / (player.getTopRight().getX() - player.getBottomRight().getX()));
    float intercept4 = (player.getBottomRight().getY() - (player.getBottomRight().getX() * slope4));

    // Between top and bottom
    if(player.getAngle() > -90 && player.getAngle() < 90){
        // BottomLeft - BottomRight
        if(p.getX() * slope + intercept < p.getY()){
            countCol += 1;
        }

        // TopLeft - TopRight
        if(p.getX() * slope3 + intercept3 > p.getY()){
            countCol += 1;
        }
    }
    else{
        // BottomLeft - BottomRight
        if(p.getX() * slope + intercept > p.getY()){
            countCol += 1;
        }

        // TopLeft - TopRight
        if(p.getX() * slope3 + intercept3 < p.getY()){
            countCol += 1;
        }
    }

    // BottomLeft - TopLeft
    if(player.getAngle() < 0){
        if(p.getX() * slope2 + intercept2 > p.getY()){
            countCol += 1;
        }
        if(p.getX() * slope4 + intercept4 < p.getY()){
            countCol += 1;
        }
    }
    else{
        if(p.getX() * slope2 + intercept2 < p.getY()){
            countCol += 1;
        }
        if(p.getX() * slope4 + intercept4 > p.getY()){
            countCol += 1;
        }
    }

    if(countCol >= 4){
        return true;
    }
    return false;
}
于 2013-04-15T00:24:21.180 に答える