如何在android中为Shapes写一个相交

时间:2012-06-06 11:32:07

标签: android math graphics rotation shape

我有一个名为Shape的Object,它有一个代表topLeftCorner的Point和一个代表它的宽度和高度的Dimension。 要获取topRightCorner,我只需将宽度添加到topLeftPoint.x即可。我用它们围绕中心旋转一定程度。轮换后的问题是,我的intersects(Shape)方法失败了,因为它不尊重形状的旋转。每个Shape的旋转都是相同的。我当前的实现在我的Shape Object中看起来像这样:

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 ...无关紧要。

我已在此处阅读thisthis问题,但不完全理解。

2 个答案:

答案 0 :(得分: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。出于我的目的,我不得不使用&lt; =和&gt; =。此外,如果使用屏幕坐标与笛卡尔坐标,则必须注意y的反转。如果你想使用NOT覆盖,还有DeMorgan定律。

答案 1 :(得分:0)

我有一个解决方案:

假设我想计算一个Shape的旋转(90度),其中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度CLOCKWISE,你只需要将旋转乘以-1;