Statistics
| Revision:

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

History | View | Annotate | Download (15.3 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.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.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 static GeometryType geomType = GeometryLocator.getGeometryManager()
70
                        .registerGeometryType(Ellipse2D.class, null, TYPES.ELLIPSE, SUBTYPES.GEOM2D);
71
        
72
        private Point2D init;
73
        private Point2D end;
74
        private double ydist;
75

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

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

    
107
    /*
108
     * (non-Javadoc)
109
     * @see org.gvsig.fmap.geom.primitive.impl.Surface2D#getShapeType()
110
     */     
111
        public int getShapeType() {
112
                return FShape.ELLIPSE;
113
        }
114

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

    
131
                center = new Point2D.Double((init.getX() + end.getX()) / 2, (init
132
                                .getY() + end.getY()) / 2);
133

    
134
                Point2D aux3 = new Point2D.Double();
135
                at.transform(pdist, aux3);
136
                ydist = center.distance(aux3);
137
                gp.transform(at);
138
        }
139

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

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

    
169
                handlers.add(new RadioSelYHandler(3, u.getX(), u.getY()));
170
                handlers.add(new RadioSelYHandler(4, d.getX(), d.getY()));
171

    
172
                return (Handler[]) handlers.toArray(new Handler[0]);
173
        }
174

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

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

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

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

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

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

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

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

    
310
                }
311

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

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

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

    
344
                }
345
        }
346

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

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

    
380
                }
381

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

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

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

    
414
                }
415
        }
416

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

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

    
450
                }
451

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

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

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

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

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

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

    
528
        /* (non-Javadoc)
529
         * @see org.gvsig.fmap.geom.primitive.Ellipse#getAxis1End()
530
         */
531
        public Point getAxis1End() {
532
                return new org.gvsig.fmap.geom.primitive.impl.Point2D(end);
533
        }
534

    
535
        /* (non-Javadoc)
536
         * @see org.gvsig.fmap.geom.primitive.Ellipse#getAxis1Start()
537
         */
538
        public Point getAxis1Start() {
539
                return new org.gvsig.fmap.geom.primitive.impl.Point2D(init);
540
        }
541

    
542
        /* (non-Javadoc)
543
         * @see org.gvsig.fmap.geom.primitive.Ellipse#getAxis2Dist()
544
         */
545
        public double getAxis2Dist() {
546
                return ydist;
547
        }
548

    
549
}