0

有谁知道一种算法可以用来确定两个矩形重叠的数量和方向?我花了几个小时试图弄清楚这一点,以便我可以将它实现到一个用 slick2d + java 编写的基本瓷砖游戏中。

4

3 回答 3

1

轮询角的坐标,如果的最近和最远顶点Square1之间有任何角Square2,它们是否因坐标差异而发生碰撞?

例子:

square1.setVertex1(0,0);
square1.setVertex2(2,0);
square1.setVertex3(2,2);
square1.setVertex4(0,2);

square2.setVertex1(1,1);
square2.setVertex2(4,1);
square2.setVertex3(4,4);
square2.setVertex4(1,4);

Vertex[] verticesSq1=Square1.getVertices();
for (Vertex vert: verticesSq1) {
    if(vert.getXVal>square2.getLowestXVal() &&
       vert.getXVal<square2.getHighestXVal() 

       &&
       vert.getYval>square2.getLowestYval() &&
       vert.getYVal<square2.getHighestYVal() {

            System.out.write("Vertex "+vert.ID+" is overlapping Square 2 by " +
            vert.getXval()-square2.getLowestXVal +","+
            vert.getYval()-square2.getLowestYVal);
    }
}
于 2012-04-20T16:20:03.210 回答
1

让我们将每个矩形表示为 R=(x1,x2,y1,y2)(即 (x1,y1), (x1,y2), (x2,y1), (x2,y2) 是该矩形的顶点,而 x1

现在,我们有两个矩形 R1 和 R2,我们想知道它们是否重叠,如果重叠,是什么方向。

对于 R1 的每个顶点,检查它是否在可以表示为 4 位的矩形 R2 内。映射很直接:

0000 -> None (or R2 is inside R1)
0001 -> R2 is bottom right of R1
0010 -> R2 is top right of R1
0100 -> R2 is bottom left of R1
1000 -> R2 is top left of R1
0011 -> R2 is right of R1
0101 -> R2 is bottom of R1
1100 -> R2 is left of R1
1010 -> R2 is left of R1
1111 -> R1 is inside R2

其他组合是不可能的。

于 2012-04-20T17:58:41.743 回答
0

首先在矩形之间创建一个中心点(第二个矩形的中心 - 第一个矩形的中心)。检查从每个矩形的每个点到中心点的距离。选择 2 个最近的点,检查其中一个是否在另一个矩形内,如果是,则由这两个点创建的矩形给我们重叠区域。

于 2012-04-20T16:18:06.560 回答