001package org.cpsolver.ifs.example.rpp;
002
003import org.cpsolver.ifs.model.Value;
004
005/**
006 * Location (value, i.e., a single placement of the rectangle). Location encodes
007 * X and Y coordinate.
008 * 
009 * @version IFS 1.3 (Iterative Forward Search)<br>
010 *          Copyright (C) 2006 - 2014 Tomáš Müller<br>
011 *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
012 *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
013 * <br>
014 *          This library is free software; you can redistribute it and/or modify
015 *          it under the terms of the GNU Lesser General Public License as
016 *          published by the Free Software Foundation; either version 3 of the
017 *          License, or (at your option) any later version. <br>
018 * <br>
019 *          This library is distributed in the hope that it will be useful, but
020 *          WITHOUT ANY WARRANTY; without even the implied warranty of
021 *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
022 *          Lesser General Public License for more details. <br>
023 * <br>
024 *          You should have received a copy of the GNU Lesser General Public
025 *          License along with this library; if not see
026 *          <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
027 */
028public class Location extends Value<Rectangle, Location> {
029    private int iX, iY;
030
031    /**
032     * Constructor
033     * 
034     * @param rectangle
035     *            parent variable
036     * @param x
037     *            x coordinate
038     * @param y
039     *            y coordinate
040     */
041    public Location(Rectangle rectangle, int x, int y) {
042        super(rectangle);
043        iX = x;
044        iY = y;
045    }
046
047    /** Gets x coordinate
048     * @return x coordinate
049     **/
050    public int getX() {
051        return iX;
052    }
053
054    /** Gets y coordinate
055     * @return y coordinate
056     **/
057    public int getY() {
058        return iY;
059    }
060
061    /**
062     * Compare two coordinates. It is based on comparison of the parent
063     * rectangle and x,y coordinates
064     */
065    @Override
066    public boolean equals(Object object) {
067        if (object == null || !(object instanceof Location)) {
068            return false;
069        }
070        Location location = (Location) object;
071
072        return (variable().equals(location.variable()) && location.getX() == getX() && location.getY() == getY());
073    }
074
075    /**
076     * String representation (for debugging and printing purposes). For example,
077     * rect43=[12,10] where rect43 is the name of the parent rectangle and
078     * [12,10] is the location.
079     */
080    @Override
081    public String toString() {
082        return variable().getName() + "=[" + getX() + "," + getY() + "]";
083    }
084
085    /** Location's name. E.g., [12,10] where x=12 and y=10. */
086    @Override
087    public String getName() {
088        return "[" + getX() + "," + getY() + "]";
089    }
090
091    /** Returns true if the given location intersects with this location 
092     * @param anotherLocation given location
093     * @return true if the given location intersects with this location
094     **/
095    public boolean hasIntersection(Location anotherLocation) {
096        if (getX() + (variable()).getWidth() <= anotherLocation.getX()) {
097            return false;
098        }
099        if (getY() + (variable()).getHeight() <= anotherLocation.getY()) {
100            return false;
101        }
102        if (anotherLocation.getX() + (anotherLocation.variable()).getWidth() <= getX()) {
103            return false;
104        }
105        if (anotherLocation.getY() + (anotherLocation.variable()).getHeight() <= getY()) {
106            return false;
107        }
108        return true;
109    }
110}