0

topLeftCorner を表す Point と、その幅と高さを表す Dimension を持つ Shape というオブジェクトを作成しました。topRightCorner を取得するには、幅を topLeftPoint.x に追加するだけです。私はそれらを中心を中心にある程度回転させます。回転後の問題はintersects(Shape)、シェイプの回転を尊重しないため、私の方法が失敗することです。回転は各シェイプで同じになります。私の現在の実装は、Shape オブジェクト内で次のようになります。

public boolean intersects(Shape s){
    // functions returning a Point of shape s
    return intersects(s.topLeft())
        || intersects(s.topRight())
        || intersects(s.bottomLeft())
        || intersects(s.bottomRight())
        || intersects(s.leftCenter())
        || intersects(s.rightCenter())
        || intersects(s.center());
}

public boolean intersects(Point p){
    return p.x >= leftX()
        && p.x <= rightX()
        && p.y >= topY()
        && p.y <= bottomY();
}

基本的に、rotatedLeftX()またはのような機能がrotatedTopRight()適切に機能する必要があります。また、その計算では、90回転前のtopLeftポイントがいつtopRightに変わるかは問題ではないと思います...

私はすでにこれこの質問を読んでいますが、完全には理解していません。

4

2 に答える 2

1

私が書いた戦艦ゲームの長方形で示していることを行うために、Stackoverflow のアルゴリズムを変更しました。コードは次のとおりです。

    private boolean overlaid(int [][][] shps, int curr)
    {
        for (int i = curr-1; i>=0; --i)
        {
//              From: http://stackoverflow.com/questions/306316/determine-if-two-rectangles-overlap-each-other/306332#306332                
//              if (RectA.X1 < RectB.X2 && RectA.X2 > RectB.X1 &&
//                      RectA.Y1 < RectB.Y2 && RectA.Y2 > RectB.Y1)

            if (shps[curr][0][1] <= shps[i][1][1] && 
                shps[curr][1][1] >= shps[i][0][1] &&
                shps[curr][0][0] <= shps[i][1][0] && 
                shps[curr][1][0] >= shps[i][0][0])
                return true;
        }

        return false;
    }


 private int [][][]   shps = {  {{-1,-1},{-1,-1}},
                                 {{-1,-1},{-1,-1}},
                                 {{-1,-1},{-1,-1}}  };

このshpsパラメーターは、{x0,y0}、{x1,y1} を使用して各四角形の左上隅と右下隅の位置を示す単なるマトリックスです。たとえば、shps[curr][0][1]== 現在shpの y0 です。私の目的のために、<= と >= を使用する必要がありました。また、画面座標とデカルト座標を使用している場合は、y の逆に注意する必要があります。NOTオーバーレイを使用したい場合は、DeMorganの法則も。

于 2012-06-06T12:25:52.737 に答える
0

私は解決策を持っています:

x = 1、y = 1 (topLeft Point)、幅 4、高さ 6 の形状の中心 (3, 4) == (x1, y2)

rotatedX = x1 + cos(q) * (x - x1) - sin(q) * (y - y1)
rotatedY = y1 + sin(q) * (x - x1) + cos(q) * (y - y1)

この場合:

rotatedX = 3 + cos(90) * (1 - 3) - sin(90) * (1 - 4)
rotatedY = 4 + sin(90) * (1 - 3) + cos(90) * (1 - 4)

これはデカルト平面での回転です (正の回転値は反時計回りの回転を意味します)。

したがって、時計回りに 90 度の回転を適用したい場合は、回転に -1 を掛けるだけです。

于 2012-06-06T16:38:44.120 に答える