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 @ 40559

History | View | Annotate | Download (12.7 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
                        gp.closePath();
259
                }
260
        }
261

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

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

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

    
296
                }
297

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

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

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

    
352
        /* (non-Javadoc)
353
         * @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)
354
         */
355
        public void setPoints(Point p1, Point p2, Point p3) {
356
                Point2D _p1 = new java.awt.geom.Point2D.Double(p1.getCoordinateAt(0), p1.getCoordinateAt(1));
357
                Point2D _p2 = new java.awt.geom.Point2D.Double(p2.getCoordinateAt(0), p2.getCoordinateAt(1));
358
                Point2D _p3 = new java.awt.geom.Point2D.Double(p3.getCoordinateAt(0), p3.getCoordinateAt(1));
359
                setPoints(_p1, _p2, _p3);
360
        }
361

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

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

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

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

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

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

    
429
        /* (non-Javadoc)
430
         * @see org.gvsig.fmap.geom.primitive.Circle#getRadious()
431
         */
432
        public double getRadious() {
433
                return radio;
434
        }
435
        
436
        
437
}