62,614
社区成员
发帖
与我相关
我的任务
分享
//综合诸位大仙的结果如下:
public class Rectangle2Test {
private static final class Rectangle {
final int x, y;// 左下角的点的x和y坐标
final int w, h;// 矩形的宽度和高度
/* Y
*\ /|\
* | 假设坐标系是这样:
* |
* |--------->X
* */
public Rectangle(int x, int y, int w, int h) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
}
/*
* 第一种方法
*/
public boolean intersects1(Rectangle r) {
// 两个矩形的水平与垂直区间都相交,两个矩形才相交
if ((interval(x, x + w, r.x) || interval(x, x + w, r.x + r.w))
&& (interval(y, y + h, r.y) || interval(y, y + h, r.y + r.h))) {
return true;
}
return false;
}
// 判断value是否在区间[start, end]之中
private static boolean interval(int start, int end, int value) {
if (start <= value && value <= end) {
return true;
}
return false;
}
/*
* 第二种方法
*/
public boolean intersects2(Rectangle r) {
// 只要保证: A的最左边坐标 <= B的最右边 && A的最右边坐标 >= B的最左边坐标
if ((x <= r.x + r.w && x + w >= r.x)
&& (y <= r.y + r.h && y + h >= r.y)) {
return true;
}
return false;
}
/*
* 第三种方法
*
* 假设矩形A和B分别有(p1, p2)和(p3,p4)确定(主对角线上的两个点),
* p1,p3分别是A、B的左下角点,p2、p4分别是A、B的右上角点
* 那么两个矩阵不相交的情况是:
* p2.y<p3.y(A在B的下方)或p4.x<p1.x(A在B的右边)或p4.y<p1.y(A在B的上方)或p2.x<p3.x(A在B的左边)
* 所以:
* 不相交:p2.y<p3.y || p4.x<p1.x || p4.y<p1.y || p2.x<p3.x
* 相交:!(p2.y<p3.y || p4.x<p1.x || p4.y<p1.y || p2.x<p3.x)
* 由德摩根定律知相交的情况是:
* p2.y>=p3.y && p4.x>=p1.x && p4.y>=p1.y && p2.x>=p3.x
* 所以:
*/
public boolean intersects3(Rectangle r) {
int x1 = this.x;
int y1 = this.y;
int x2 = x1 + w;
int y2 = x2 + h;
int x3 = r.x;
int y3 = r.y;
int x4 = x3 + r.w;
int y4 = y3 + r.h;
return y2 >= y3 && x4 >= x1 && y4 >= y1 && x2 >= x3;
}
}
public static void main(String[] args) {
Rectangle r1 = new Rectangle(0, 0, 5, 5);
Rectangle r2 = new Rectangle(2, 2, 2, 2);
Rectangle r3 = new Rectangle(6, 6, 2, 2);
Rectangle r4 = new Rectangle(-2, -2, 1, 2);
System.out.println(r1.intersects1(r2));
System.out.println(r1.intersects1(r3));
System.out.println(r1.intersects1(r4));
System.out.println(r1.intersects2(r2));
System.out.println(r1.intersects2(r3));
System.out.println(r1.intersects2(r4));
System.out.println(r1.intersects3(r2));
System.out.println(r1.intersects3(r3));
System.out.println(r1.intersects3(r4));
}
}
public boolean intersects(Rect r) {
// 只要保证: A的最左边坐标 <= B的最右边 && A的最右边坐标 >= B的最左边坐标
if ((x <= r.x + r.w && x + w >= r.x) && (y <= r.y + r.h && y + h >= r.y)) { return true; }
return false;
}