Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.geometry / org.gvsig.fmap.geometry.impl / src / main / java / org / gvsig / fmap / geom / primitive / impl / Ellipse2D.java @ 40559

History | View | Annotate | Download (18.2 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
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 3
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
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.fmap.geom.primitive.impl;
25

    
26
import java.awt.geom.AffineTransform;
27
import java.awt.geom.Arc2D;
28
import java.awt.geom.Point2D;
29
import java.awt.geom.Rectangle2D;
30
import java.util.ArrayList;
31

    
32
import org.cresques.cts.IProjection;
33
import org.gvsig.fmap.geom.Geometry;
34
import org.gvsig.fmap.geom.handler.AbstractHandler;
35
import org.gvsig.fmap.geom.handler.CuadrantHandler;
36
import org.gvsig.fmap.geom.handler.Handler;
37
import org.gvsig.fmap.geom.primitive.Ellipse;
38
import org.gvsig.fmap.geom.primitive.FShape;
39
import org.gvsig.fmap.geom.primitive.GeneralPathX;
40
import org.gvsig.fmap.geom.primitive.Point;
41
import org.gvsig.fmap.geom.type.GeometryType;
42
import org.gvsig.fmap.geom.util.UtilFunctions;
43

    
44
/**
45
 * DOCUMENT ME!
46
 *
47
 * @author Vicente Caballero Navarro
48
 */
49
public class Ellipse2D extends Surface2D implements Ellipse {
50
    private static final long serialVersionUID = 7624230115118134004L;
51

    
52
    private Point2D init;
53
    private Point2D end;
54
    private double ydist;
55

    
56
    /**
57
     * The constructor with the GeometryType like and argument 
58
     * is used by the {@link GeometryType}{@link #create()}
59
     * to create the geometry
60
     * @param type
61
     * The geometry type
62
     */
63
    public Ellipse2D(GeometryType geometryType) {
64
        super(geometryType);                
65
    }
66

    
67
    /**
68
     * Constructor used in the {@link Geometry#cloneGeometry()} method
69
     * @param id
70
     * @param projection
71
     * @param gpx
72
     * @param i
73
     * @param e
74
     * @param d
75
     */
76
    Ellipse2D(GeometryType geometryType,String id, IProjection projection, GeneralPathX gpx,
77
        Point2D i, Point2D e, double d) {
78
        super(geometryType, id, projection, gpx);
79
        init = i;
80
        end = e;
81
        ydist = d;
82
    }
83

    
84
    /*
85
     * (non-Javadoc)
86
     * @see org.gvsig.fmap.geom.primitive.impl.Surface2D#cloneFShape()
87
     */
88
    public FShape cloneFShape() {
89
        return new Ellipse2D(getGeometryType(), id, projection, (GeneralPathX) gp.clone(), init,
90
            end, ydist);
91
    }
92

    
93
    /*
94
     * (non-Javadoc)
95
     * @see org.gvsig.fmap.geom.primitive.impl.Surface2D#getShapeType()
96
     */     
97
    public int getShapeType() {
98
        return TYPES.ELLIPSE;
99
    }
100

    
101
    /*
102
     * (non-Javadoc)
103
     * @see org.gvsig.fmap.geom.primitive.impl.OrientablePrimitive2D#transform(java.awt.geom.AffineTransform)
104
     */
105
    public void transform(AffineTransform at) {
106
        
107
        if (at == null) {
108
            return;
109
        }
110

    
111
        Point2D center = new Point2D.Double((init.getX() + end.getX()) / 2,
112
            (init.getY() + end.getY()) / 2);
113
        Point2D pdist = UtilFunctions.getPerpendicularPoint(init, end, center,
114
            ydist);
115
        Point2D aux1 = new Point2D.Double();
116
        at.transform(init, aux1);
117
        init = aux1;
118
        Point2D aux2 = new Point2D.Double();
119
        at.transform(end, aux2);
120
        end = aux2;
121

    
122
        center = new Point2D.Double((init.getX() + end.getX()) / 2, (init
123
            .getY() + end.getY()) / 2);
124

    
125
        Point2D aux3 = new Point2D.Double();
126
        at.transform(pdist, aux3);
127
        ydist = center.distance(aux3);
128
        gp.transform(at);
129
    }
130

    
131
    /*
132
     * (non-Javadoc)
133
     * @see org.gvsig.fmap.geom.primitive.impl.OrientablePrimitive2D#getStretchingHandlers()
134
     */
135
    public Handler[] getStretchingHandlers() {
136
        ArrayList handlers = new ArrayList();
137
        Rectangle2D rect = this.getBounds2D();
138
        handlers
139
        .add(new CenterHandler(0, rect.getCenterX(), rect.getCenterY()));
140
        return (Handler[]) handlers.toArray(new Handler[0]);
141
    }
142

    
143
    /*
144
     * (non-Javadoc)
145
     * @see org.gvsig.fmap.geom.primitive.impl.OrientablePrimitive2D#getSelectHandlers()
146
     */
147
    public Handler[] getSelectHandlers() {
148
        ArrayList handlers = new ArrayList();
149
        Rectangle2D rect = this.getBounds2D();
150
        handlers.add(new CenterSelHandler(0, rect.getCenterX(), rect
151
            .getCenterY()));
152
        handlers.add(new InitSelHandler(1, init.getX(), init.getY()));
153
        handlers.add(new EndSelHandler(2, end.getX(), end.getY()));
154
        Point2D mediop = new Point2D.Double((end.getX() + init.getX()) / 2,
155
            (end.getY() + init.getY()) / 2);
156
        Point2D[] p = UtilFunctions.getPerpendicular(init, end, mediop);
157
        Point2D u = UtilFunctions.getPoint(mediop, p[1], ydist);
158
        Point2D d = UtilFunctions.getPoint(mediop, p[1], -ydist);
159

    
160
        handlers.add(new RadioSelYHandler(3, u.getX(), u.getY()));
161
        handlers.add(new RadioSelYHandler(4, d.getX(), d.getY()));
162

    
163
        return (Handler[]) handlers.toArray(new Handler[0]);
164
    }
165

    
166
    /**
167
     * DOCUMENT ME!
168
     *
169
     * @author Vicente Caballero Navarro
170
     */
171
    class CenterHandler extends AbstractHandler implements Handler {
172
        /**
173
         * Crea un nuevo PointHandler.
174
         *
175
         * @param i
176
         *            DOCUMENT ME!
177
         * @param x
178
         *            DOCUMENT ME!
179
         * @param y
180
         *            DOCUMENT ME!
181
         */
182
        public CenterHandler(int i, double x, double y) {
183
            point = new Point2D.Double(x, y);
184
            index = i;
185
        }
186

    
187
        /**
188
         * DOCUMENT ME!
189
         *
190
         * @param x
191
         *            DOCUMENT ME!
192
         * @param y
193
         *            DOCUMENT ME!
194
         *
195
         * @return DOCUMENT ME!
196
         */
197
        public void move(double x, double y) {
198
            Point point;
199
            for (int i = 0; i < gp.getNumCoords() ; i++) {
200
                point = gp.getPointAt(i);
201
                point.setX(point.getX() + x);
202
                point.setY(point.getY() + y);
203
            }
204
            init = new Point2D.Double(init.getX() + x, init.getY() + y);
205
            end = new Point2D.Double(end.getX() + x, end.getY() + y);
206
        }
207

    
208
        /**
209
         * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
210
         */
211
        public void set(double x, double y) {
212
        }
213
    }
214

    
215
    /**
216
     * DOCUMENT ME!
217
     *
218
     * @author Vicente Caballero Navarro
219
     */
220
    class CenterSelHandler extends AbstractHandler implements Handler {
221
        /**
222
         * Crea un nuevo PointHandler.
223
         *
224
         * @param i
225
         *            DOCUMENT ME!
226
         * @param x
227
         *            DOCUMENT ME!
228
         * @param y
229
         *            DOCUMENT ME!
230
         */
231
        public CenterSelHandler(int i, double x, double y) {
232
            point = new Point2D.Double(x, y);
233
            index = i;
234
        }
235

    
236
        /**
237
         * DOCUMENT ME!
238
         *
239
         * @param x
240
         *            DOCUMENT ME!
241
         * @param y
242
         *            DOCUMENT ME!
243
         *
244
         * @return DOCUMENT ME!
245
         */
246
        public void move(double x, double y) {
247
            Point point;
248
            for (int i = 0; i < gp.getNumCoords() ; i++) {
249
                point = gp.getPointAt(i);
250
                point.setX(point.getX() + x);
251
                point.setY(point.getY() + y);
252
            }
253
        }
254

    
255
        /**
256
         * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
257
         */
258
        public void set(double x, double y) {
259
            Point2D center = new Point2D.Double((init.getX() + end.getX()) / 2,
260
                (init.getY() + end.getY()) / 2);
261
            double dx = x - center.getX();
262
            double dy = y - center.getY();
263
            Point point;
264
            for (int i = 0; i < gp.getNumCoords() ; i++) {
265
                point = gp.getPointAt(i);
266
                point.setX(point.getX() + dx);
267
                point.setY(point.getY() + dy);
268
            }
269
            init = new Point2D.Double(init.getX() + dx, init.getY() + dy);
270
            end = new Point2D.Double(end.getX() + dx, end.getY() + dy);
271
        }
272
    }
273

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

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

    
307
        }
308

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

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

    
335
            double angle = UtilFunctions.getAngle(init, end);
336
            AffineTransform mT = AffineTransform.getRotateInstance(angle, init
337
                .getX(), init.getY());
338
            gp = new GeneralPathX(arc.getPathIterator(null));
339
            gp.transform(mT);
340

    
341
        }
342
    }
343

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

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

    
377
        }
378

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

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

    
405
            double angle = UtilFunctions.getAngle(init, end);
406
            AffineTransform mT = AffineTransform.getRotateInstance(angle, init
407
                .getX(), init.getY());
408
            gp = new GeneralPathX(arc.getPathIterator(null));
409
            gp.transform(mT);
410

    
411
        }
412
    }
413

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

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

    
447
        }
448

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

    
470
            double angle = UtilFunctions.getAngle(init, end);
471
            AffineTransform mT = AffineTransform.getRotateInstance(angle, init
472
                .getX(), init.getY());
473
            gp = new GeneralPathX(arc.getPathIterator(null));
474
            gp.transform(mT);
475
        }
476
    }
477

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

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

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

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

    
525
    /* (non-Javadoc)
526
     * @see org.gvsig.fmap.geom.primitive.Ellipse#getAxis1End()
527
     */
528
    public Point getAxis1End() {
529
        try {
530
            return new org.gvsig.fmap.geom.primitive.impl.Point2D(end);
531
        } catch (Exception e){
532
            return null;
533
        }
534
    }
535

    
536
    /* (non-Javadoc)
537
     * @see org.gvsig.fmap.geom.primitive.Ellipse#getAxis1Start()
538
     */
539
    public Point getAxis1Start() {
540
        try {
541
            return new org.gvsig.fmap.geom.primitive.impl.Point2D(init);
542
        } catch (Exception e){
543
            return null;
544
        }
545
    }
546

    
547
    /* (non-Javadoc)
548
     * @see org.gvsig.fmap.geom.primitive.Ellipse#getAxis2Dist()
549
     */
550
    public double getAxis2Dist() {
551
        return ydist;
552
    }
553

    
554
}