为什么这个交叉功能不起作用?

时间:2013-12-06 19:43:02

标签: java lwjgl intersection

当两个矩形正确相交时,此代码不会显示:

public boolean intersects(Entity other) {
    hitbox.setBounds((int) x, (int) y, (int) width, (int) height);
    System.out.println(x);
    System.out.println(y);
    System.out.println(width);
    System.out.println(height);
    boolean a = false;
    Point b = new Point();
    Point c = new Point();
    Point d = new Point();
    Point e = new Point();
    b.setLocation((int)other.getX(), (int)other.getY());
    c.setLocation((int)other.getX() + (int)other.getWidth(), (int)other.getY());
    d.setLocation((int)other.getX() + (int)other.getWidth(), (int)other.getY() + (int)other.getHeight());
    e.setLocation((int)other.getX(), (int)other.getY() + (int)other.getHeight());
    if(hitbox.contains(b)){a = true;}
    if(hitbox.contains(c)){a = true;}
    if(hitbox.contains(d)){a = true;}
    if(hitbox.contains(e)){a = true;}
    return a;
}

首先,当矩形不相交时,它会将矩形报告为交叉,然后突然拒绝接受它们相交,即使它们相交也是如此。

2 个答案:

答案 0 :(得分:2)

您的代码不起作用,因为矩形交叉点不需要一个矩形的角落在另一个矩形内。这可能导致漏报,即对于相交的矩形获得false

Illustration

获得假阴性的另一种方法是当hitbox的两个或四个角落在other矩形内时:因为你只是通过一种方式检查它,而不是另一种方式,这样的交叉点也不会被发现。

Hitbox non-symmetry.

您不必使用任何系统类来确定矩形相交。你可以这样做:

boolean intersectRect(int x1, int y1, int w1, h1, int x2, int y2, int w2, int h2) {
    return intersectRange(x1, x1+w1, x2, x2+w2)
        && intersectRange(y1, y1+h1, y2, y2+h2);
}
boolean intersectRange(int ax1, int ax2, int bx1, int bx2) {
    return Math.max(ax1, bx1) <= Math.min(ax2, bx2);
}

答案 1 :(得分:2)

不要重新发明轮子:

Rectangle r1 = new Rectangle(x,y,width,height);
Rectangle r2 = new Rectangle(other.getX(),other.getY(),other.getWidth(),other.getHeight());

return r1.intersect(r2);

请注意,这需要2个对象分配,如果您想在代码中直接计算边界,则可以完全不使用对象分配。