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 / Circle2D.java @ 40727

History | View | Annotate | Download (12.9 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

    
34
import org.gvsig.fmap.geom.Geometry;
35
import org.gvsig.fmap.geom.handler.AbstractHandler;
36
import org.gvsig.fmap.geom.handler.CuadrantHandler;
37
import org.gvsig.fmap.geom.handler.Handler;
38
import org.gvsig.fmap.geom.primitive.Circle;
39
import org.gvsig.fmap.geom.primitive.FShape;
40
import org.gvsig.fmap.geom.primitive.GeneralPathX;
41
import org.gvsig.fmap.geom.primitive.Point;
42
import org.gvsig.fmap.geom.type.GeometryType;
43
import org.gvsig.fmap.geom.util.UtilFunctions;
44

    
45
/**
46
 * DOCUMENT ME!
47
 *
48
 * @author Vicente Caballero Navarro
49
 */
50
public class Circle2D extends Surface2D implements Circle {
51
        private static final long serialVersionUID = -2709867465161215668L;
52
        
53
        private Point2D center;
54
        private double radio;
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 Circle2D(GeometryType geometryType) {
64
                super(geometryType);                
65
        }
66
        
67
        /**
68
         * Constructor used in the {@link Geometry#cloneGeometry()} method
69
         */
70
        Circle2D(GeometryType geometryType, String id, IProjection projection, GeneralPathX gpx,
71
                        Point2D c, double r) {
72
                super(geometryType, id, projection, gpx);
73
                center = c;
74
                radio = r;
75
        }
76

    
77
        /*
78
         * (non-Javadoc)
79
         * @see org.gvsig.fmap.geom.primitive.Circle#getCenter()
80
         */
81
        public Point getCenter() {
82
                return new org.gvsig.fmap.geom.primitive.impl.Point2D(center.getX(), center.getY());
83
        }
84

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

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

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

    
112
                Point2D pdist = UtilFunctions.getPerpendicularPoint(new Point2D.Double(
113
                                center.getX() + 10, center.getY()), new Point2D.Double(center
114
                                .getX() - 10, center.getY()), center, radio);
115
                Point2D aux = new Point2D.Double();
116
                at.transform(center, aux);
117
                center = aux;
118
                Point2D aux3 = new Point2D.Double();
119
                at.transform(pdist, aux3);
120
                radio = center.distance(aux3);
121
                gp.transform(at);
122
        }
123

    
124
        /*
125
         * (non-Javadoc)
126
         * @see org.gvsig.fmap.geom.primitive.impl.OrientablePrimitive2D#getStretchingHandlers()
127
         */
128
        public Handler[] getStretchingHandlers() {
129
                ArrayList handlers = new ArrayList();
130
                Rectangle2D rect = this.getBounds2D();
131
                handlers
132
                                .add(new CenterHandler(0, rect.getCenterX(), rect.getCenterY()));
133
                // handlers.add(new RadioHandler(1, rect.getX(), rect.getCenterY()));
134
                // handlers.add(new RadioHandler(2, rect.getMaxX(), rect.getCenterY()));
135
                // handlers.add(new RadioHandler(3, rect.getCenterX(), rect.getY()));
136
                // handlers.add(new RadioHandler(3, rect.getCenterX(), rect.getMaxY()));
137

    
138
                return (Handler[]) handlers.toArray(new Handler[0]);
139
        }
140

    
141
        /*
142
         * (non-Javadoc)
143
         * @see org.gvsig.fmap.geom.primitive.impl.OrientablePrimitive2D#getSelectHandlers()
144
         */
145
        public Handler[] getSelectHandlers() {
146
                ArrayList handlers = new ArrayList();
147
                handlers.add(new CenterSelHandler(0, center.getX(), center.getY()));
148
                handlers.add(new RadioSelHandler(1, center.getX() - radio, center
149
                                .getY()));
150
                handlers.add(new RadioSelHandler(2, center.getX() + radio, center
151
                                .getY()));
152
                handlers.add(new RadioSelHandler(3, center.getX(), center.getY()
153
                                - radio));
154
                handlers.add(new RadioSelHandler(3, center.getX(), center.getY()
155
                                + radio));
156

    
157
                return (Handler[]) handlers.toArray(new Handler[0]);
158
        }
159

    
160
        /**
161
         * DOCUMENT ME!
162
         *
163
         * @author Vicente Caballero Navarro
164
         */
165
        class CenterHandler extends AbstractHandler implements Handler, org.gvsig.fmap.geom.handler.CenterHandler{
166
                /**
167
                 * Crea un nuevo PointHandler.
168
                 *
169
                 * @param i
170
                 *            DOCUMENT ME!
171
                 * @param x
172
                 *            DOCUMENT ME!
173
                 * @param y
174
                 *            DOCUMENT ME!
175
                 */
176
                public CenterHandler(int i, double x, double y) {
177
                        point = new Point2D.Double(x, y);
178
                        index = i;
179
                }
180

    
181
                /**
182
                 * DOCUMENT ME!
183
                 *
184
                 * @param x
185
                 *            DOCUMENT ME!
186
                 * @param y
187
                 *            DOCUMENT ME!
188
                 *
189
                 * @return DOCUMENT ME!
190
                 */
191
                public void move(double x, double y) {
192
                        center = new Point2D.Double(center.getX() + x, center.getY() + y);
193
                         Point point;
194
                        for (int i = 0; i < gp.getNumCoords(); i++) {
195
                            point = gp.getPointAt(i);
196
                point.setX(point.getX() + x);
197
                point.setY(point.getY() + y);
198
                        }
199
                }
200

    
201
                /**
202
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
203
                 */
204
                public void set(double x, double y) {
205
                }
206

    
207
        }
208

    
209
        /**
210
         * DOCUMENT ME!
211
         *
212
         * @author Vicente Caballero Navarro
213
         */
214
        class CenterSelHandler extends AbstractHandler implements Handler, org.gvsig.fmap.geom.handler.CenterHandler {
215
                /**
216
                 * Crea un nuevo PointHandler.
217
                 *
218
                 * @param i
219
                 *            DOCUMENT ME!
220
                 * @param x
221
                 *            DOCUMENT ME!
222
                 * @param y
223
                 *            DOCUMENT ME!
224
                 */
225
                public CenterSelHandler(int i, double x, double y) {
226
                        point = new Point2D.Double(x, y);
227
                        index = i;
228
                }
229

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

    
249
                /**
250
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
251
                 */
252
                public void set(double x, double y) {
253
                        center = new Point2D.Double(x, y);
254
                        Arc2D.Double arc = new Arc2D.Double(center.getX() - radio, center
255
                                        .getY()
256
                                        - radio, 2 * radio, 2 * radio, 0, 360, Arc2D.OPEN);
257
                        gp = new GeneralPathX(arc.getPathIterator(null,
258
                                        geomManager.getFlatness()));
259
                        gp.closePath();
260
                }
261
        }
262

    
263
        /**
264
         * DOCUMENT ME!
265
         *
266
         * @author Vicente Caballero Navarro
267
         */
268
        class RadioSelHandler extends AbstractHandler implements CuadrantHandler {
269

    
270
                /**
271
                 * Crea un nuevo PointHandler.
272
                 *
273
                 * @param i
274
                 *            DOCUMENT ME!
275
                 * @param x
276
                 *            DOCUMENT ME!
277
                 * @param y
278
                 *            DOCUMENT ME!
279
                 */
280
                public RadioSelHandler(int i, double x, double y) {
281
                        point = new Point2D.Double(x, y);
282
                        index = i;
283
                }
284

    
285
                /**
286
                 * DOCUMENT ME!
287
                 *
288
                 * @param x
289
                 *            DOCUMENT ME!
290
                 * @param y
291
                 *            DOCUMENT ME!
292
                 *
293
                 * @return DOCUMENT ME!
294
                 */
295
                public void move(double x, double y) {
296

    
297
                }
298

    
299
                /**
300
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
301
                 */
302
                public void set(double x, double y) {
303
                        radio = center.distance(x, y);
304
                        Arc2D.Double arc = new Arc2D.Double(center.getX() - radio, center
305
                                        .getY()
306
                                        - radio, 2 * radio, 2 * radio, 0, 360, Arc2D.OPEN);
307
                        gp = new GeneralPathX(arc.getPathIterator(null,
308
                                        geomManager.getFlatness()));
309
                }
310
        }
311

    
312
        /*
313
         * (non-Javadoc)
314
         *
315
         * @see com.iver.cit.gvsig.fmap.core.FPolyline2D#intersects(java.awt.geom.Rectangle2D)
316
         */
317
        public boolean intersects(Rectangle2D r) {
318
                return gp.intersects(r);
319
        }
320
        
321
        /* (non-Javadoc)
322
         * @see org.gvsig.fmap.geom.primitive.Surface2D#setGeneralPath(org.gvsig.fmap.geom.primitive.GeneralPathX)
323
         */
324
        public void setGeneralPath(GeneralPathX generalPathX) {
325
                throw new UnsupportedOperationException("Use setPoints(Point center, Point radious)");
326
        }
327

    
328
        /* (non-Javadoc)
329
         * @see org.gvsig.fmap.geom.primitive.Circle#setPoints(org.gvsig.fmap.geom.primitive.Point, org.gvsig.fmap.geom.primitive.Point)
330
         */
331
        public void setPoints(Point center, Point radious) {
332
                Point2D _center = new java.awt.geom.Point2D.Double(center.getCoordinateAt(0), center.getCoordinateAt(1));
333
                Point2D _radious = new java.awt.geom.Point2D.Double(radious.getCoordinateAt(0), radious.getCoordinateAt(1));
334
                double dRadious = _center.distance(_radious);
335
                setPoints(center, dRadious);
336
        }
337
        
338
        /*
339
         * (non-Javadoc)
340
         * @see org.gvsig.fmap.geom.primitive.Circle#setPoints(org.gvsig.fmap.geom.primitive.Point, double)
341
         */
342
        public void setPoints(Point center, double radious){
343
                Point2D _center = new java.awt.geom.Point2D.Double(center.getCoordinateAt(0), center.getCoordinateAt(1));
344
                java.awt.geom.Arc2D.Double arc = 
345
                        new java.awt.geom.Arc2D.Double(center.getX() - radious, _center
346
                                .getY()
347
                                - radious, 2 * radious, 2 * radious, 0, 360, Arc2D.OPEN);
348
                this.gp = new GeneralPathX(arc.getPathIterator(null,
349
                                geomManager.getFlatness()));
350
                gp.closePath();
351
                this.center = _center;
352
                this.radio = radious;        
353
        }
354

    
355
        /* (non-Javadoc)
356
         * @see org.gvsig.fmap.geom.primitive.Arc#setPoints(org.gvsig.fmap.geom.primitive.Point, org.gvsig.fmap.geom.primitive.Point, org.gvsig.fmap.geom.primitive.Point)
357
         */
358
        public void setPoints(Point p1, Point p2, Point p3) {
359
                Point2D _p1 = new java.awt.geom.Point2D.Double(p1.getCoordinateAt(0), p1.getCoordinateAt(1));
360
                Point2D _p2 = new java.awt.geom.Point2D.Double(p2.getCoordinateAt(0), p2.getCoordinateAt(1));
361
                Point2D _p3 = new java.awt.geom.Point2D.Double(p3.getCoordinateAt(0), p3.getCoordinateAt(1));
362
                setPoints(_p1, _p2, _p3);
363
        }
364

    
365
        /* (non-Javadoc)
366
         * @see org.gvsig.fmap.geom.primitive.Circle#setPoints(org.gvsig.fmap.geom.primitive.Point2D, org.gvsig.fmap.geom.primitive.Point2D)
367
         */
368
        public void setPoints(org.gvsig.fmap.geom.primitive.impl.Point2D center,
369
                        org.gvsig.fmap.geom.primitive.impl.Point2D radious) {
370
                Point2D _center = new java.awt.geom.Point2D.Double(center.getCoordinateAt(0), center.getCoordinateAt(1));
371
                Point2D _radious = new java.awt.geom.Point2D.Double(radious.getCoordinateAt(0), radious.getCoordinateAt(1));
372
                setPoints(_center, _radious);                
373
        }
374

    
375
        /* (non-Javadoc)
376
         * @see org.gvsig.fmap.geom.primitive.Circle#setPoints(org.gvsig.fmap.geom.primitive.Point2D, double)
377
         */
378
        public void setPoints(Point2D center,
379
                        double radious) {
380
                java.awt.geom.Arc2D.Double arc = 
381
                        new java.awt.geom.Arc2D.Double(center.getX() - radious, center
382
                                .getY()
383
                                - radious, 2 * radious, 2 * radious, 0, 360, Arc2D.OPEN);
384
                this.gp = new GeneralPathX(arc.getPathIterator(null,
385
                                geomManager.getFlatness()));
386
                gp.closePath();
387
                this.center = center;
388
                this.radio = radious;        
389
                
390
        }
391

    
392
        /* (non-Javadoc)
393
         * @see org.gvsig.fmap.geom.primitive.Arc#setPoints(java.awt.geom.Point2D, java.awt.geom.Point2D, java.awt.geom.Point2D)
394
         */
395
        public void setPoints(Point2D p1, Point2D p2, Point2D p3) {
396
                Point2D center = UtilFunctions.getCenter(p1, p2, p3);
397
                if (center != null) {
398
                        setPoints(center, p1);
399
                }
400
        }
401
        
402
        /* (non-Javadoc)
403
         * @see org.gvsig.fmap.geom.primitive.Curve#setCoordinateAt(int, int, double)
404
         */
405
        public void setCoordinateAt(int index, int dimension, double value) {
406
                throw new UnsupportedOperationException("Use setGeneralPathX");
407
        }
408

    
409
        /* (non-Javadoc)
410
         * @see org.gvsig.fmap.geom.primitive.Circle#setPoints(java.awt.geom.Point2D, java.awt.geom.Point2D)
411
         */
412
        private void setPoints(Point2D center, Point2D radious) {
413
                double radio = center.distance(radious);
414
                setPoints(center, radio);                
415
        }
416

    
417
        /* (non-Javadoc)
418
         * @see org.gvsig.fmap.geom.primitive.Arc#setPoints(org.gvsig.fmap.geom.primitive.Point, double, double, double)
419
         */
420
        public void setPoints(Point center, double radius, double initAngle,
421
                        double angleExt) {
422
                throw new UnsupportedOperationException("Use setGeneralPathX");                
423
        }
424

    
425
        /* (non-Javadoc)
426
         * @see org.gvsig.fmap.geom.primitive.Arc#setPoints(java.awt.geom.Point2D, double, double, double)
427
         */
428
        private void setPoints(Point2D center, double radius, double initAngle,
429
                        double angleExt) {
430
                throw new UnsupportedOperationException("Use setGeneralPathX");                
431
        }
432

    
433
        /* (non-Javadoc)
434
         * @see org.gvsig.fmap.geom.primitive.Circle#getRadious()
435
         */
436
        public double getRadious() {
437
                return radio;
438
        }
439
        
440
        
441
}