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