0

我写了一个名为 Shape 的对象,它有一个 Point 代表 topLeftCorner,一个 Dimension 代表它的宽度和高度。要获得 topRightCorner,我可以简单地将宽度添加到 topLeftPoint.x。我用它们围绕它们的中心旋转一定程度。旋转后的问题是,我的intersects(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()or这样的功能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 的倒数。如果您想使用不叠加,也可以使用德摩根定律。

于 2012-06-06T12:25:52.737 回答
0

我有一个解决方案:

假设我想计算一个形状的旋转(90 度),其中 x =1,y=1(topLeft 点),宽度为 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 度 CLOCKWISE 的旋转,您只需将旋转乘以 -1;

于 2012-06-06T16:38:44.120 回答