Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libFMap_geometries / src / org / gvsig / fmap / geom / primitive / Ellipse2D.java @ 26810

History | View | Annotate | Download (15 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2004 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
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
package org.gvsig.fmap.geom.primitive;
42

    
43
import java.awt.geom.AffineTransform;
44
import java.awt.geom.Arc2D;
45
import java.awt.geom.Point2D;
46
import java.awt.geom.Rectangle2D;
47
import java.util.ArrayList;
48

    
49
import org.cresques.cts.IProjection;
50
import org.gvsig.fmap.geom.GeometryLocator;
51
import org.gvsig.fmap.geom.handler.AbstractHandler;
52
import org.gvsig.fmap.geom.handler.CuadrantHandler;
53
import org.gvsig.fmap.geom.handler.Handler;
54
import org.gvsig.fmap.geom.type.GeometryType;
55
import org.gvsig.fmap.geom.util.UtilFunctions;
56

    
57
/**
58
 * DOCUMENT ME!
59
 *
60
 * @author Vicente Caballero Navarro
61
 */
62
public class Ellipse2D extends Surface2D implements Ellipse {
63

    
64
        private static final long serialVersionUID = 1L;
65

    
66
        private static GeometryType geomType = GeometryLocator.getGeometryManager()
67
                        .registerGeometryType(Ellipse2D.class,null,TYPES.ELLIPSE);
68
        public static int CODE = geomType.getId();
69

    
70
        private Point2D init;
71
        private Point2D end;
72
        private double ydist;
73

    
74
        /**
75
         * Constructor without arguments. It is necessary to create
76
         * geometries using the {@link GeometryType}{@link #create()}
77
         * method
78
         */
79
        public Ellipse2D() {
80
                super();                
81
        }
82
        
83
        /**
84
         * DOCUMENT ME!
85
         *
86
         * @param gpx
87
         */
88
        public Ellipse2D(String id, IProjection projection, GeneralPathX gpx,
89
                        Point2D i, Point2D e, double d) {
90
                super(id, projection, gpx);
91
                init = i;
92
                end = e;
93
                ydist = d;
94
        }
95

    
96
        public Point2D getInit() {
97
                return init;
98
        }
99

    
100
        public Point2D getEnd() {
101
                return end;
102
        }
103

    
104
        public double getDist() {
105
                return ydist;
106
        }
107

    
108
        /*
109
         * (non-Javadoc)
110
         *
111
         * @see com.iver.cit.gvsig.fmap.core.FShape#cloneFShape()
112
         */
113
        public FShape cloneFShape() {
114
                return new Ellipse2D(id, projection, (GeneralPathX) gp.clone(), init,
115
                                end, ydist);
116
        }
117

    
118
        /**
119
         * @see org.gvsig.fmap.geom.primitive.FShape#getShapeType()
120
         */
121
        public int getShapeType() {
122
                return FShape.ELLIPSE;
123
        }
124

    
125
        /**
126
         * DOCUMENT ME!
127
         *
128
         * @param at
129
         *            DOCUMENT ME!
130
         */
131
        public void transform(AffineTransform at) {
132
                Point2D center = new Point2D.Double((init.getX() + end.getX()) / 2,
133
                                (init.getY() + end.getY()) / 2);
134
                Point2D pdist = UtilFunctions.getPerpendicularPoint(init, end, center,
135
                                ydist);
136
                Point2D aux1 = new Point2D.Double();
137
                at.transform(init, aux1);
138
                init = aux1;
139
                Point2D aux2 = new Point2D.Double();
140
                at.transform(end, aux2);
141
                end = aux2;
142

    
143
                center = new Point2D.Double((init.getX() + end.getX()) / 2, (init
144
                                .getY() + end.getY()) / 2);
145

    
146
                Point2D aux3 = new Point2D.Double();
147
                at.transform(pdist, aux3);
148
                ydist = center.distance(aux3);
149
                gp.transform(at);
150
        }
151

    
152
        /**
153
         * DOCUMENT ME!
154
         *
155
         * @return DOCUMENT ME!
156
         */
157
        public Handler[] getStretchingHandlers() {
158
                ArrayList handlers = new ArrayList();
159
                Rectangle2D rect = this.getBounds2D();
160
                handlers
161
                                .add(new CenterHandler(0, rect.getCenterX(), rect.getCenterY()));
162
                return (Handler[]) handlers.toArray(new Handler[0]);
163
        }
164

    
165
        public Handler[] getSelectHandlers() {
166
                ArrayList handlers = new ArrayList();
167
                Rectangle2D rect = this.getBounds2D();
168
                handlers.add(new CenterSelHandler(0, rect.getCenterX(), rect
169
                                .getCenterY()));
170
                handlers.add(new InitSelHandler(1, init.getX(), init.getY()));
171
                handlers.add(new EndSelHandler(2, end.getX(), end.getY()));
172
                Point2D mediop = new Point2D.Double((end.getX() + init.getX()) / 2,
173
                                (end.getY() + init.getY()) / 2);
174
                Point2D[] p = UtilFunctions.getPerpendicular(init, end, mediop);
175
                Point2D u = UtilFunctions.getPoint(mediop, p[1], ydist);
176
                Point2D d = UtilFunctions.getPoint(mediop, p[1], -ydist);
177

    
178
                handlers.add(new RadioSelYHandler(3, u.getX(), u.getY()));
179
                handlers.add(new RadioSelYHandler(4, d.getX(), d.getY()));
180

    
181
                return (Handler[]) handlers.toArray(new Handler[0]);
182
        }
183

    
184
        /**
185
         * DOCUMENT ME!
186
         *
187
         * @author Vicente Caballero Navarro
188
         */
189
        class CenterHandler extends AbstractHandler implements Handler {
190
                /**
191
                 * Crea un nuevo PointHandler.
192
                 *
193
                 * @param i
194
                 *            DOCUMENT ME!
195
                 * @param x
196
                 *            DOCUMENT ME!
197
                 * @param y
198
                 *            DOCUMENT ME!
199
                 */
200
                public CenterHandler(int i, double x, double y) {
201
                        point = new Point2D.Double(x, y);
202
                        index = i;
203
                }
204

    
205
                /**
206
                 * DOCUMENT ME!
207
                 *
208
                 * @param x
209
                 *            DOCUMENT ME!
210
                 * @param y
211
                 *            DOCUMENT ME!
212
                 *
213
                 * @return DOCUMENT ME!
214
                 */
215
                public void move(double x, double y) {
216
                        for (int i = 0; i < gp.getNumCoords() / 2; i++) {
217
                                gp.getPointCoords()[i * 2] += x;
218
                                gp.getPointCoords()[i * 2 + 1] += y;
219
                        }
220
                        init = new Point2D.Double(init.getX() + x, init.getY() + y);
221
                        end = new Point2D.Double(end.getX() + x, end.getY() + y);
222
                }
223

    
224
                /**
225
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
226
                 */
227
                public void set(double x, double y) {
228
                }
229
        }
230

    
231
        /**
232
         * DOCUMENT ME!
233
         *
234
         * @author Vicente Caballero Navarro
235
         */
236
        class CenterSelHandler extends AbstractHandler implements Handler {
237
                /**
238
                 * Crea un nuevo PointHandler.
239
                 *
240
                 * @param i
241
                 *            DOCUMENT ME!
242
                 * @param x
243
                 *            DOCUMENT ME!
244
                 * @param y
245
                 *            DOCUMENT ME!
246
                 */
247
                public CenterSelHandler(int i, double x, double y) {
248
                        point = new Point2D.Double(x, y);
249
                        index = i;
250
                }
251

    
252
                /**
253
                 * DOCUMENT ME!
254
                 *
255
                 * @param x
256
                 *            DOCUMENT ME!
257
                 * @param y
258
                 *            DOCUMENT ME!
259
                 *
260
                 * @return DOCUMENT ME!
261
                 */
262
                public void move(double x, double y) {
263
                        for (int i = 0; i < gp.getNumCoords() / 2; i++) {
264
                                gp.getPointCoords()[i * 2] += x;
265
                                gp.getPointCoords()[i * 2 + 1] += y;
266
                        }
267
                }
268

    
269
                /**
270
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
271
                 */
272
                public void set(double x, double y) {
273
                        Point2D center = new Point2D.Double((init.getX() + end.getX()) / 2,
274
                                        (init.getY() + end.getY()) / 2);
275
                        double dx = x - center.getX();
276
                        double dy = y - center.getY();
277
                        for (int i = 0; i < gp.getNumCoords() / 2; i++) {
278
                                gp.getPointCoords()[i * 2] += dx;
279
                                gp.getPointCoords()[i * 2 + 1] += dy;
280
                        }
281
                        init = new Point2D.Double(init.getX() + dx, init.getY() + dy);
282
                        end = new Point2D.Double(end.getX() + dx, end.getY() + dy);
283
                }
284
        }
285

    
286
        /**
287
         * DOCUMENT ME!
288
         *
289
         * @author Vicente Caballero Navarro
290
         */
291
        class InitSelHandler extends AbstractHandler implements CuadrantHandler {
292
                /**
293
                 * Crea un nuevo PointHandler.
294
                 *
295
                 * @param i
296
                 *            DOCUMENT ME!
297
                 * @param x
298
                 *            DOCUMENT ME!
299
                 * @param y
300
                 *            DOCUMENT ME!
301
                 */
302
                public InitSelHandler(int i, double x, double y) {
303
                        point = new Point2D.Double(x, y);
304
                        index = i;
305
                }
306

    
307
                /**
308
                 * DOCUMENT ME!
309
                 *
310
                 * @param x
311
                 *            DOCUMENT ME!
312
                 * @param y
313
                 *            DOCUMENT ME!
314
                 *
315
                 * @return DOCUMENT ME!
316
                 */
317
                public void move(double x, double y) {
318

    
319
                }
320

    
321
                /**
322
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
323
                 */
324
                public void set(double x, double y) {
325
                        // TODO comentado para quitar warning: double dx=x-init.getX();
326
                        // TODO comentado para quitar warning: double dy=y-init.getY();
327
                        Point2D center = new Point2D.Double((init.getX() + end.getX()) / 2,
328
                                        (init.getY() + end.getY()) / 2);
329
                        // Point2D[]
330
                        // p1=TrigonometricalFunctions.getPerpendicular(init,end,center);
331
                        // Point2D[]
332
                        // p2=TrigonometricalFunctions.getPerpendicular(p1[0],p1[1],new
333
                        // Point2D.Double(x,y));
334

    
335
                        // Point2D
336
                        // pl=TrigonometricalFunctions.getIntersection(p2[0],p2[1],p1[0],p1[1]);
337
                        // double xdist=2*pl.distance(x,y);
338
                        double xdist = 2 * center.distance(x, y);
339
                        // init=new Point2D.Double(init.getX()+dx,init.getY()+dy);
340
                        init = UtilFunctions.getPoint(center, init, center.distance(x, y));
341
                        end = UtilFunctions.getPoint(init, center, xdist);
342
                        Arc2D.Double arc = new Arc2D.Double(init.getX(), init.getY()
343
                                        - ydist, xdist, 2 * ydist, 0, 360, Arc2D.OPEN);
344
                        // TODO comentado para quitar warning: Point2D rotationPoint = new
345
                        // Point2D.Double(init.getX() + xdist /2, init.getY());
346

    
347
                        double angle = UtilFunctions.getAngle(init, end);
348
                        AffineTransform mT = AffineTransform.getRotateInstance(angle, init
349
                                        .getX(), init.getY());
350
                        gp = new GeneralPathX(arc);
351
                        gp.transform(mT);
352

    
353
                }
354
        }
355

    
356
        /**
357
         * DOCUMENT ME!
358
         *
359
         * @author Vicente Caballero Navarro
360
         */
361
        class EndSelHandler extends AbstractHandler implements CuadrantHandler {
362
                /**
363
                 * Crea un nuevo PointHandler.
364
                 *
365
                 * @param i
366
                 *            DOCUMENT ME!
367
                 * @param x
368
                 *            DOCUMENT ME!
369
                 * @param y
370
                 *            DOCUMENT ME!
371
                 */
372
                public EndSelHandler(int i, double x, double y) {
373
                        point = new Point2D.Double(x, y);
374
                        index = i;
375
                }
376

    
377
                /**
378
                 * DOCUMENT ME!
379
                 *
380
                 * @param x
381
                 *            DOCUMENT ME!
382
                 * @param y
383
                 *            DOCUMENT ME!
384
                 *
385
                 * @return DOCUMENT ME!
386
                 */
387
                public void move(double x, double y) {
388

    
389
                }
390

    
391
                /**
392
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
393
                 */
394
                public void set(double x, double y) {
395
                        // double dx=x-getPoint().getX();
396
                        // double dy=y-getPoint().getY();
397
                        Point2D center = new Point2D.Double((init.getX() + end.getX()) / 2,
398
                                        (init.getY() + end.getY()) / 2);
399
                        // Point2D[]
400
                        // p1=TrigonometricalFunctions.getPerpendicular(init,end,center);
401
                        // Point2D[]
402
                        // p2=TrigonometricalFunctions.getPerpendicular(p1[0],p1[1],new
403
                        // Point2D.Double(x,y));
404

    
405
                        // Point2D
406
                        // pl=TrigonometricalFunctions.getIntersection(p2[0],p2[1],p1[0],p1[1]);
407
                        // double xdist=2*pl.distance(x,y);
408
                        double xdist = 2 * center.distance(x, y);
409
                        end = UtilFunctions.getPoint(center, end, center.distance(x, y));
410
                        // end=new Point2D.Double(end.getX()+dx,end.getY()+dy);
411
                        init = UtilFunctions.getPoint(end, center, xdist);
412
                        Arc2D.Double arc = new Arc2D.Double(init.getX(), init.getY()
413
                                        - ydist, xdist, 2 * ydist, 0, 360, Arc2D.OPEN);
414
                        // Point2D rotationPoint = new Point2D.Double(init.getX() + xdist
415
                        // /2, init.getY());
416

    
417
                        double angle = UtilFunctions.getAngle(init, end);
418
                        AffineTransform mT = AffineTransform.getRotateInstance(angle, init
419
                                        .getX(), init.getY());
420
                        gp = new GeneralPathX(arc);
421
                        gp.transform(mT);
422

    
423
                }
424
        }
425

    
426
        /**
427
         * DOCUMENT ME!
428
         *
429
         * @author Vicente Caballero Navarro
430
         */
431
        class RadioSelYHandler extends AbstractHandler implements CuadrantHandler {
432
                /**
433
                 * Crea un nuevo PointHandler.
434
                 *
435
                 * @param i
436
                 *            DOCUMENT ME!
437
                 * @param x
438
                 *            DOCUMENT ME!
439
                 * @param y
440
                 *            DOCUMENT ME!
441
                 */
442
                public RadioSelYHandler(int i, double x, double y) {
443
                        point = new Point2D.Double(x, y);
444
                        index = i;
445
                }
446

    
447
                /**
448
                 * DOCUMENT ME!
449
                 *
450
                 * @param x
451
                 *            DOCUMENT ME!
452
                 * @param y
453
                 *            DOCUMENT ME!
454
                 *
455
                 * @return DOCUMENT ME!
456
                 */
457
                public void move(double x, double y) {
458

    
459
                }
460

    
461
                /**
462
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
463
                 */
464
                public void set(double x, double y) {
465
                        ydist = new Point2D.Double((init.getX() + end.getX()) / 2, (init
466
                                        .getY() + end.getY()) / 2).distance(x, y);
467
                        // ydist=getSelectHandlers()[1].getPoint().distance(x,y);
468
                        // Point2D center=new Point2D.Double((init.getX() + end.getX()) / 2,
469
                        // (init.getY() + end.getY()) / 2);
470
                        // Point2D[]
471
                        // p=TrigonometricalFunctions.getPerpendicular(init,end,new
472
                        // Point2D.Double(x,y));
473
                        // Point2D
474
                        // pl=TrigonometricalFunctions.getIntersection(p[0],p[1],init,end);
475
                        // double xdist=2*pl.distance(x,y);
476
                        double xdist = init.distance(end);
477
                        Arc2D.Double arc = new Arc2D.Double(init.getX(), init.getY()
478
                                        - ydist, xdist, 2 * ydist, 0, 360, Arc2D.OPEN);
479
                        // Point2D rotationPoint = new Point2D.Double(init.getX() + xdist
480
                        // /2, init.getY());
481

    
482
                        double angle = UtilFunctions.getAngle(init, end);
483
                        AffineTransform mT = AffineTransform.getRotateInstance(angle, init
484
                                        .getX(), init.getY());
485
                        gp = new GeneralPathX(arc);
486
                        gp.transform(mT);
487
                }
488
        }
489

    
490
        /*
491
         * (non-Javadoc)
492
         *
493
         * @see com.iver.cit.gvsig.fmap.core.FPolyline2D#intersects(java.awt.geom.Rectangle2D)
494
         */
495
        public boolean intersects(Rectangle2D r) {
496
                return gp.intersects(r);
497
        }
498

    
499
        /* (non-Javadoc)
500
         * @see org.gvsig.fmap.geom.primitive.Ellipse#setPoints(org.gvsig.fmap.geom.primitive.Point, org.gvsig.fmap.geom.primitive.Point, double)
501
         */
502
        public void setPoints(Point axis1Start, Point axis1End, double axis2Length) {
503
                Point2D _axis1Start = new java.awt.geom.Point2D.Double(axis1Start.getCoordinateAt(0), axis1Start.getCoordinateAt(1));
504
                Point2D _axis1End = new java.awt.geom.Point2D.Double(axis1End.getCoordinateAt(0), axis1End.getCoordinateAt(1));
505
                setPoints(_axis1Start, _axis1End, axis2Length);                
506
        }
507

    
508
        /* (non-Javadoc)
509
         * @see org.gvsig.fmap.geom.primitive.Surface2D#setGeneralPath(org.gvsig.fmap.geom.primitive.GeneralPathX)
510
         */
511
        public void setGeneralPath(GeneralPathX generalPathX) {
512
                throw new UnsupportedOperationException("Use setPoints(Point axis1Start, Point axis1End, double axis2Length)");
513
        }
514

    
515
        /* (non-Javadoc)
516
         * @see org.gvsig.fmap.geom.primitive.Ellipse#setPoints(java.awt.geom.Point2D, java.awt.geom.Point2D, double)
517
         */
518
        private void setPoints(Point2D axis1Start, Point2D axis1End,
519
                        double axis2Length) {
520
                double xAxis = axis1Start.distance(axis1End);
521
                Arc2D.Double arc = new Arc2D.Double(axis1Start.getX(), axis1Start
522
                                .getY()
523
                                - axis2Length, xAxis, 2 * axis2Length, 0, 360, Arc2D.OPEN);
524
                // TODO L?nea comentada para quitar warning: Point2D rotationPoint = new
525
                // Point2D.Double(axis1Start.getX() + xAxis /2, axis1Start.getY());
526
                double angle = UtilFunctions.getAngle(axis1Start, axis1End);
527
                AffineTransform mT = AffineTransform.getRotateInstance(angle,
528
                                axis1Start.getX(), axis1Start.getY());
529
                GeneralPathX gp = new GeneralPathX(arc);
530
                gp.transform(mT);
531
                this.gp = new GeneralPathX(gp);
532
                this.init = axis1Start;
533
                this.end = axis1End;
534
                this.ydist = axis2Length;                
535
        }
536

    
537
        /* (non-Javadoc)
538
         * @see org.gvsig.fmap.geom.primitive.Ellipse#getAxis1End()
539
         */
540
        public Point getAxis1End() {
541
                return new org.gvsig.fmap.geom.primitive.Point2D(end);
542
        }
543

    
544
        /* (non-Javadoc)
545
         * @see org.gvsig.fmap.geom.primitive.Ellipse#getAxis1Start()
546
         */
547
        public Point getAxis1Start() {
548
                return new org.gvsig.fmap.geom.primitive.Point2D(init);
549
        }
550

    
551
        /* (non-Javadoc)
552
         * @see org.gvsig.fmap.geom.primitive.Ellipse#getAxis2Dist()
553
         */
554
        public double getAxis2Dist() {
555
                return ydist;
556
        }
557
        
558
        
559

    
560
}