矩形交叉点共享边缘

时间:2014-01-13 20:36:18

标签: java android andengine intersection rectangles

我正在尝试确定两个矩形是否相互交叉。如果它们共享边缘或边缘的一部分,那么我想要包含它们,如果它们只共享一个顶点,那么我不会。

我尝试使用android android.graphics.Rect,我希望相交方法会返回true给我一个矩形,宽度为0但是相交边缘的点。我正在使用andEngine并尝试了org.andengine.entity.primitive.Rectangle的collideswith方法,但是返回true,即使矩形只共享一个角顶点。

有这样做的好方法吗?我能想到的另一种方法是尝试创建所有边缘的集合,然后查看它们是否相等或者在某种程度上是否相等。

这是一张展示我想要的图片。如果我点击rect 1然后我想返回2,3和4,但不是5.

1 http://i43.tinypic.com/2d0bfxg.png“地图”

2 个答案:

答案 0 :(得分:1)

听起来你需要一个新课来做到这一点。我会采用矩形每个角的坐标。然后,当您选择一个矩形时,您可以通过一次找到它来获取它们旁边的那些矩形。从顶部开始作为示例,您可以检查哪些其他矩形在相同高度处具有角。从该列表中,您可以检查两个顶角之间至少有一个点存在哪些。因此,如果左上角是0,3而右上角是4,3,那么你会在y = 3处寻找角落列表。从该列表中,您可以找到0 <= x <= 4的所有角落,并且任何适合的角落都是相邻的。然后,您为每个额外的一方做同样的事情。它应该是一个简单的类,但我不打算编写任何代码,因为我不知道如何存储数据或如何在代码中引用它。如果您需要帮助,请写下评论。

答案 1 :(得分:1)

编写一个函数来查找哪些矩形与所有考虑的矩形内的矩形共享边缘。

然后,将这些共享边缘的矩形映射到另一个。邻接列表只是一种在代码中表示图形的方法。

有时代码更容易理解,所以这里是代码。我没有对此进行测试,但它应该让你最好的方式。

另外,我不确定你最终的目标是什么,但here's a question我回答了矩形压缩问题。

List<Rectangle> allRectangles;

public boolean shareAnEdge(Rectangle r1, Rectangle r2){
    int y1 = r1.y + r1.height;
    int y2 = r2.y+r2.height;
    int x1 = r1.x+r1.width;
    int x2 = r2.x+r2.width;
    boolean topShared = (y1 == r2.y && r2.x == r1.x);
    boolean bottomShared = (y2 == r2.y && r2.x==r1.x);
    boolean rightShared = (x1 == r2.x && r2.y==r1.y);
    boolean leftShared = (x2 == r1.x && r2.y==r1.y);
    if (topShared || bottomShared || rightShared || leftShared) {
        return true;
    }
    return false;
}

public List<Rectangle> findSharedEdgesFor(Rectangle input){
    List<Rectangle> output = new List<Rectangle>();
    for(Rectangle r : allRectangles){
        if(r!=input && shareAnEdge(r, input)){
            output.add(r);
        }
    }
}

public AdjacencyList createGraph(List<Rectangle> rectangles){
    AdjacencyList graph = new AdjacencyList();
    for(Rectangle r : rectangles){
        List<Rectangle> sharedEdges = findSharedEdgesFor(r);
        for(Rectangle shared : sharedEdges){
            graph.createEdgeBetween(r, shared);
        }
    }   
}