001 package ifs.example.rpp;
002
003 import ifs.model.*;
004 import ifs.util.*;
005 import java.util.*;
006
007 /**
008 * Rectangle (variable).
009 * It encodes the name, width and height of the rectangle, minimal and maximal position of the rectangle.
010 * It also contains an information about prohibited X and Y coordinate (for MPP).
011 *
012 * @author <a href="mailto:muller@ktiml.mff.cuni.cz">Tomáš Müller</a>
013 * @version 1.0
014 */
015 public class Rectangle extends Variable {
016 private static org.apache.log4j.Logger sLogger = org.apache.log4j.Logger.getLogger(Rectangle.class);
017 private String iName;
018 private int iMinX, iMaxX, iMinY, iMaxY;
019 private int iHeight, iWidth;
020 private int iProhibitedX = -1, iProhibitedY = -1;
021
022 /**
023 * Constructor.
024 * @param name variable's name
025 * @param width width of the rectangle
026 * @param height height of the rectangle
027 * @param minX minimal X-coordinate
028 * @param maxX maximal X-coordinate
029 * @param minY minimal Y-coordinate
030 * @param maxY maximal Y-coordinate
031 * @param initialLocation initial location (null if none)
032 */
033 public Rectangle(String name, int width, int height, int minX, int maxX, int minY, int maxY,Location initialLocation) {
034 super(initialLocation);
035 iName = name;
036 iWidth = width;
037 iHeight = height;
038 iMinX = minX;
039 iMaxX = maxX;
040 iMinY = minY;
041 iMaxY = maxY;
042 setValues(computeValues());
043 }
044
045 /**
046 * Prohibits given X and Y coordinates (for MPP).
047 */
048 public void setProhibited(int x, int y) {
049 iProhibitedX = x;
050 iProhibitedY = y;
051 setValues(computeValues());
052 if (getInitialAssignment()!=null && !values().contains(getInitialAssignment()))
053 setInitialAssignment(null);
054 }
055
056 /**
057 * Prohibits given initial location (for MPP).
058 */
059 public void setProhibited() {
060 if (getInitialAssignment()==null) return;
061 setProhibited(((Location)getInitialAssignment()).getX(),((Location)getInitialAssignment()).getY());
062 }
063
064 /**
065 * Returns true if the given location is prohibited. This means that either X or Y equals to the prohibited X or Y coordinate respectively.
066 */
067 public boolean isProhibited(int x, int y) {
068 return (iProhibitedX == x || iProhibitedY == y);
069 }
070
071 public int getProhibitedX() { return iProhibitedX; }
072 public int getProhibitedY() { return iProhibitedY; }
073 public int getMinX() { return iMinX; }
074 public int getMaxX() { return iMaxX; }
075 public int getMinY() { return iMinY; }
076 public int getMaxY() { return iMaxY; }
077
078 /** Returns width of the rectangle */
079 public int getWidth() {
080 return iWidth;
081 }
082
083 /** Returns height of the rectangle */
084 public int getHeight() {
085 return iHeight;
086 }
087
088 /** Returns name of the rectangle */
089 public String getName() {
090 return iName;
091 }
092
093 /** Set the bounds (minimal and maximal values of X and Y coordinates). */
094 public void setBounds(int minX, int maxX, int minY, int maxY) {
095 iMinX = minX;
096 iMaxX = maxX;
097 iMinY = minY;
098 iMaxY = maxY;
099 if (getInitialAssignment() != null && !values().contains(getInitialAssignment()))
100 setInitialAssignment(null);
101 }
102
103 private Vector computeValues() {
104 Vector locations = new FastVector((iMaxX - iMinX) * (iMaxY - iMinY));
105 for (int x = iMinX; x <= iMaxX; x++) {
106 for (int y = iMinY; y <= iMaxY; y++) {
107 if (!isProhibited(x, y)) {
108 Value val = new Location(this, x, y);
109 locations.addElement(val);
110 if (getInitialAssignment() != null && getInitialAssignment().equals(val))
111 setInitialAssignment(val);
112 if (getBestAssignment() != null && getBestAssignment().equals(val))
113 setBestAssignment(val);
114 }
115 }
116 }
117 return locations;
118 }
119
120 /** String representation (for printing and debugging purposes) */
121 public String toString() {
122 return "Rectangle{name='" + getName() + "', size=[" + getWidth() + "," + getHeight() + "], bounds=[" + iMinX + ".." + iMaxX + "," + iMinY + ".." + iMaxY + "], super=" + super.toString() + "}";
123 }
124
125 /** Compares two rectangles (based on rectangle names)*/
126 public boolean equals(Object o) {
127 return ((Rectangle)o).getName().equals(getName());
128 }
129 }