如何检查矩形是否相交?
How to check if a rectangle is intersecting?
您好,我正在尝试使此构造函数:public Rectangle createIntersection(Rectangle r){ ....
到 return 一个新的 Rectangle 对象,表示此 Rectangle 与指定 Rectangle 的交集。
到目前为止我已经为构造函数做了这个,但我不确定它是否正确:
public Rectangle createIntersection(Rectangle r) {
Rectangle r1 = new Rectangle () ;
Rectangle r2 = new Rectangle ();
r2.setRect(r);
r2.createIntersection(r1);
return r2;
}
然后我应该创建这个构造函数 public Boolean intersects (Rectangle r)
如果它与指定的 Rectangle 相交则 return 为真,否则为 return 假。如果它们的内部重叠,则称它们相交。所以我知道为此我需要使用四个实例变量,我一直在使用 (int x int y int height 和 int width)。我知道它必须通过 x + width
来确定它是否相交,如果这个值小于它对面的点,那么矩形就会重叠。不知道怎么写。
此方法returns两个矩形的重叠区域,如果不重叠则为null:
public static Rectangle createIntersection(Rectangle r1, Rectangle r2) {
// Left x
int leftX = Math.max(r1.x, r2.x);
// Right x
int rightX = (int) Math.min(r1.getMaxX(), r2.getMaxX());
// TopY
int topY = Math.max(r1.y,r2.y);
// Bottom y
int botY = (int) Math.min(r1.getMaxY(), r2.getMaxY());
if ((rightX > leftX) && (botY > topY)) {
return new Rectangle(leftX, topY, (rightX - leftX), (botY -topY));
}
return null;
}
一些测试:
public static void main(String [] args) {
Rectangle r1 = new Rectangle(10,10,10,10);
Rectangle r2 = new Rectangle(10,10,10,10);
System.out.println(createIntersection(r1, r2));
r1 = new Rectangle(10,10,10,10);
r2 = new Rectangle(15,15,10,10);
System.out.println(createIntersection(r1, r2));
r1 = new Rectangle(20,20,10,10);
r2 = new Rectangle(15,15,10,10);
System.out.println(createIntersection(r1, r2));
r1 = new Rectangle(15,30,10,10);
r2 = new Rectangle(15,15,10,10);
System.out.println(createIntersection(r1, r2));
r1 = new Rectangle(15,30,10,10);
r2 = new Rectangle(15,15,10,20);
System.out.println(createIntersection(r1, r2));
}
如果代码不清楚,请不要犹豫。
我猜你搞混了。您在谈论构造函数;但是你在这里说得通;是矩形的普通成员方法 class!
您要编码的第一件事是:
class Rectangle {
...
public boolean intersects(Rectangle other) {
// should return true if "this" and "other" rectangle "intersect"
return intersectsOnX(other.x, other.width) && intersectsOnY(other.y, other.height);
}
private boolean intersectsOnX(int otherX, int otherWidth) {
// check if other starts to the right of this
if (this.x + width <= otherX) return false;
// check if this starts to the left of other
if (otherX + otherWidth <= this.x) return false;
// then this / other must be overlapping
return true;
}
intersectsOnY() 以相同的方式工作(实际上它会使用完全相同的比较;因此您实际上希望避免那里的代码重复。
现在,有人可以调用 intersects() 来了解是否存在交集;如果该方法 returns 为真;你可以调用你应该放入矩形的另一种方法 class:
public Rectangle getIntersection(Rectangle other) {
以上是您的起点 - 正如我评论的那样:解决这个问题并不难;所以试试吧。
您好,我正在尝试使此构造函数:public Rectangle createIntersection(Rectangle r){ ....
到 return 一个新的 Rectangle 对象,表示此 Rectangle 与指定 Rectangle 的交集。
到目前为止我已经为构造函数做了这个,但我不确定它是否正确:
public Rectangle createIntersection(Rectangle r) {
Rectangle r1 = new Rectangle () ;
Rectangle r2 = new Rectangle ();
r2.setRect(r);
r2.createIntersection(r1);
return r2;
}
然后我应该创建这个构造函数 public Boolean intersects (Rectangle r)
如果它与指定的 Rectangle 相交则 return 为真,否则为 return 假。如果它们的内部重叠,则称它们相交。所以我知道为此我需要使用四个实例变量,我一直在使用 (int x int y int height 和 int width)。我知道它必须通过 x + width
来确定它是否相交,如果这个值小于它对面的点,那么矩形就会重叠。不知道怎么写。
此方法returns两个矩形的重叠区域,如果不重叠则为null:
public static Rectangle createIntersection(Rectangle r1, Rectangle r2) {
// Left x
int leftX = Math.max(r1.x, r2.x);
// Right x
int rightX = (int) Math.min(r1.getMaxX(), r2.getMaxX());
// TopY
int topY = Math.max(r1.y,r2.y);
// Bottom y
int botY = (int) Math.min(r1.getMaxY(), r2.getMaxY());
if ((rightX > leftX) && (botY > topY)) {
return new Rectangle(leftX, topY, (rightX - leftX), (botY -topY));
}
return null;
}
一些测试:
public static void main(String [] args) {
Rectangle r1 = new Rectangle(10,10,10,10);
Rectangle r2 = new Rectangle(10,10,10,10);
System.out.println(createIntersection(r1, r2));
r1 = new Rectangle(10,10,10,10);
r2 = new Rectangle(15,15,10,10);
System.out.println(createIntersection(r1, r2));
r1 = new Rectangle(20,20,10,10);
r2 = new Rectangle(15,15,10,10);
System.out.println(createIntersection(r1, r2));
r1 = new Rectangle(15,30,10,10);
r2 = new Rectangle(15,15,10,10);
System.out.println(createIntersection(r1, r2));
r1 = new Rectangle(15,30,10,10);
r2 = new Rectangle(15,15,10,20);
System.out.println(createIntersection(r1, r2));
}
如果代码不清楚,请不要犹豫。
我猜你搞混了。您在谈论构造函数;但是你在这里说得通;是矩形的普通成员方法 class!
您要编码的第一件事是:
class Rectangle {
...
public boolean intersects(Rectangle other) {
// should return true if "this" and "other" rectangle "intersect"
return intersectsOnX(other.x, other.width) && intersectsOnY(other.y, other.height);
}
private boolean intersectsOnX(int otherX, int otherWidth) {
// check if other starts to the right of this
if (this.x + width <= otherX) return false;
// check if this starts to the left of other
if (otherX + otherWidth <= this.x) return false;
// then this / other must be overlapping
return true;
}
intersectsOnY() 以相同的方式工作(实际上它会使用完全相同的比较;因此您实际上希望避免那里的代码重复。
现在,有人可以调用 intersects() 来了解是否存在交集;如果该方法 returns 为真;你可以调用你应该放入矩形的另一种方法 class:
public Rectangle getIntersection(Rectangle other) {
以上是您的起点 - 正如我评论的那样:解决这个问题并不难;所以试试吧。