我有矩形A =左上角(-4,-1),右下角(-2-2)和矩形B左上角(-2,-2),右下角(-1, - 3)
然后:
Rectangle first = new Rectangle(-4,-1,2,1); //x1,y1,width,height
Rectangle second = new Rectangle(-2,-2,1,1);
好的,我有两个相同点的矩形。 我使用first.intersects(第二个),这会返回false ..
如何使用java来执行此操作,如果Rectangle A中的一个或多个点属于Rectangle B,我需要返回True?
我的代码现在:
公共类GeometriaRectangle2 {
public static void main(String[] args) {
Scanner lector = new Scanner(System.in);
while (lector.hasNextLine()) {
String a[] = lector.nextLine().split(",");
int b[] = new int[a.length];
for (int i = 0; i < a.length; i++) {
b[i] = Integer.parseInt(a[i]);
}
int c = Math.abs(b[0] - b[2]);
int d = Math.abs(b[1] - b[3]);
int e = Math.abs(b[4] - b[6]);
int f = Math.abs(b[5] - b[7]);
Rectangle r = new Rectangle(b[0], b[1], c, d);
Rectangle r2 = new Rectangle(b[4], b[5], e, f);
int tw = r.width;
int th = r.height;
int rw = r2.width;
int rh = r2.height;
if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0) {
System.out.println(false);
}
int tx = r.x;
int ty = r.y;
int rx = r2.x;
int ry = r2.y;
rw += rx;
rh += ry;
tw += tx;
th += ty;
// overflow || intersect or attached
if ((rw < rx || rw >= tx) && (rh < ry || rh >= ty)
&& (tw < tx || tw >= rx) && (th < ty || th >= ry)) {
System.out.println(true);
} else {
System.out.println(false);
}
}
}
}
示例:输入:
-3,3,-1,1,1,-1,3,-3
-3,3,-1,1,-2,4,2,2
输出:
假
真
答案 0 :(得分:2)
java.awt.Rectangle
是AWT的一部分,用于表示图像(和屏幕)中的离散区域。点和尺寸是整数。 intersects()
方法可以满足您的需要,并且您给出的矩形不会相交。 false
是正确的值。
考虑图像中的像素。 java.awt.Rectangle
的坐标基本上是像素的中心,尺寸是 count 。所以new Rectangle(-4, -1, 2, 1)
例如,在你假设的情况下它的右下角(-2,-2),它的右下角是(-3,-1):
红色矩形的最上面最左边的像素是(-4,-1)处的像素。最右下方的像素是(-3,-1)处的像素。另请注意,它不会与蓝色矩形重叠。
即使不是这种情况,您的矩形也不会相交。它们触摸一点,但不重叠。可以说,交叉点是(-2,-2)的“矩形”,宽度为0,高度为0 - 为空。
答案 1 :(得分:0)
您也可以修改intersects功能的当前代码以满足您的需求。在你的情况下,当两个矩形(甚至是侧线)的一对点共享相同的坐标时,你想要说明它是真的 - (读:附)。因此,您可以尝试这样的事情:
public boolean intersectsOrAttached(Rectangle r, Rectangle r2) {
int tw = r.width;
int th = r.height;
int rw = r2.width;
int rh = r2.height;
if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0) {
return false;
}
int tx = r.x;
int ty = r.y;
int rx = r2.x;
int ry = r2.y;
rw += rx;
rh += ry;
tw += tx;
th += ty;
//overflow || intersect or attached
return ((rw < rx || rw >= tx) &&
(rh < ry || rh >= ty) &&
(tw < tx || tw >= rx) &&
(th < ty || th >= ry));
}
<强>更新强>:
实际上在线评判系统有点棘手。 我设法让它被部分接受,我不确定它是时间或内存限制,以及一些我们无法轻易弄清楚的被忽视的边界情况。 但在这里,如果你可以自己优化它,那就更好了:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class OverlappingRectangles {
public static void main(String[] args) {
String f = args[0];
try {
BufferedReader br = new BufferedReader(new FileReader(f));
while (br.ready()) {
String cs[] = br.readLine().split(",");
int[] ci = new int[cs.length];
int i = 0;
for (String s : cs) {
ci[i] = Integer.parseInt(s);
i += 1;
}
if (ck(ci[0], ci[1], ci[2], ci[3], ci[4], ci[5], ci[6], ci[7])) {
System.out.println("True");
} else {
System.out.println("False");
}
}
} catch (FileNotFoundException ex) {
} catch (IOException ex) {
}
}
public static boolean ck(int rx, int ry, int rw, int rh, int tx, int ty, int tw, int th) {
//ATTENTION!
//rx,ry -> upper-left corner of rect A
//rw,rh -> bottom-right corner of rect A
//tx,ty -> upper-left corner of rect B
//tw,th -> bottom-right corner of rect B
return ((rw < rx || rw >= tx)
&& (rh < ry || rh >= ty)
&& (tw < tx || tw >= rx)
&& (th < ty || th >= ry));
}
}