001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/graphics/transformation/WorldToScreenTransform.java $
002 /*----------------------------------------------------------------------------
003 This file is part of deegree, http://deegree.org/
004 Copyright (C) 2001-2009 by:
005 Department of Geography, University of Bonn
006 and
007 lat/lon GmbH
008
009 This library is free software; you can redistribute it and/or modify it under
010 the terms of the GNU Lesser General Public License as published by the Free
011 Software Foundation; either version 2.1 of the License, or (at your option)
012 any later version.
013 This library is distributed in the hope that it will be useful, but WITHOUT
014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
016 details.
017 You should have received a copy of the GNU Lesser General Public License
018 along with this library; if not, write to the Free Software Foundation, Inc.,
019 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020
021 Contact information:
022
023 lat/lon GmbH
024 Aennchenstr. 19, 53177 Bonn
025 Germany
026 http://lat-lon.de/
027
028 Department of Geography, University of Bonn
029 Prof. Dr. Klaus Greve
030 Postfach 1147, 53001 Bonn
031 Germany
032 http://www.geographie.uni-bonn.de/deegree/
033
034 e-mail: info@deegree.org
035 ----------------------------------------------------------------------------*/
036
037 package org.deegree.graphics.transformation;
038
039 import org.deegree.model.spatialschema.Envelope;
040 import org.deegree.model.spatialschema.GeometryFactory;
041 import org.deegree.model.spatialschema.Position;
042
043 /**
044 * the class <code>WorldToScreenTransform</code> implements <code>GeoTransformInterface</code>
045 * and defines a transformation to a linear coordinat system with its orgin on top/left. this can be
046 * used for realising a screen mapping of geometries.
047 *
048 * @author Andreas Poth poth@lat-lon.de
049 * @version 28.12.2000
050 */
051
052 public class WorldToScreenTransform implements GeoTransform {
053
054 private double qx = 0;
055
056 private double qy = 0;
057
058 private Envelope sourceRect = null;
059
060 private Envelope destRect = null;
061
062 /**
063 * constructor
064 *
065 * initialices the transfromation rectangles with unique values (origin 0/0; widht 1; height 1)
066 */
067 public WorldToScreenTransform() {
068 setSourceRect( 0, 0, 1, 1 );
069 setDestRect( 0, 0, 1, 1 );
070 }
071
072 /**
073 * constructor
074 *
075 * initialices the transformation rectangle using the submitted source- and destination
076 * rectangle.
077 *
078 * @param sourceRect
079 * is the boundary of the source geometry.
080 * @param destRect
081 * is the boundary of the destination rectangle (for example a region on the screen)
082 */
083 public WorldToScreenTransform( Envelope sourceRect, Envelope destRect ) {
084 setSourceRect( sourceRect );
085 setDestRect( destRect );
086 }
087
088 /**
089 * constrctor
090 *
091 * @param sourceXMin
092 * minimum x-coordinate (source system) of the map.
093 * @param sourceYMin
094 * minimum y-coordinate (source system) of the map.
095 * @param sourceXMax
096 * maximum x-coordinate (source system) of the map.
097 * @param sourceYMax
098 * maximum y-coordinate (source system) of the map.
099 * @param destXMin
100 * minimum x-coordinate (destination system) of the map.
101 * @param destYMin
102 * minimum y-coordinate (destination system) of the map.
103 * @param destXMax
104 * maximum x-coordinate (destination system) of the map.
105 * @param destYMax
106 * maximum y-coordinate (destination system) of the map.
107 */
108 public WorldToScreenTransform( double sourceXMin, double sourceYMin, double sourceXMax, double sourceYMax,
109 double destXMin, double destYMin, double destXMax, double destYMax ) {
110 setSourceRect( sourceXMin, sourceYMin, sourceXMax, sourceYMax );
111 setDestRect( destXMin, destYMin, destXMax, destYMax );
112 }
113
114 /**
115 * sets the source rectangle
116 *
117 * @param rect
118 * is the boundary of the source geometry.
119 *
120 */
121 public void setSourceRect( Envelope rect ) {
122
123 sourceRect = rect;
124
125 if ( ( sourceRect != null ) && ( destRect != null ) ) {
126 calculateQX();
127 calculateQY();
128 }
129 }
130
131 /**
132 * sets the source rectangle
133 *
134 * @param xMin
135 * minimum x-coordinate (source system) of the map.
136 * @param yMin
137 * minimum y-coordinate (source system) of the map.
138 * @param xMax
139 * maximum x-coordinate (source system) of the map.
140 * @param yMax
141 * maximum y-coordinate (source system) of the map.
142 */
143 public void setSourceRect( double xMin, double yMin, double xMax, double yMax ) {
144
145 double dum = 0;
146
147 if ( xMin > xMax ) {
148 dum = xMax;
149 xMax = xMin;
150 xMin = dum;
151 }
152
153 if ( yMin > yMax ) {
154 dum = yMax;
155 yMax = yMin;
156 yMin = dum;
157 }
158
159 sourceRect = GeometryFactory.createEnvelope( xMin, yMin, xMax, yMax, null );
160
161 if ( destRect != null ) {
162 calculateQX();
163 calculateQY();
164 }
165
166 }
167
168 /**
169 *
170 */
171 public Envelope getSourceRect() {
172 return sourceRect;
173 }
174
175 /**
176 * sets the destination rectangle.
177 *
178 * @param rect
179 * is the boundary of the destination rectangle (for example a region on the screen)
180 *
181 */
182 public void setDestRect( Envelope rect ) {
183 destRect = rect;
184 if ( ( sourceRect != null ) && ( destRect != null ) ) {
185 calculateQX();
186 calculateQY();
187 }
188 }
189
190 /**
191 * sets the destination rectangle
192 *
193 * @param xMin
194 * minimum x-coordinate (destination system) of the map.
195 * @param yMin
196 * minimum y-coordinate (destination system) of the map.
197 * @param xMax
198 * maximum x-coordinate (destination system) of the map.
199 * @param yMax
200 * maximum y-coordinate (destination system) of the map.
201 */
202 public void setDestRect( double xMin, double yMin, double xMax, double yMax ) {
203
204 double dum = 0;
205
206 if ( xMin > xMax ) {
207 dum = xMax;
208 xMax = xMin;
209 xMin = dum;
210 }
211
212 if ( yMin > yMax ) {
213 dum = yMax;
214 yMax = yMin;
215 yMin = dum;
216 }
217
218 destRect = GeometryFactory.createEnvelope( xMin, yMin, xMax, yMax, null );
219
220 if ( sourceRect != null ) {
221 calculateQX();
222 calculateQY();
223 }
224
225 }
226
227 /**
228 *
229 */
230 public Envelope getDestRect() {
231 return destRect;
232 }
233
234 /**
235 * executes a coordinat transformation for the submitted x-coordinate of the source coordinat
236 * system.
237 *
238 * @param xsource
239 * x-coordinate of a point in the source coordinate system.
240 * @return the x-coordinate of the submitted value in the destination coordinate system.
241 */
242 public double getDestX( double xsource ) {
243 return destRect.getMin().getX() + ( xsource - sourceRect.getMin().getX() ) * qx;
244 }
245
246 /**
247 * executes a coordinat transformation for the submitted y-coordinate of the source coordinat
248 * system.
249 *
250 * @param ysource
251 * y-coordinate of a point in the source coordinate system.
252 * @return the y-coordinate of the submitted value in the destination coordinate system.
253 */
254 public double getDestY( double ysource ) {
255 return destRect.getMin().getY() + destRect.getHeight() - ( ysource - sourceRect.getMin().getY() ) * qy;
256 }
257
258 /**
259 * executes a coordinat transformation for the submitted point of the source coordinat system.
260 *
261 * @param point
262 * in the source coordinate system.
263 * @return the location of the submitted point in the destination coordinate system.
264 */
265 public Position getDestPoint( Position point ) {
266 double x = getDestX( point.getX() );
267 double y = getDestY( point.getY() );
268 return GeometryFactory.createPosition( x, y );
269 }
270
271 /**
272 * executes a coordinat transformation for the submitted x-coordinate of the destination
273 * coordinate system.
274 *
275 * @param xdest
276 * x-coordinate of a point in the destination coordinate system.
277 * @return the x-coordinate of the submitted value in the source coordinate system.
278 */
279 public double getSourceX( double xdest ) {
280 return ( xdest - destRect.getMin().getX() ) / qx + sourceRect.getMin().getX();
281 }
282
283 /**
284 * executes a coordinat transformation for the submitted y-coordinate of the destination
285 * coordinate system.
286 *
287 * @param ydest
288 * y-coordinate of a point in the destination coordinate system.
289 * @return the y-coordinate of the submitted value in the source coordinate system.
290 */
291 public double getSourceY( double ydest ) {
292 double d = ( destRect.getHeight() - ( ydest - destRect.getMin().getY() ) ) / qy + sourceRect.getMin().getY();
293 return d;
294
295 }
296
297 /**
298 * executes a coordinat transformation for the submitted point of the destination coordinate
299 * system.
300 *
301 * @param point
302 * in the destination coordinate system.
303 * @return the location of the submitted point in the source coordinate system.
304 */
305 public Position getSourcePoint( Position point ) {
306 double x = getSourceX( point.getX() );
307 double y = getSourceY( point.getY() );
308 return GeometryFactory.createPosition( x, y );
309 }
310
311 /**
312 * calculates the relation between the width of the destination and the source coordinate
313 * system.
314 */
315 protected void calculateQX() {
316 qx = destRect.getWidth() / sourceRect.getWidth();
317 }
318
319 /**
320 * calculates the relation between the height of the destination and the source coordinate
321 * system.
322 */
323 protected void calculateQY() {
324 qy = destRect.getHeight() / sourceRect.getHeight();
325 }
326
327 }