001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/graphics/optimizers/LabelChoice.java $
002 /*---------------- FILE HEADER ------------------------------------------
003
004 This file is part of deegree.
005 Copyright (C) 2001-2008 by:
006 EXSE, Department of Geography, University of Bonn
007 http://www.giub.uni-bonn.de/deegree/
008 lat/lon GmbH
009 http://www.lat-lon.de
010
011 This library is free software; you can redistribute it and/or
012 modify it under the terms of the GNU Lesser General Public
013 License as published by the Free Software Foundation; either
014 version 2.1 of the License, or (at your option) any later version.
015
016 This library is distributed in the hope that it will be useful,
017 but WITHOUT ANY WARRANTY; without even the implied warranty of
018 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
019 Lesser General Public License for more details.
020
021 You should have received a copy of the GNU Lesser General Public
022 License along with this library; if not, write to the Free Software
023 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024
025 Contact:
026
027 Andreas Poth
028 lat/lon GmbH
029 Aennchenstr. 19
030 53115 Bonn
031 Germany
032 E-Mail: poth@lat-lon.de
033
034 Prof. Dr. Klaus Greve
035 Department of Geography
036 University of Bonn
037 Meckenheimer Allee 166
038 53115 Bonn
039 Germany
040 E-Mail: greve@giub.uni-bonn.de
041
042 ---------------------------------------------------------------------------*/
043 package org.deegree.graphics.optimizers;
044
045 import org.deegree.graphics.displayelements.Label;
046 import org.deegree.graphics.displayelements.LabelDisplayElement;
047
048 /**
049 * @version $Revision: 9340 $
050 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
051 * @author last edited by: $Author: apoth $
052 *
053 * @version 1.0. $Revision: 9340 $, $Date: 2007-12-27 13:32:12 +0100 (Do, 27 Dez 2007) $
054 *
055 * @since 2.0
056 */
057
058 public class LabelChoice {
059
060 /**
061 * LabelDisplayElement that this LabelChoice belongs to
062 */
063 private LabelDisplayElement element;
064
065
066 /**
067 * index of the currently selected Label
068 */
069 private int selected;
070
071 /**
072 *candidates of Labels
073 */
074 private Label[] candidates;
075
076
077 // quality of each Label
078 private float [] qualities;
079
080 // boundingbox of all contained labels
081 private int maxX;
082 // boundingbox of all contained labels
083 private int maxY;
084 // boundingbox of all contained labels
085 private int minX;
086 // boundingbox of all contained labels
087 private int minY;
088
089 /**
090 * @param element
091 * @param candidates
092 * @param qualities
093 * @param selected
094 * @param maxX
095 * @param maxY
096 * @param minX
097 * @param minY
098 */
099 public LabelChoice (LabelDisplayElement element, Label [] candidates,
100 float [] qualities, int selected,
101 int maxX, int maxY, int minX, int minY) {
102 this.element = element;
103 this.candidates = candidates;
104 this.qualities = qualities;
105 this.selected = selected;
106 this.maxX = maxX;
107 this.maxY = maxY;
108 this.minX = minX;
109 this.minY = minY;
110 }
111
112 // public void paint (Graphics2D g) {
113 // for (int i = 0; i < candidates.length; i++) {
114 // ((Label) candidates [i]).paintBoundaries(g);
115 // }
116 // }
117
118 /**
119 *
120 */
121 public void selectLabelRandomly () {
122 selected = (int) (Math.random () * (candidates.length - 1) + 0.5);
123 }
124
125 /**
126 * @param selected
127 *
128 */
129 public void setSelected(int selected) {
130 this.selected = selected;
131 }
132
133 /**
134 * @return
135 *
136 */
137 public int getSelected() {
138 return selected;
139 }
140
141
142 /**
143 * @return
144 */
145 public float getQuality () {
146 return qualities [selected];
147 }
148
149 /**
150 * @return
151 */
152 public Label getSelectedLabel () {
153 return candidates [selected];
154 }
155
156 /**
157 * @return
158 *
159 */
160 public LabelDisplayElement getElement() {
161 return element;
162 }
163
164 /**
165 * @return
166 *
167 */
168 public int getMaxX() {
169 return maxX;
170 }
171
172 /**
173 * @return
174 *
175 */
176 public int getMaxY() {
177 return maxY;
178 }
179
180 /**
181 * @return
182 *
183 */
184 public int getMinX() {
185 return minX;
186 }
187
188 /**
189 * @return
190 *
191 */
192 public int getMinY() {
193 return minY;
194 }
195
196 /**
197 * Determines if the <tt>LabelChoice<tt> can intersect another
198 * <tt>LabelChoice</tt> by any chance, i.e. there are two
199 * <tt>Labels</tt> from each choice that intersect.
200 * <p>
201 * @param that LabelChoice to test
202 * @return true if the LabelChoices can intersect
203 */
204 public boolean intersects (LabelChoice that) {
205
206 int west1 = getMinX ();
207 int south1 = getMinY ();
208 int east1 = getMaxX ();
209 int north1 = getMaxY ();
210
211 int west2 = that.getMinX();
212 int south2 = that.getMinY();
213 int east2 = that.getMaxX();
214 int north2 = that.getMaxY();
215
216 // special cases: one box lays completly inside the other one
217 if ( ( west1 <= west2 ) && ( south1 <= south2 ) && ( east1 >= east2 ) &&
218 ( north1 >= north2 ) ) {
219 return true;
220 }
221 if ( ( west1 >= west2 ) && ( south1 >= south2 ) && ( east1 <= east2 ) &&
222 ( north1 <= north2 ) ) {
223 return true;
224 }
225 // in any other case of intersection, at least one line of the BBOX has
226 // to cross a line of the other BBOX
227 // check western boundary of box 1
228 // "touching" boxes must not intersect
229 if ( ( west1 >= west2 ) && ( west1 < east2 ) ) {
230 if ( ( south1 <= south2 ) && ( north1 > south2 ) ) {
231 return true;
232 }
233
234 if ( ( south1 < north2 ) && ( north1 >= north2 ) ) {
235 return true;
236 }
237 }
238 // check eastern boundary of box 1
239 // "touching" boxes must not intersect
240 if ( ( east1 > west2 ) && ( east1 <= east2 ) ) {
241 if ( ( south1 <= south2 ) && ( north1 > south2 ) ) {
242 return true;
243 }
244
245 if ( ( south1 < north2 ) && ( north1 >= north2 ) ) {
246 return true;
247 }
248 }
249 // check southern boundary of box 1
250 // "touching" boxes must not intersect
251 if ( ( south1 >= south2 ) && ( south1 < north2 ) ) {
252 if ( ( west1 <= west2 ) && ( east1 > west2 ) ) {
253 return true;
254 }
255
256 if ( ( west1 < east2 ) && ( east1 >= east2 ) ) {
257 return true;
258 }
259 }
260 // check northern boundary of box 1
261 // "touching" boxes must not intersect
262 if ( ( north1 > south2 ) && ( north1 <= north2 ) ) {
263 if ( ( west1 <= west2 ) && ( east1 > west2 ) ) {
264 return true;
265 }
266
267 if ( ( west1 < east2 ) && ( east1 >= east2 ) ) {
268 return true;
269 }
270 }
271 return false;
272 }
273
274 /**
275 * @see java.lang.Object#toString()
276 */
277 public String toString () {
278 if (candidates.length > 0) {
279 return candidates [0].toString ();
280 }
281 return "empty";
282 }
283 }