Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libFMap_geometries / src / org / gvsig / fmap / geom / primitive / impl / Ellipse2D.java @ 29097

History | View | Annotate | Download (15.5 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.impl;
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.Geometry;
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.primitive.Ellipse;
55
import org.gvsig.fmap.geom.primitive.FShape;
56
import org.gvsig.fmap.geom.primitive.GeneralPathX;
57
import org.gvsig.fmap.geom.primitive.Point;
58
import org.gvsig.fmap.geom.type.GeometryType;
59
import org.gvsig.fmap.geom.util.UtilFunctions;
60

    
61
/**
62
 * DOCUMENT ME!
63
 *
64
 * @author Vicente Caballero Navarro
65
 */
66
public class Ellipse2D extends Surface2D implements Ellipse {
67
        private static final long serialVersionUID = 7624230115118134004L;
68

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

    
73
        /**
74
         * The constructor with the GeometryType like and argument 
75
         * is used by the {@link GeometryType}{@link #create()}
76
         * to create the geometry
77
         * @param type
78
         * The geometry type
79
         */
80
        public Ellipse2D(GeometryType geometryType) {
81
                super(geometryType);                
82
        }
83
        
84
        /**
85
         * Constructor used in the {@link Geometry#cloneGeometry()} method
86
         * @param id
87
         * @param projection
88
         * @param gpx
89
         * @param i
90
         * @param e
91
         * @param d
92
         */
93
        Ellipse2D(GeometryType geometryType,String id, IProjection projection, GeneralPathX gpx,
94
                        Point2D i, Point2D e, double d) {
95
                super(geometryType, id, projection, gpx);
96
                init = i;
97
                end = e;
98
                ydist = d;
99
        }
100

    
101
        /*
102
         * (non-Javadoc)
103
         * @see org.gvsig.fmap.geom.primitive.impl.Surface2D#cloneFShape()
104
         */
105
        public FShape cloneFShape() {
106
                return new Ellipse2D(getGeometryType(), id, projection, (GeneralPathX) gp.clone(), init,
107
                                end, ydist);
108
        }
109

    
110
    /*
111
     * (non-Javadoc)
112
     * @see org.gvsig.fmap.geom.primitive.impl.Surface2D#getShapeType()
113
     */     
114
        public int getShapeType() {
115
                return TYPES.ELLIPSE;
116
        }
117

    
118
        /*
119
         * (non-Javadoc)
120
         * @see org.gvsig.fmap.geom.primitive.impl.OrientablePrimitive2D#transform(java.awt.geom.AffineTransform)
121
         */
122
        public void transform(AffineTransform at) {
123
                Point2D center = new Point2D.Double((init.getX() + end.getX()) / 2,
124
                                (init.getY() + end.getY()) / 2);
125
                Point2D pdist = UtilFunctions.getPerpendicularPoint(init, end, center,
126
                                ydist);
127
                Point2D aux1 = new Point2D.Double();
128
                at.transform(init, aux1);
129
                init = aux1;
130
                Point2D aux2 = new Point2D.Double();
131
                at.transform(end, aux2);
132
                end = aux2;
133

    
134
                center = new Point2D.Double((init.getX() + end.getX()) / 2, (init
135
                                .getY() + end.getY()) / 2);
136

    
137
                Point2D aux3 = new Point2D.Double();
138
                at.transform(pdist, aux3);
139
                ydist = center.distance(aux3);
140
                gp.transform(at);
141
        }
142

    
143
        /*
144
         * (non-Javadoc)
145
         * @see org.gvsig.fmap.geom.primitive.impl.OrientablePrimitive2D#getStretchingHandlers()
146
         */
147
        public Handler[] getStretchingHandlers() {
148
                ArrayList handlers = new ArrayList();
149
                Rectangle2D rect = this.getBounds2D();
150
                handlers
151
                                .add(new CenterHandler(0, rect.getCenterX(), rect.getCenterY()));
152
                return (Handler[]) handlers.toArray(new Handler[0]);
153
        }
154

    
155
        /*
156
         * (non-Javadoc)
157
         * @see org.gvsig.fmap.geom.primitive.impl.OrientablePrimitive2D#getSelectHandlers()
158
         */
159
        public Handler[] getSelectHandlers() {
160
                ArrayList handlers = new ArrayList();
161
                Rectangle2D rect = this.getBounds2D();
162
                handlers.add(new CenterSelHandler(0, rect.getCenterX(), rect
163
                                .getCenterY()));
164
                handlers.add(new InitSelHandler(1, init.getX(), init.getY()));
165
                handlers.add(new EndSelHandler(2, end.getX(), end.getY()));
166
                Point2D mediop = new Point2D.Double((end.getX() + init.getX()) / 2,
167
                                (end.getY() + init.getY()) / 2);
168
                Point2D[] p = UtilFunctions.getPerpendicular(init, end, mediop);
169
                Point2D u = UtilFunctions.getPoint(mediop, p[1], ydist);
170
                Point2D d = UtilFunctions.getPoint(mediop, p[1], -ydist);
171

    
172
                handlers.add(new RadioSelYHandler(3, u.getX(), u.getY()));
173
                handlers.add(new RadioSelYHandler(4, d.getX(), d.getY()));
174

    
175
                return (Handler[]) handlers.toArray(new Handler[0]);
176
        }
177

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

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

    
218
                /**
219
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
220
                 */
221
                public void set(double x, double y) {
222
                }
223
        }
224

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

    
246
                /**
247
                 * DOCUMENT ME!
248
                 *
249
                 * @param x
250
                 *            DOCUMENT ME!
251
                 * @param y
252
                 *            DOCUMENT ME!
253
                 *
254
                 * @return DOCUMENT ME!
255
                 */
256
                public void move(double x, double y) {
257
                        for (int i = 0; i < gp.getNumCoords() / 2; i++) {
258
                                gp.getPointCoords()[i * 2] += x;
259
                                gp.getPointCoords()[i * 2 + 1] += y;
260
                        }
261
                }
262

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

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

    
301
                /**
302
                 * DOCUMENT ME!
303
                 *
304
                 * @param x
305
                 *            DOCUMENT ME!
306
                 * @param y
307
                 *            DOCUMENT ME!
308
                 *
309
                 * @return DOCUMENT ME!
310
                 */
311
                public void move(double x, double y) {
312

    
313
                }
314

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

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

    
341
                        double angle = UtilFunctions.getAngle(init, end);
342
                        AffineTransform mT = AffineTransform.getRotateInstance(angle, init
343
                                        .getX(), init.getY());
344
                        gp = new GeneralPathX(arc);
345
                        gp.transform(mT);
346

    
347
                }
348
        }
349

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

    
371
                /**
372
                 * DOCUMENT ME!
373
                 *
374
                 * @param x
375
                 *            DOCUMENT ME!
376
                 * @param y
377
                 *            DOCUMENT ME!
378
                 *
379
                 * @return DOCUMENT ME!
380
                 */
381
                public void move(double x, double y) {
382

    
383
                }
384

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

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

    
411
                        double angle = UtilFunctions.getAngle(init, end);
412
                        AffineTransform mT = AffineTransform.getRotateInstance(angle, init
413
                                        .getX(), init.getY());
414
                        gp = new GeneralPathX(arc);
415
                        gp.transform(mT);
416

    
417
                }
418
        }
419

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

    
441
                /**
442
                 * DOCUMENT ME!
443
                 *
444
                 * @param x
445
                 *            DOCUMENT ME!
446
                 * @param y
447
                 *            DOCUMENT ME!
448
                 *
449
                 * @return DOCUMENT ME!
450
                 */
451
                public void move(double x, double y) {
452

    
453
                }
454

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

    
476
                        double angle = UtilFunctions.getAngle(init, end);
477
                        AffineTransform mT = AffineTransform.getRotateInstance(angle, init
478
                                        .getX(), init.getY());
479
                        gp = new GeneralPathX(arc);
480
                        gp.transform(mT);
481
                }
482
        }
483

    
484
        /*
485
         * (non-Javadoc)
486
         *
487
         * @see com.iver.cit.gvsig.fmap.core.FPolyline2D#intersects(java.awt.geom.Rectangle2D)
488
         */
489
        public boolean intersects(Rectangle2D r) {
490
                return gp.intersects(r);
491
        }
492

    
493
        /* (non-Javadoc)
494
         * @see org.gvsig.fmap.geom.primitive.Ellipse#setPoints(org.gvsig.fmap.geom.primitive.Point, org.gvsig.fmap.geom.primitive.Point, double)
495
         */
496
        public void setPoints(Point axis1Start, Point axis1End, double axis2Length) {
497
                Point2D _axis1Start = new java.awt.geom.Point2D.Double(axis1Start.getCoordinateAt(0), axis1Start.getCoordinateAt(1));
498
                Point2D _axis1End = new java.awt.geom.Point2D.Double(axis1End.getCoordinateAt(0), axis1End.getCoordinateAt(1));
499
                setPoints(_axis1Start, _axis1End, axis2Length);                
500
        }
501

    
502
        /* (non-Javadoc)
503
         * @see org.gvsig.fmap.geom.primitive.Surface2D#setGeneralPath(org.gvsig.fmap.geom.primitive.GeneralPathX)
504
         */
505
        public void setGeneralPath(GeneralPathX generalPathX) {
506
                throw new UnsupportedOperationException("Use setPoints(Point axis1Start, Point axis1End, double axis2Length)");
507
        }
508

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

    
531
        /* (non-Javadoc)
532
         * @see org.gvsig.fmap.geom.primitive.Ellipse#getAxis1End()
533
         */
534
        public Point getAxis1End() {
535
                try {
536
                        return new org.gvsig.fmap.geom.primitive.impl.Point2D(end);
537
                } catch (Exception e){
538
                        return null;
539
                }
540
        }
541

    
542
        /* (non-Javadoc)
543
         * @see org.gvsig.fmap.geom.primitive.Ellipse#getAxis1Start()
544
         */
545
        public Point getAxis1Start() {
546
                try {
547
                        return new org.gvsig.fmap.geom.primitive.impl.Point2D(init);
548
                } catch (Exception e){
549
                        return null;
550
                }
551
        }
552

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

    
560
}