Java 检查两个对象相交的算法

Java 检查两个对象相交的算法,java,algorithm,geometry,collision-detection,intersection,Java,Algorithm,Geometry,Collision Detection,Intersection,我正在编写一个小游戏,我在十字路口遇到了一些问题。我需要一个有效的算法来检查两个对象(有x和y坐标,还有宽度和高度)是否相交 我尝试了以下方法,但它并不总是有效,有时它无法使十字路口重新定位 public boolean contains(int x, int y) { if ((x < this.x + this.width) && (x >= this.x) && (y < this.y + this.height) &

我正在编写一个小游戏,我在十字路口遇到了一些问题。我需要一个有效的算法来检查两个对象(有x和y坐标,还有宽度和高度)是否相交

我尝试了以下方法,但它并不总是有效,有时它无法使十字路口重新定位

    public boolean contains(int x, int y) {
    if ((x < this.x + this.width) && (x >= this.x) && (y < this.y + this.height) && (y >= this.y))
        return true;
    else
        return false;
}
公共布尔包含(int x,int y){
如果((x=this.x)&(y=this.y))
返回true;
其他的
返回false;
}
我有一个包含对象的ArrayList,并执行以下操作:

    private boolean checkIntersection(String pDirection) {

    for (int i = 0; i < walls.size(); i++) {
        if (pDirection.equalsIgnoreCase("right") && car.contains(walls.get(i).getX() - 1, walls.get(i).getY()))
            return true;
        if (pDirection.equalsIgnoreCase("left") && car.contains(walls.get(i).getX() + 30, walls.get(i).getY()))
            return true;
        if (pDirection.equalsIgnoreCase("top") && car.contains(walls.get(i).getX(), walls.get(i).getY() + 30))
            return true;
        if (pDirection.equalsIgnoreCase("down") && car.contains(walls.get(i).getX(), walls.get(i).getY() - 1))
            return true;
    }
    return false;
}
private boolean checkIntersection(字符串pDirection){
对于(int i=0;i
注意“-1”和“+30”是为了避免车辆进入“墙”,墙的宽度为30,高度为30。这辆车的尺寸也一样

还要注意的是,x和y是矩形的左上角线条。汽车和墙壁是长方形的

我将感谢你的帮助

信息:如果我在墙上方,并且我将方向改为“向下”或“相反”,则不会在一排墙的开始处重新定位交叉点。

编辑1(我尝试反转对象,但也不总是有效):

private boolean checkIntersection(字符串pDirection){
对于(int i=0;i
算法中的缺陷是,您总是检查墙的左侧顶点是否在车内。然而,这并不等同于有交叉点

    public boolean contains(int x, int y) {
    if ((x < this.x + this.width) && (x >= this.x) && (y < this.y + this.height) && (y >= this.y))
        return true;
    else
        return false;
}
相反,您应该检查其中任何一个对象是否(至少)包含另一个对象的一个角(不一定是左上角)


请注意,您应该对两侧执行此检查,即轿厢包含墙的任何一角,或者墙包含轿厢的任何一角。

我通过以下方式解决了修改contains方法的问题,现在它可以正常工作:

public boolean contains(int x, int y) {
        if ((x < this.x + this.width) && (x > this.x-this.width) && (y < this.y + this.height) && (y > this.y-this.height))
            return true;
        else
            return false;
    }
公共布尔包含(int x,int y){
如果((xthis.x-this.width)&(ythis.y-this.height))
返回true;
其他的
返回false;
}

我想我是无意中做的(检查非交叉点而不是交叉点),但我可以使用@samgak和@Gene的答案/建议对其进行优化。谢谢,问题解决了。

没有“.equals”(“…”)它也可以工作,问题在其他地方,正如我所说,它只是有时不会重新设置交叉口@Aominè您是否打算比较
字符串
对象的引用或其内容?@Aominè这不是我的优先事项。它在平等和不平等的情况下工作。我需要交集算法。如果你想,你可以使用
JavaFx
有一个名为
BoundingBox
的类,其中包含非常有用的方法。。。这是你想要的一切。。。看一下这里的文档:@Yahya谢谢你提供的信息,但是为了实现它,我应该更改数百条线,我只想为交叉点创建“算法”,我不需要其余的。这绝对不是一个解决方案。它将在一天内开始不工作:)即,您更改了尺寸。考虑该情况,一个矩形在点(200200)上具有尺寸(20, 20),而另一个在尺寸(100, 100)处位于(100, 210)。它们肯定是相交的,但如果调用第一个包含参数(x,y)=(100210)的contains方法,就会得到false。在我的情况下,它总是有效的,因为尺寸是固定的,我不需要改变它们。