Java 检查两个对象相交的算法
我正在编写一个小游戏,我在十字路口遇到了一些问题。我需要一个有效的算法来检查两个对象(有x和y坐标,还有宽度和高度)是否相交 我尝试了以下方法,但它并不总是有效,有时它无法使十字路口重新定位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) &
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。在我的情况下,它总是有效的,因为尺寸是固定的,我不需要改变它们。