001    package net.sf.cpsolver.ifs.example.rpp;
002    
003    import net.sf.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.2 (Iterative Forward Search)<br>
010     *          Copyright (C) 2006 - 2010 Tomas Muller<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     */
028    public 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        public int getX() {
049            return iX;
050        }
051    
052        /** Gets y coordinate */
053        public int getY() {
054            return iY;
055        }
056    
057        /**
058         * Compare two coordinates. It is based on comparison of the parent
059         * rectangle and x,y coordinates
060         */
061        @Override
062        public boolean equals(Object object) {
063            if (object == null || !(object instanceof Location)) {
064                return false;
065            }
066            Location location = (Location) object;
067    
068            return (variable().equals(location.variable()) && location.getX() == getX() && location.getY() == getY());
069        }
070    
071        /**
072         * String representation (for debugging and printing purposes). For example,
073         * rect43=[12,10] where rect43 is the name of the parent rectangle and
074         * [12,10] is the location.
075         */
076        @Override
077        public String toString() {
078            return variable().getName() + "=[" + getX() + "," + getY() + "]";
079        }
080    
081        /** Location's name. E.g., [12,10] where x=12 and y=10. */
082        @Override
083        public String getName() {
084            return "[" + getX() + "," + getY() + "]";
085        }
086    
087        /** Returns true if the given location intersects with this location */
088        public boolean hasIntersection(Location anotherLocation) {
089            if (getX() + (variable()).getWidth() <= anotherLocation.getX()) {
090                return false;
091            }
092            if (getY() + (variable()).getHeight() <= anotherLocation.getY()) {
093                return false;
094            }
095            if (anotherLocation.getX() + (anotherLocation.variable()).getWidth() <= getX()) {
096                return false;
097            }
098            if (anotherLocation.getY() + (anotherLocation.variable()).getHeight() <= getY()) {
099                return false;
100            }
101            return true;
102        }
103    }