如何检查两个矩形是否在轴上碰撞
How to check if two rectangles collide over the axis
我想我有一些重复的问题,但我就是想不通。
所以我得到了一个 Region
class。这个 class 包含四个属性。 aX
、aY
和 bX
、bY
。
现在我想产生一个方法doesCollide(Region other)
。我已经尝试了很多东西,但无法让它发挥作用。我认为是的,因为 regions 指的是 minecraft 世界上的一个区域,其中 to 点 a
和 b
可以是负数。有人可以帮我吗?
为了更好地理解,我绘制了一个场景图:
我尝试过的:
由于用户的提示,我尝试使用 java.awt.Rectangle
class:
Rectangle thisRectangle = new Rectangle((int) aX, (int) aY, Math.abs((int) bX) - Math.abs((int) aX), Math.abs((int) bY) - Math.abs((int) aY));
Rectangle otherRectangle = new Rectangle((int) other.aX, (int) other.aY, Math.abs((int) other.bX) - Math.abs((int) other.aX), Math.abs((int) other.bY) - Math.abs((int) other.aY));
return thisRectangle.intersects(otherRectangle);
(完全不知道自己做对了没有)
我尝试了一些我认为是这里使用的“标准”东西:
return aX < other.bX && bX > other.aX & aY < other.bY && bY > other.aY
嗯,也没用。
好的,有些事情要指出。首先,如果你有双精度值,你可以使用 Rectangle2D.Double。其次,它可以很好地处理负数。
我建议创建一种将区域转换为 Rectangle2D 的方法。
public Rectangle2D getBounds(Region r){
double x, w;
if(r.aX < r.bX ){
x = r.aX;
w = r.bX - r.aX;
} else{
x = r.bX;
w = r.aX - r.bX;
}
double y, h;
if(r.aY < r.bY){
y = r.aY;
h = r.bY - r.aY;
} else{
y = r.bY;
h = r.aY - r.bY;
}
return new Rectangle2D.Double(x, y, w, h);
}
这是做什么的,检查以确保 aX、aY 和 bX、bY 的顺序正确,以便 x、y 是矩形的左上角并且宽度和高度为正(或零) ) 值。我把它写成区域的方法,但你可以把它写成区域的方法。这样:
public boolean intersects(Region other){
return getBounds().intersects(other.getBounds());
}
这是一种处理方法。我使用的是不可变 classes 的记录。 Rectangle2D
class 在 Java API 中将使用相同的方法。注意这里假设构造函数中第一个坐标是左上角,另一个是右下角。您可以考虑 specifying your region as a bounded area with the upper left coordinates specified along with the width and height
。然后根据需要 return 其他坐标将是微不足道的。
import java.awt.Rectangle;
public class RectangleIntersections {
record Region(int aX, int aY, int bX, int bY) {
public int getWidth() {
return bX-aX;
}
public int getHeight() {
return bY-aY;
}
public boolean intersects(Region other) {
return new Rectangle(aX, aY, getWidth(), getHeight()).intersects(
new Rectangle(other.aX, other.aY, other.getWidth(), other.getHeight()));
}
}
public static void main(String[] args) {
new RectangleIntersections().start();
}
public void start() {
Region r1 = new Region(0,0, 100,100);
Region r2 = new Region(50,50, 150,150);
System.out.println(r1.intersects(r2));
Region r3 = new Region(101, 101, 110,120);
System.out.println(r1.intersects(r3));
}
}
打印
true
false
我想你可以这样做:
if(Math.abs(thisRectangle.getMaxX()-otherRectangle.getMaxX())<otherRectangle.getWidth()&& Math.abs(thisRectangle.getMaxY()-otherRectangle.getMinY())<otherRectangle.getHeight())
我想我有一些重复的问题,但我就是想不通。
所以我得到了一个 Region
class。这个 class 包含四个属性。 aX
、aY
和 bX
、bY
。
现在我想产生一个方法doesCollide(Region other)
。我已经尝试了很多东西,但无法让它发挥作用。我认为是的,因为 regions 指的是 minecraft 世界上的一个区域,其中 to 点 a
和 b
可以是负数。有人可以帮我吗?
为了更好地理解,我绘制了一个场景图:
我尝试过的:
由于用户的提示,我尝试使用 java.awt.Rectangle
class:
Rectangle thisRectangle = new Rectangle((int) aX, (int) aY, Math.abs((int) bX) - Math.abs((int) aX), Math.abs((int) bY) - Math.abs((int) aY));
Rectangle otherRectangle = new Rectangle((int) other.aX, (int) other.aY, Math.abs((int) other.bX) - Math.abs((int) other.aX), Math.abs((int) other.bY) - Math.abs((int) other.aY));
return thisRectangle.intersects(otherRectangle);
(完全不知道自己做对了没有)
我尝试了一些我认为是这里使用的“标准”东西:
return aX < other.bX && bX > other.aX & aY < other.bY && bY > other.aY
嗯,也没用。
好的,有些事情要指出。首先,如果你有双精度值,你可以使用 Rectangle2D.Double。其次,它可以很好地处理负数。
我建议创建一种将区域转换为 Rectangle2D 的方法。
public Rectangle2D getBounds(Region r){
double x, w;
if(r.aX < r.bX ){
x = r.aX;
w = r.bX - r.aX;
} else{
x = r.bX;
w = r.aX - r.bX;
}
double y, h;
if(r.aY < r.bY){
y = r.aY;
h = r.bY - r.aY;
} else{
y = r.bY;
h = r.aY - r.bY;
}
return new Rectangle2D.Double(x, y, w, h);
}
这是做什么的,检查以确保 aX、aY 和 bX、bY 的顺序正确,以便 x、y 是矩形的左上角并且宽度和高度为正(或零) ) 值。我把它写成区域的方法,但你可以把它写成区域的方法。这样:
public boolean intersects(Region other){
return getBounds().intersects(other.getBounds());
}
这是一种处理方法。我使用的是不可变 classes 的记录。 Rectangle2D
class 在 Java API 中将使用相同的方法。注意这里假设构造函数中第一个坐标是左上角,另一个是右下角。您可以考虑 specifying your region as a bounded area with the upper left coordinates specified along with the width and height
。然后根据需要 return 其他坐标将是微不足道的。
import java.awt.Rectangle;
public class RectangleIntersections {
record Region(int aX, int aY, int bX, int bY) {
public int getWidth() {
return bX-aX;
}
public int getHeight() {
return bY-aY;
}
public boolean intersects(Region other) {
return new Rectangle(aX, aY, getWidth(), getHeight()).intersects(
new Rectangle(other.aX, other.aY, other.getWidth(), other.getHeight()));
}
}
public static void main(String[] args) {
new RectangleIntersections().start();
}
public void start() {
Region r1 = new Region(0,0, 100,100);
Region r2 = new Region(50,50, 150,150);
System.out.println(r1.intersects(r2));
Region r3 = new Region(101, 101, 110,120);
System.out.println(r1.intersects(r3));
}
}
打印
true
false
我想你可以这样做:
if(Math.abs(thisRectangle.getMaxX()-otherRectangle.getMaxX())<otherRectangle.getWidth()&& Math.abs(thisRectangle.getMaxY()-otherRectangle.getMinY())<otherRectangle.getHeight())