如何使用java查看两个矩形是否有一个相等的点?

时间:2014-11-06 00:49:16

标签: java

我有矩形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

输出:

2 个答案:

答案 0 :(得分:2)

java.awt.Rectangle是AWT的一部分,用于表示图像(和屏幕)中的离散区域。点和尺寸是整数。 intersects()方法可以满足您的需要,并且您给出的矩形不会相交。 false是正确的值。

考虑图像中的像素。 java.awt.Rectangle的坐标基本上是像素的中心,尺寸是 count 。所以new Rectangle(-4, -1, 2, 1)例如,在你假设的情况下它的右下角(-2,-2),它的右下角是(-3,-1):

enter image description here

红色矩形的最上面最左边的像素是(-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));
    }
}