简体   繁体   中英

java.awt.Rectangle#intersects(Rectangle r) ugly implementation?

The following is intersects(Rectangle r) method from awt Rectangle source code.
I add some comments starting with //* related to my question:
Since the code verifies that rw (for example) is positive then rw rw+rx must be bigger than rx .
If that is the case rw < rx is always false, so why is it checked?

/**
 * Determines whether or not this {@code Rectangle} and the specified
 * {@code Rectangle} intersect. Two rectangles intersect if
 * their intersection is nonempty.
 *
 * @param r the specified {@code Rectangle}
 * @return    {@code true} if the specified {@code Rectangle}
 *            and this {@code Rectangle} intersect;
 *            {@code false} otherwise.
 */
public boolean intersects(Rectangle r) {
    int tw = width;
    int th = height;
    int rw = r.width;
    int rh = r.height;
    if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0) return false;
    int tx = x;
    int ty = y;
    int rx = r.x;
    int ry = r.y;
    //*at this point rw must be positive
    rw += rx;    //*after this assignment rw must be bigger than rx
    rh += ry;
    tw += tx;
    th += ty;
    //      overflow || intersect
    return (rw < rx || rw > tx) &&  //*rw < rx should always be false
            (rh < ry || rh > ty) &&
            (tw < tx || tw > rx) &&
            (th < ty || th > ry);
}

The same applies to rh < ry and tw < tx and th < ty .

The test for rw < rx , rh < ry , tw < tx and th < ty are redundant and can be eliminated:

public boolean intersects(Rectangle r) {

    int tw = width;
    int th = height;
    int rw = r.width;
    int rh = r.height;
    if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0)return false;

    rw += r.x;
    rh += r.y;
    tw += x;
    th += y;

    return  rw > x &&
            rh > y &&
            tw > r.x &&
            th > r.y;
}

After doing that we can take it one step further, make the code more readable and concise:

public boolean intersects(Rectangle other) {

      //to intersect both vertical and horizontal edges need to cross
      return
                //check if horizontal edge cross
                other.width + other.x > x &&   //other max x is bigger than min x and
                other.x < width + x   &&       //other min x is smaller than max x
                //check if vertical edge cross
                other.height+ other.y > y &&
                other.y <height + y ;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM