Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / clipping / ClippingData.java @ 30938

History | View | Annotate | Download (14.8 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2007 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 */
19
package org.gvsig.rastertools.clipping;
20

    
21
import java.awt.geom.AffineTransform;
22
import java.awt.geom.Point2D;
23
import java.util.Observable;
24

    
25
/**
26
 * Datos necesarios para realizar un recorte.
27
 * 
28
 * 27/05/2008
29
 * @author Nacho Brodin nachobrodin@gmail.com
30
 */
31
public class ClippingData extends Observable {
32
        /**
33
         * N?mero de decimales a mostrar en visualizaci?n
34
         */
35
        public static final int  DEC              = 4;
36
        /**
37
         * Coordenadas reales y pixel
38
         */
39
        private Point2D          ulWc             = new Point2D.Double();
40
        private Point2D          lrWc             = new Point2D.Double();
41
        private Point2D          llWc             = new Point2D.Double();
42
        private Point2D          urWc             = new Point2D.Double();
43
        
44
        private Point2D          ulPx             = new Point2D.Double();
45
        private Point2D          lrPx             = new Point2D.Double();
46
        private Point2D          llPx             = new Point2D.Double();
47
        private Point2D          urPx             = new Point2D.Double();
48
        /**
49
         * Valores reales para el ancho, alto y tama?o de celda. Esto es necesario
50
         * porque en la caja de texto se guardan con decimales recortados y cuando se
51
         * pide el valor se devuelven completos.
52
         */
53
        private double           pxWidth          = 0;
54
        private double           pxHeight         = 0;
55
        /**
56
         * Relaci?n entre el ancho y alto en pixeles de la imagen
57
         */
58
        private double           ratioWidthHeight = 0;
59
 
60
        private AffineTransform  at               = null;
61
        
62
        /**
63
         * Inicializa los valores de ancho y alto de la imagen de salida a partir del ancho y alto en pixeles
64
         * de la de entrada. Esto solo es necesario al inicio ya que no tienen por que coincidir. Tambi?n inicializa
65
         * la relaci?n entre ancho y alto. La llamada a este m?todo notificar? a los observadores cambios en los
66
         * datos.
67
         */
68
        public void initSize() {
69
                pxHeight = (Math.ceil(getPxMaxY()) - Math.floor(getPxMinY()));
70
                pxWidth = (Math.ceil(getPxMaxX()) - Math.floor(getPxMinX()));
71
                ratioWidthHeight = (double) (pxWidth / pxHeight);
72
                updateObservers();
73
        }
74
        
75
        /**
76
         * Actualiza datos y llama al update de los observadores
77
         */
78
        public void updateObservers() {
79
                setChanged();
80
                notifyObservers();
81
        }
82
                
83
        /**
84
         * Inicializa los valores a cero. Esto se hace cuando la selecci?n es fuera del ?rea.
85
         */
86
        public void setOutOfArea() {
87
                ulWc = new Point2D.Double();
88
                lrWc = new Point2D.Double();
89
                urWc = new Point2D.Double();
90
                llWc = new Point2D.Double();
91
                
92
                ulPx = new Point2D.Double();
93
                lrPx = new Point2D.Double();
94
                llPx = new Point2D.Double();
95
                urPx = new Point2D.Double();
96
                pxHeight = pxWidth = 0;
97
        }
98
        
99
        /**
100
         * Obtiene la relaci?n entre el ancho y alto en p?xeles;
101
         * @return
102
         */
103
        public double getRatio() {
104
                return (double) (ratioWidthHeight);
105
        }
106
        
107
        /**
108
         * Obtiene el valor del ancho del raster de salida
109
         * @return
110
         */
111
        public double getPxWidth() {
112
                return pxWidth;
113
        }
114

    
115
        /**
116
         * Obtiene el valor del alto del raster de salida
117
         * @return
118
         */
119
        public double getPxHeight() {
120
                return pxHeight;
121
        }
122
        
123
        /**
124
         * Asigna el valor del ancho del raster de salida
125
         * @param pxw Ancho en p?xeles del raster de salida
126
         */
127
        public void setPxWidth(double pxw) {
128
                pxWidth = pxw;
129
        }
130

    
131
        /**
132
         * Asigna el valor del alto del raster de salida
133
         * @param pxh Alto en p?xeles del raster de salida
134
         */
135
        public void setPxHeight(double pxh) {
136
                pxHeight = pxh;
137
        }
138
        
139
        /**
140
         * Obtiene el tama?o de celda
141
         * @return
142
         */
143
        public double getCellSize() {
144
                return Math.abs(ulWc.getX() - lrWc.getX()) / pxWidth;
145
        }
146
        
147
        /**
148
         * Obtiene la coordenada de m?xima X en pixel.
149
         * @return Coordenada de m?xima X en pixel
150
         */
151
        public double getPxMaxX() {
152
                return Math.max(Math.max(ulPx.getX(), lrPx.getX()), Math.max(urPx.getX(), llPx.getX()));
153
        }
154

    
155
        /**
156
         * Obtiene la coordenada de m?xima Y en pixel.
157
         * @return Coordenada de m?xima Y en pixel
158
         */
159
        public double getPxMaxY() {
160
                return Math.max(Math.max(ulPx.getY(), lrPx.getY()), Math.max(urPx.getY(), llPx.getY()));
161
        }
162

    
163
        /**
164
         * Obtiene la coordenada de m?nima X en pixel.
165
         * @return Coordenada de m?nima X en pixel
166
         */
167
        public double getPxMinX() {
168
                return Math.min(Math.min(ulPx.getX(), lrPx.getX()), Math.min(llPx.getX(), urPx.getX()));
169
        }
170

    
171
        /**
172
         * Obtiene la coordenada de m?nima Y en pixel.
173
         * @return Coordenada de m?nima Y en pixel
174
         */
175
        public double getPxMinY() {
176
                return Math.min(Math.min(ulPx.getY(), lrPx.getY()), Math.min(urPx.getY(), llPx.getY()));
177
        }
178
        
179
        /**
180
         * Obtiene la coordenada de m?xima X real.
181
         * @return Coordenada de m?xima X real
182
         */
183
        public double getWcMaxX() {
184
                return Math.max(Math.max(ulWc.getX(), lrWc.getX()), Math.max(urWc.getX(), llWc.getX()));
185
        }
186

    
187
        /**
188
         * Obtiene la coordenada de m?xima Y real.
189
         * @return Coordenada de m?xima Y real
190
         */
191
        public double getWcMaxY() {
192
                return Math.max(Math.max(ulWc.getY(), lrWc.getY()), Math.max(urWc.getY(), llWc.getY()));
193
        }
194

    
195
        /**
196
         * Obtiene la coordenada de m?nima X real.
197
         * @return Coordenada de m?nima X real
198
         */
199
        public double getWcMinX() {
200
                return Math.min(Math.min(ulWc.getX(), lrWc.getX()), Math.min(llWc.getX(), urWc.getX()));
201
        }
202

    
203
        /**
204
         * Obtiene la coordenada de m?nima Y real.
205
         * @return Coordenada de m?nima Y real.
206
         */
207
        public double getWcMinY() {
208
                return Math.min(Math.min(ulWc.getY(), lrWc.getY()), Math.min(urWc.getY(), llWc.getY()));
209
        }
210

    
211
        /**
212
         * Obtiene la coordenada superior izquierda real en X.
213
         * @return Coordenada de m?xima X real.
214
         */
215
        public double getUlxWc() {
216
                return ulWc.getX();
217
        }
218

    
219
        /**
220
         * Obtiene la coordenada superior izquierda real en Y.
221
         * @return Coordenada de m?xima Y real
222
         */
223
        public double getUlyWc() {
224
                return ulWc.getY();
225
        }
226
        
227
        /**
228
         * Obtiene la coordenada inferior izquierda real en X.
229
         * @return Coordenada de m?xima X real.
230
         */
231
        public double getLlxWc() {
232
                return llWc.getX();
233
        }
234

    
235
        /**
236
         * Obtiene la coordenada inferior izquierda real en Y.
237
         * @return Coordenada de m?xima Y real
238
         */
239
        public double getLlyWc() {
240
                return llWc.getY();
241
        }
242

    
243
        /**
244
         * Obtiene la coordenada inferior derecha real en X.
245
         * @return Coordenada de m?nima X real
246
         */
247
        public double getLrxWc() {
248
                return lrWc.getX();
249
        }
250

    
251
        /**
252
         * Obtiene la coordenada inferior derecha real en Y.
253
         * @return Coordenada de m?nima Y real
254
         */
255
        public double getLryWc() {
256
                return lrWc.getY();
257
        }
258
        
259
        /**
260
         * Obtiene la coordenada superior derecha real en X.
261
         * @return Coordenada de m?nima X real
262
         */
263
        public double getUrxWc() {
264
                return urWc.getX();
265
        }
266

    
267
        /**
268
         * Obtiene la coordenada superior derecha real en Y.
269
         * @return Coordenada de m?nima Y real
270
         */
271
        public double getUryWc() {
272
                return urWc.getY();
273
        }
274
        
275
        /**
276
         * Obtiene la coordenada superior izquierda pixel en X.
277
         * @return Coordenada de m?xima X real.
278
         */
279
        public double getUlxPx() {
280
                return ulPx.getX();
281
        }
282

    
283
        /**
284
         * Obtiene la coordenada superior izquierda pixel en Y.
285
         * @return Coordenada de m?xima Y real
286
         */
287
        public double getUlyPx() {
288
                return ulPx.getY();
289
        }
290
        
291
        /**
292
         * Obtiene la coordenada inferior izquierda pixel en X.
293
         * @return Coordenada de m?xima X real.
294
         */
295
        public double getLlxPx() {
296
                return llPx.getX();
297
        }
298

    
299
        /**
300
         * Obtiene la coordenada inferior izquierda pixel en Y.
301
         * @return Coordenada de m?xima Y real
302
         */
303
        public double getLlyPx() {
304
                return llPx.getY();
305
        }
306

    
307
        /**
308
         * Obtiene la coordenada inferior derecha pixel en X.
309
         * @return Coordenada de m?nima X real
310
         */
311
        public double getLrxPx() {
312
                return lrPx.getX();
313
        }
314

    
315
        /**
316
         * Obtiene la coordenada inferior derecha pixel en Y.
317
         * @return Coordenada de m?nima Y real
318
         */
319
        public double getLryPx() {
320
                return lrPx.getY();
321
        }
322
        
323
        /**
324
         * Obtiene la coordenada superior derecha pixel en X.
325
         * @return Coordenada de m?nima X real
326
         */
327
        public double getUrxPx() {
328
                return urPx.getX();
329
        }
330

    
331
        /**
332
         * Obtiene la coordenada superior derecha pixel en Y.
333
         * @return Coordenada de m?nima Y real
334
         */
335
        public double getUryPx() {
336
                return urPx.getY();
337
        }
338
        
339
        /**
340
         * Ancho en coordenadas reales
341
         * @return
342
         */
343
        public double getWcWidth() {
344
                return Math.abs(getWcMaxX() - getWcMinX());
345
        }
346
        
347
        /**
348
         * Alto en coordenadas reales
349
         * @return
350
         */
351
        public double getWcHeight() {
352
                return Math.abs(getWcMaxY() - getWcMinY());
353
        }
354
        
355
        /**
356
         * Asigna las coordenadas del mundo real a partir de n?meros en coma flotante.
357
         * @param ul coordenada superior izquierda
358
         * @param lr coordenada inferior derecha
359
         * @param ll coordenada inferior izquierda
360
         * @param ur coordenada superior derecha
361
         */
362
        public void setCoorReal(Point2D ul, Point2D lr, Point2D ll, Point2D ur) {
363
                ulWc = ul;
364
                lrWc = lr;
365
                llWc = ll;
366
                urWc = ur;
367
        }
368
        
369
        /**
370
         * Asigna las coordenadas pixel a partir de n?meros en coma flotante.
371
         * @param ul coordenada superior izquierda
372
         * @param lr coordenada inferior derecha
373
         * @param ll coordenada inferior izquierda
374
         * @param ur coordenada superior derecha
375
         */
376
        public void setCoorPixel(Point2D ul, Point2D lr, Point2D ll, Point2D ur) {
377
                ulPx = ul;
378
                lrPx = lr;
379
                llPx = ll;
380
                urPx = ur;
381
        }
382
        
383
        /**
384
         * Asigna las coordenadas del mundo real a partir de n?meros en coma flotante.
385
         * @param minx coordenada m?nima de X
386
         * @param miny coordenada m?nima de Y
387
         * @param maxx coordenada m?xima de X
388
         * @param maxy coordenada m?xima de Y
389
         * @param dec N?mero de decimales a mostrar en la caja de texto
390
         */
391
        /*public void setCoorRealFromDouble(double ulx, double uly, double lrx, double lry) {
392
                ulWc = new Point2D.Double(ulx, uly);
393
                lrWc = new Point2D.Double(lrx, lry);
394
        }*/
395
        
396
        /**
397
         * Asigna las coordenadas pixel a partir de n?meros en coma flotante.
398
         * @param minx coordenada m?nima de X
399
         * @param miny coordenada m?nima de Y
400
         * @param maxx coordenada m?xima de X
401
         * @param maxy coordenada m?xima de Y
402
         * @param dec N?mero de decimales a mostrar en la caja de texto
403
         */
404
        /*public void setCoorPixelFromDouble(double minx, double miny, double maxx, double maxy) {
405
                ulPx = new Point2D.Double(minx, miny);
406
                lrPx = new Point2D.Double(maxx, maxy);
407
        }*/
408
        
409
        /**
410
         * Asigna la coordenada X de la esquina superior izquierda en coordenadas reales
411
         * @param ulx
412
         */
413
        public void setUlxWc(double ulx) {
414
                ulWc = new Point2D.Double(ulx, ulWc.getY());
415
        }
416
        
417
        /**
418
         * Asigna la coordenada X de la esquina inferior izquierda en coordenadas reales
419
         * @param ulx
420
         */
421
        public void setLlxWc(double llx) {
422
                llWc = new Point2D.Double(llx, llWc.getY());
423
        }
424
        
425
        /**
426
         * Asigna la coordenada Y de la esquina superior izquierda en coordenadas reales
427
         * @param uly
428
         */
429
        public void setUlyWc(double uly) {
430
                ulWc = new Point2D.Double(ulWc.getX(), uly);
431
        }
432
        
433
        /**
434
         * Asigna la coordenada Y de la esquina superior derecha en coordenadas reales
435
         * @param uly
436
         */
437
        public void setUryWc(double ury) {
438
                urWc = new Point2D.Double(urWc.getX(), ury);
439
        }
440
        
441
        /**
442
         * Asigna la coordenada X de la esquina superior izquierda en p?xeles
443
         * @param ulx
444
         */
445
        public void setUlxPx(double ulx) {
446
                ulPx = new Point2D.Double(ulx, ulPx.getY());
447
        }
448
        
449
        /**
450
         * Asigna la coordenada X de la esquina inferior izquierda en p?xeles
451
         * @param llx
452
         */
453
        public void setLlxPx(double llx) {
454
                llPx = new Point2D.Double(llx, llPx.getY());
455
        }
456
        
457
        /**
458
         * Asigna la coordenada Y de la esquina superior izquierda en p?xeles
459
         * @param uly
460
         */
461
        public void setUlyPx(double uly) {
462
                ulPx = new Point2D.Double(ulPx.getX(), uly);
463
        }
464
        
465
        /**
466
         * Asigna la coordenada Y de la esquina superior derecha en p?xeles
467
         * @param ury
468
         */
469
        public void setUryPx(double ury) {
470
                urPx = new Point2D.Double(urPx.getX(), ury);
471
        }
472

    
473
        /**
474
         * Asigna la coordenada X de la esquina inferior derecha en coordenadas reales
475
         * @param lrx
476
         */
477
        public void setLrxWc(double lrx) {
478
                lrWc = new Point2D.Double(lrx, lrWc.getY());
479
        }
480
        
481
        /**
482
         * Asigna la coordenada X de la esquina superior derecha en coordenadas reales
483
         * @param urx
484
         */
485
        public void setUrxWc(double urx) {
486
                urWc = new Point2D.Double(urx, urWc.getY());
487
        }
488
        
489
        /**
490
         * Asigna la coordenada Y de la esquina inferior derecha en coordenadas reales
491
         * @param lry
492
         */
493
        public void setLryWc(double lry) {
494
                lrWc = new Point2D.Double(lrWc.getX(), lry);
495
        }
496
        
497
        /**
498
         * Asigna la coordenada Y de la esquina inferior izquierda en coordenadas reales
499
         * @param lly
500
         */
501
        public void setLlyWc(double lly) {
502
                llWc = new Point2D.Double(llWc.getX(), lly);
503
        }
504
        
505
        /**
506
         * Asigna la coordenada X de la esquina inferior derecha en p?xeles
507
         * @param ulx
508
         */
509
        public void setLrxPx(double lrx) {
510
                lrPx = new Point2D.Double(lrx, lrPx.getY());
511
        }
512
        
513
        /**
514
         * Asigna la coordenada X de la esquina superior derecha en p?xeles
515
         * @param ulx
516
         */
517
        public void setUrxPx(double urx) {
518
                urPx = new Point2D.Double(urx, urPx.getY());
519
        }
520
        
521
        /**
522
         * Asigna la coordenada Y de la esquina inferior derecha en p?xeles
523
         * @param uly
524
         */
525
        public void setLryPx(double lry) {
526
                lrPx = new Point2D.Double(lrPx.getX(), lry);
527
        }
528
        
529
        /**
530
         * Asigna la coordenada Y de la esquina inferior derecha en p?xeles
531
         * @param uly
532
         */
533
        public void setLlyPx(double lly) {
534
                llPx = new Point2D.Double(llPx.getX(), lly);
535
        }
536
        
537
        /**
538
         * Asigna la matriz de transformaci?n
539
         * @param at AffineTransform
540
         */
541
        public void setAffineTransform(AffineTransform at) {
542
                this.at = at;
543
        }
544

    
545
        /**
546
         * Obtiene las coordenadas del mundo real para la petici?n de recorte
547
         * @return double[]
548
         */
549
        public double[] getWcCoordinatesToClip() {
550
                Point2D ul = new Point2D.Double(getPxMinX(), getPxMinY());
551
                Point2D lr = new Point2D.Double(getPxMaxX(), getPxMaxY());
552
                at.transform(ul, ul);
553
                at.transform(lr, lr);
554
                return new double[]{ul.getX(), ul.getY(), lr.getX(), lr.getY()};
555
        }
556
        
557
        /**
558
         * Obtiene el tama?o en pixeles de la imagen de la petici?n de recorte
559
         * @return double[]
560
         */
561
        public double[] getPxSizeToClip() {
562
                return new double[]{(getPxMaxX() - getPxMinX()), (getPxMaxY() - getPxMinY())};
563
        }
564
 
565
        /*
566
         * (non-Javadoc)
567
         * @see java.lang.Object#clone()
568
         */
569
        public Object clone() {
570
                ClippingData data = new ClippingData();
571
                data.ulWc = (Point2D)this.ulWc.clone();
572
                data.llWc = (Point2D)this.llWc.clone();
573
                data.lrWc = (Point2D)this.lrWc.clone();
574
                data.urWc = (Point2D)this.urWc.clone();
575
                data.ulPx = (Point2D)this.ulPx.clone();
576
                data.llPx = (Point2D)this.llPx.clone();
577
                data.lrPx = (Point2D)this.lrPx.clone();
578
                data.urPx = (Point2D)this.urPx.clone();
579
                data.pxWidth = this.pxWidth;
580
                data.pxHeight = this.pxHeight;
581
                data.ratioWidthHeight = this.ratioWidthHeight;
582
                data.at = (AffineTransform)this.at.clone();
583
                return data;
584
        }
585
}