确定两个矩形重叠的程度和方向的算法?

时间:2012-04-20 16:06:27

标签: java algorithm collision-detection

是否有人知道可用于确定两个矩形重叠的方向和方向的算法?我花了好几个小时试图解决这个问题,所以我可以将它实现到用slick2d + java编写的基本平铺游戏中。

3 个答案:

答案 0 :(得分:1)

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

示例:

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);
    }
}

答案 1 :(得分:1)

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

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

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

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

其他组合是不可能的。

答案 2 :(得分:0)

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