Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / trunk / org.gvsig.raster.tools / org.gvsig.raster.tools.app.basic / src / main / java / org / gvsig / raster / tools / app / basic / tool / clip / ClippingData.java @ 2480

History | View | Annotate | Download (15.3 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
*
3
* Copyright (C) 2007-2008 Infrastructures and Transports Department
4
* of the Valencian Government (CIT)
5
* 
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version 2
9
* of the License, or (at your option) any later version.
10
* 
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
* GNU General Public License for more details.
15
* 
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
19
* MA  02110-1301, USA.
20
* 
21
*/
22
package org.gvsig.raster.tools.app.basic.tool.clip;
23

    
24
import java.awt.geom.AffineTransform;
25
import java.awt.geom.Point2D;
26
import java.util.Observable;
27

    
28
/**
29
 * Datos necesarios para realizar un recorte.
30
 *
31
 * 27/05/2008
32
 * @author Nacho Brodin nachobrodin@gmail.com
33
 */
34
public class ClippingData extends Observable {
35
        /**
36
         * N?mero de decimales a mostrar en visualizaci?n
37
         */
38
        public static final int  DEC              = 4;
39
        /**
40
         * Coordenadas reales y pixel
41
         */
42
        private Point2D          ulWc             = new Point2D.Double();
43
        private Point2D          lrWc             = new Point2D.Double();
44
        private Point2D          llWc             = new Point2D.Double();
45
        private Point2D          urWc             = new Point2D.Double();
46

    
47
        private Point2D          ulPx             = new Point2D.Double();
48
        private Point2D          lrPx             = new Point2D.Double();
49
        private Point2D          llPx             = new Point2D.Double();
50
        private Point2D          urPx             = new Point2D.Double();
51
        /**
52
         * Valores reales para el ancho, alto y tama?o de celda. Esto es necesario
53
         * porque en la caja de texto se guardan con decimales recortados y cuando se
54
         * pide el valor se devuelven completos.
55
         */
56
        private double           pxWidth          = 0;
57
        private double           pxHeight         = 0;
58
        /**
59
         * Relaci?n entre el ancho y alto en pixeles de la imagen
60
         */
61
        private double           ratioWidthHeight = 0;
62

    
63
        private AffineTransform  at               = null;
64

    
65
        /**
66
         * Inicializa los valores de ancho y alto de la imagen de salida a partir del ancho y alto en pixeles
67
         * de la de entrada. Esto solo es necesario al inicio ya que no tienen por que coincidir. Tambi?n inicializa
68
         * la relaci?n entre ancho y alto. La llamada a este m?todo notificar? a los observadores cambios en los
69
         * datos.
70
         */
71
        public void initSize() {
72
                pxHeight = (Math.floor(getPxMaxY()) - Math.floor(getPxMinY())) + 1;
73
                pxWidth = (Math.floor(getPxMaxX()) - Math.floor(getPxMinX())) + 1;
74
                ratioWidthHeight = (double) (pxWidth / pxHeight);
75
                updateObservers();
76
        }
77

    
78
        /**
79
         * Actualiza datos y llama al update de los observadores
80
         */
81
        public void updateObservers() {
82
                setChanged();
83
                notifyObservers();
84
        }
85

    
86
        /**
87
         * Inicializa los valores a cero. Esto se hace cuando la selecci?n es fuera del ?rea.
88
         */
89
        public void setOutOfArea() {
90
                ulWc = new Point2D.Double();
91
                lrWc = new Point2D.Double();
92
                urWc = new Point2D.Double();
93
                llWc = new Point2D.Double();
94

    
95
                ulPx = new Point2D.Double();
96
                lrPx = new Point2D.Double();
97
                llPx = new Point2D.Double();
98
                urPx = new Point2D.Double();
99
                pxHeight = pxWidth = 0;
100
        }
101

    
102
        /**
103
         * Obtiene la relaci?n entre el ancho y alto en p?xeles;
104
         * @return
105
         */
106
        public double getRatio() {
107
                return getWcWidth() / getWcHeight();
108
                //return (double) (ratioWidthHeight);
109
        }
110

    
111
        /**
112
         * Obtiene el valor del ancho del raster de salida
113
         * @return
114
         */
115
        public double getPxWidth() {
116
                return pxWidth;
117
        }
118

    
119
        /**
120
         * Obtiene el valor del alto del raster de salida
121
         * @return
122
         */
123
        public double getPxHeight() {
124
                return pxHeight;
125
        }
126

    
127
        /**
128
         * Asigna el valor del ancho del raster de salida
129
         * @param pxw Ancho en p?xeles del raster de salida
130
         */
131
        public void setPxWidth(double pxw) {
132
                pxWidth = pxw;
133
        }
134

    
135
        /**
136
         * Asigna el valor del alto del raster de salida
137
         * @param pxh Alto en p?xeles del raster de salida
138
         */
139
        public void setPxHeight(double pxh) {
140
                pxHeight = pxh;
141
        }
142

    
143
        /**
144
         * Obtiene el tama?o de celda
145
         * @return
146
         */
147
        public double getCellSize() {
148
                if(((lrPx.getX() - ulPx.getX() + 1) == getPxWidth()) && 
149
                   ((lrPx.getY() - ulPx.getY() + 1) == getPxHeight()))
150
                        return at != null ? at.getScaleX() : 0;
151
                else
152
                        return Math.abs(ulWc.getX() - lrWc.getX()) / pxWidth;
153
        }
154

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

    
163
        /**
164
         * Obtiene la coordenada de m?xima Y en pixel.
165
         * @return Coordenada de m?xima Y en pixel
166
         */
167
        public double getPxMaxY() {
168
                return Math.max(Math.max(ulPx.getY(), lrPx.getY()), Math.max(urPx.getY(), llPx.getY()));
169
        }
170

    
171
        /**
172
         * Obtiene la coordenada de m?nima X en pixel.
173
         * @return Coordenada de m?nima X en pixel
174
         */
175
        public double getPxMinX() {
176
                return Math.min(Math.min(ulPx.getX(), lrPx.getX()), Math.min(llPx.getX(), urPx.getX()));
177
        }
178

    
179
        /**
180
         * Obtiene la coordenada de m?nima Y en pixel.
181
         * @return Coordenada de m?nima Y en pixel
182
         */
183
        public double getPxMinY() {
184
                return Math.min(Math.min(ulPx.getY(), lrPx.getY()), Math.min(urPx.getY(), llPx.getY()));
185
        }
186

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

    
195
        /**
196
         * Obtiene la coordenada de m?xima Y real.
197
         * @return Coordenada de m?xima Y real
198
         */
199
        public double getWcMaxY() {
200
                return Math.max(Math.max(ulWc.getY(), lrWc.getY()), Math.max(urWc.getY(), llWc.getY()));
201
        }
202

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

    
211
        /**
212
         * Obtiene la coordenada de m?nima Y real.
213
         * @return Coordenada de m?nima Y real.
214
         */
215
        public double getWcMinY() {
216
                return Math.min(Math.min(ulWc.getY(), lrWc.getY()), Math.min(urWc.getY(), llWc.getY()));
217
        }
218

    
219
        /**
220
         * Obtiene la coordenada superior izquierda real en X.
221
         * @return Coordenada de m?xima X real.
222
         */
223
        public double getUlxWc() {
224
                return ulWc.getX();
225
        }
226

    
227
        /**
228
         * Obtiene la coordenada superior izquierda real en Y.
229
         * @return Coordenada de m?xima Y real
230
         */
231
        public double getUlyWc() {
232
                return ulWc.getY();
233
        }
234

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

    
243
        /**
244
         * Obtiene la coordenada inferior izquierda real en Y.
245
         * @return Coordenada de m?xima Y real
246
         */
247
        public double getLlyWc() {
248
                return llWc.getY();
249
        }
250

    
251
        /**
252
         * Obtiene la coordenada inferior derecha real en X.
253
         * @return Coordenada de m?nima X real
254
         */
255
        public double getLrxWc() {
256
                return lrWc.getX();
257
        }
258

    
259
        /**
260
         * Obtiene la coordenada inferior derecha real en Y.
261
         * @return Coordenada de m?nima Y real
262
         */
263
        public double getLryWc() {
264
                return lrWc.getY();
265
        }
266

    
267
        /**
268
         * Obtiene la coordenada superior derecha real en X.
269
         * @return Coordenada de m?nima X real
270
         */
271
        public double getUrxWc() {
272
                return urWc.getX();
273
        }
274

    
275
        /**
276
         * Obtiene la coordenada superior derecha real en Y.
277
         * @return Coordenada de m?nima Y real
278
         */
279
        public double getUryWc() {
280
                return urWc.getY();
281
        }
282

    
283
        /**
284
         * Obtiene la coordenada superior izquierda pixel en X.
285
         * @return Coordenada de m?xima X real.
286
         */
287
        public double getUlxPx() {
288
                return ulPx.getX();
289
        }
290

    
291
        /**
292
         * Obtiene la coordenada superior izquierda pixel en Y.
293
         * @return Coordenada de m?xima Y real
294
         */
295
        public double getUlyPx() {
296
                return ulPx.getY();
297
        }
298

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

    
307
        /**
308
         * Obtiene la coordenada inferior izquierda pixel en Y.
309
         * @return Coordenada de m?xima Y real
310
         */
311
        public double getLlyPx() {
312
                return llPx.getY();
313
        }
314

    
315
        /**
316
         * Obtiene la coordenada inferior derecha pixel en X.
317
         * @return Coordenada de m?nima X real
318
         */
319
        public double getLrxPx() {
320
                return lrPx.getX();
321
        }
322

    
323
        /**
324
         * Obtiene la coordenada inferior derecha pixel en Y.
325
         * @return Coordenada de m?nima Y real
326
         */
327
        public double getLryPx() {
328
                return lrPx.getY();
329
        }
330

    
331
        /**
332
         * Obtiene la coordenada superior derecha pixel en X.
333
         * @return Coordenada de m?nima X real
334
         */
335
        public double getUrxPx() {
336
                return urPx.getX();
337
        }
338

    
339
        /**
340
         * Obtiene la coordenada superior derecha pixel en Y.
341
         * @return Coordenada de m?nima Y real
342
         */
343
        public double getUryPx() {
344
                return urPx.getY();
345
        }
346

    
347
        /**
348
         * Ancho en coordenadas reales
349
         * @return
350
         */
351
        public double getWcWidth() {
352
                return Math.abs(getWcMaxX() - getWcMinX());
353
        }
354

    
355
        /**
356
         * Alto en coordenadas reales
357
         * @return
358
         */
359
        public double getWcHeight() {
360
                return Math.abs(getWcMaxY() - getWcMinY());
361
        }
362

    
363
        /**
364
         * Asigna las coordenadas del mundo real a partir de n?meros en coma flotante.
365
         * @param ul coordenada superior izquierda
366
         * @param lr coordenada inferior derecha
367
         * @param ll coordenada inferior izquierda
368
         * @param ur coordenada superior derecha
369
         */
370
        public void setCoorReal(Point2D ul, Point2D lr, Point2D ll, Point2D ur) {
371
                ulWc = ul;
372
                lrWc = lr;
373
                llWc = ll;
374
                urWc = ur;
375
        }
376

    
377
        /**
378
         * Asigna las coordenadas pixel a partir de n?meros en coma flotante.
379
         * @param ul coordenada superior izquierda
380
         * @param lr coordenada inferior derecha
381
         * @param ll coordenada inferior izquierda
382
         * @param ur coordenada superior derecha
383
         */
384
        public void setCoorPixel(Point2D ul, Point2D lr, Point2D ll, Point2D ur) {
385
                ulPx = ul;
386
                lrPx = lr;
387
                llPx = ll;
388
                urPx = ur;
389
        }
390

    
391
        /**
392
         * Asigna las coordenadas del mundo real a partir de n?meros en coma flotante.
393
         * @param minx coordenada m?nima de X
394
         * @param miny coordenada m?nima de Y
395
         * @param maxx coordenada m?xima de X
396
         * @param maxy coordenada m?xima de Y
397
         * @param dec N?mero de decimales a mostrar en la caja de texto
398
         */
399
        /*public void setCoorRealFromDouble(double ulx, double uly, double lrx, double lry) {
400
                ulWc = new Point2D.Double(ulx, uly);
401
                lrWc = new Point2D.Double(lrx, lry);
402
        }*/
403

    
404
        /**
405
         * Asigna las coordenadas pixel a partir de n?meros en coma flotante.
406
         * @param minx coordenada m?nima de X
407
         * @param miny coordenada m?nima de Y
408
         * @param maxx coordenada m?xima de X
409
         * @param maxy coordenada m?xima de Y
410
         * @param dec N?mero de decimales a mostrar en la caja de texto
411
         */
412
        /*public void setCoorPixelFromDouble(double minx, double miny, double maxx, double maxy) {
413
                ulPx = new Point2D.Double(minx, miny);
414
                lrPx = new Point2D.Double(maxx, maxy);
415
        }*/
416

    
417
        /**
418
         * Asigna la coordenada X de la esquina superior izquierda en coordenadas reales
419
         * @param ulx
420
         */
421
        public void setUlxWc(double ulx) {
422
                ulWc = new Point2D.Double(ulx, ulWc.getY());
423
        }
424
        
425
        /**
426
         * Asigna la coordenada X de la esquina inferior izquierda en coordenadas reales
427
         * @param ulx
428
         */
429
        public void setLlxWc(double llx) {
430
                llWc = new Point2D.Double(llx, llWc.getY());
431
        }
432

    
433
        /**
434
         * Asigna la coordenada Y de la esquina superior izquierda en coordenadas reales
435
         * @param uly
436
         */
437
        public void setUlyWc(double uly) {
438
                ulWc = new Point2D.Double(ulWc.getX(), uly);
439
        }
440
        
441
        /**
442
         * Asigna la coordenada Y de la esquina superior derecha en coordenadas reales
443
         * @param uly
444
         */
445
        public void setUryWc(double ury) {
446
                urWc = new Point2D.Double(urWc.getX(), ury);
447
        }
448

    
449
        /**
450
         * Asigna la coordenada X de la esquina superior izquierda en p?xeles
451
         * @param ulx
452
         */
453
        public void setUlxPx(double ulx) {
454
                ulPx = new Point2D.Double(ulx, ulPx.getY());
455
        }
456
        
457
        /**
458
         * Asigna la coordenada X de la esquina inferior izquierda en p?xeles
459
         * @param llx
460
         */
461
        public void setLlxPx(double llx) {
462
                llPx = new Point2D.Double(llx, llPx.getY());
463
        }
464

    
465
        /**
466
         * Asigna la coordenada Y de la esquina superior izquierda en p?xeles
467
         * @param uly
468
         */
469
        public void setUlyPx(double uly) {
470
                ulPx = new Point2D.Double(ulPx.getX(), uly);
471
        }
472
        
473
        /**
474
         * Asigna la coordenada Y de la esquina superior derecha en p?xeles
475
         * @param ury
476
         */
477
        public void setUryPx(double ury) {
478
                urPx = new Point2D.Double(urPx.getX(), ury);
479
        }
480

    
481
        /**
482
         * Asigna la coordenada X de la esquina inferior derecha en coordenadas reales
483
         * @param lrx
484
         */
485
        public void setLrxWc(double lrx) {
486
                lrWc = new Point2D.Double(lrx, lrWc.getY());
487
        }
488
        
489
        /**
490
         * Asigna la coordenada Y de la esquina inferior izquierda en coordenadas reales
491
         * @param lly
492
         */
493
        public void setLlyWc(double lly) {
494
                llWc = new Point2D.Double(llWc.getX(), lly);
495
        }
496
        
497
        /**
498
         * Asigna la coordenada X de la esquina superior derecha en coordenadas reales
499
         * @param urx
500
         */
501
        public void setUrxWc(double urx) {
502
                urWc = new Point2D.Double(urx, urWc.getY());
503
        }
504

    
505
        /**
506
         * Asigna la coordenada Y de la esquina inferior derecha en coordenadas reales
507
         * @param lry
508
         */
509
        public void setLryWc(double lry) {
510
                lrWc = new Point2D.Double(lrWc.getX(), lry);
511
        }
512

    
513
        /**
514
         * Asigna la coordenada X de la esquina inferior derecha en p?xeles
515
         * @param ulx
516
         */
517
        public void setLrxPx(double lrx) {
518
                lrPx = new Point2D.Double(lrx, lrPx.getY());
519
        }
520
        
521
        /**
522
         * Asigna la coordenada X de la esquina superior derecha en p?xeles
523
         * @param ulx
524
         */
525
        public void setUrxPx(double urx) {
526
                urPx = new Point2D.Double(urx, urPx.getY());
527
        }
528

    
529
        /**
530
         * Asigna la coordenada Y de la esquina inferior derecha en p?xeles
531
         * @param uly
532
         */
533
        public void setLryPx(double lry) {
534
                lrPx = new Point2D.Double(lrPx.getX(), lry);
535
        }
536
        
537
        /**
538
         * Asigna la coordenada Y de la esquina inferior derecha en p?xeles
539
         * @param uly
540
         */
541
        public void setLlyPx(double lly) {
542
                llPx = new Point2D.Double(llPx.getX(), lly);
543
        }
544

    
545
        /**
546
         * Asigna la matriz de transformaci?n
547
         * @param at AffineTransform
548
         */
549
        public void setAffineTransform(AffineTransform at) {
550
                this.at = at;
551
        }
552

    
553
        /**
554
         * Obtiene las coordenadas del mundo real para la petici?n de recorte
555
         * @return double[]
556
         */
557
        public double[] getWcCoordinatesToClip() {
558
                /*Point2D ul = new Point2D.Double(getPxMinX(), getPxMinY());
559
                Point2D lr = new Point2D.Double(getPxMaxX(), getPxMaxY());
560
                at.transform(ul, ul);
561
                at.transform(lr, lr);
562
                return new double[]{ul.getX(), ul.getY(), lr.getX(), lr.getY()};*/
563
                return new double[]{ulWc.getX(), ulWc.getY(), lrWc.getX(), lrWc.getY()};
564
        }
565
        
566
        /**
567
         * Gets the pixel coordinates to clip
568
         * @return double[]
569
         */
570
        public double[] getPxCoordinatesToClip() {
571
                return new double[]{ulPx.getX(), ulPx.getY(), lrPx.getX(), lrPx.getY()};
572
        }
573

    
574
        /**
575
         * Obtiene el tama?o en pixeles de la imagen de la petici?n de recorte
576
         * @return double[]
577
         */
578
        public double[] getPxSizeToClip() {
579
                return new double[]{(getPxMaxX() - getPxMinX()), (getPxMaxY() - getPxMinY())};
580
        }
581

    
582
        /*
583
         * (non-Javadoc)
584
         * @see java.lang.Object#clone()
585
         */
586
        public Object clone() {
587
                ClippingData data = new ClippingData();
588
                data.ulWc = (Point2D)this.ulWc.clone();
589
                data.llWc = (Point2D)this.llWc.clone();
590
                data.lrWc = (Point2D)this.lrWc.clone();
591
                data.urWc = (Point2D)this.urWc.clone();
592
                data.ulPx = (Point2D)this.ulPx.clone();
593
                data.llPx = (Point2D)this.llPx.clone();
594
                data.lrPx = (Point2D)this.lrPx.clone();
595
                data.urPx = (Point2D)this.urPx.clone();
596
                data.pxWidth = this.pxWidth;
597
                data.pxHeight = this.pxHeight;
598
                data.ratioWidthHeight = this.ratioWidthHeight;
599
                if(this.at!=null)
600
                        data.at = (AffineTransform)this.at.clone();
601
                return data;
602
        }
603
}