Statistics
| Revision:

root / trunk / libraries / libFMap_geometries / src / org / gvsig / fmap / geom / primitive / Circle2D.java @ 20896

History | View | Annotate | Download (7.48 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;
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.GeometryManager;
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.type.GeometryType;
55
import org.gvsig.fmap.geom.util.UtilFunctions;
56

    
57
/**
58
 * DOCUMENT ME!
59
 * 
60
 * @author Vicente Caballero Navarro
61
 */
62
public class Circle2D extends Surface2D implements Surface {
63

    
64
        private static final long serialVersionUID = 1L;
65

    
66
        private static GeometryType geomType = GeometryManager.getInstance()
67
                        .registerGeometryType(Circle2D.class);
68

    
69
        private Point2D center;
70
        private double radio;
71

    
72
        /**
73
         * DOCUMENT ME!
74
         * 
75
         * @param gpx
76
         */
77
        public Circle2D(String id, IProjection projection, GeneralPathX gpx,
78
                        Point2D c, double r) {
79
                super(id, projection, gpx);
80
                center = c;
81
                radio = r;
82
        }
83

    
84
        public Point2D getCenter() {
85
                return center;
86
        }
87

    
88
        public double getRadio() {
89
                return radio;
90
        }
91

    
92
        /*
93
         * (non-Javadoc)
94
         * 
95
         * @see com.iver.cit.gvsig.fmap.core.FShape#cloneFShape()
96
         */
97
        public FShape cloneFShape() {
98
                return new Circle2D(id, projection, (GeneralPathX) gp.clone(), center,
99
                                radio);
100
        }
101

    
102
        /**
103
         * @see org.gvsig.fmap.geom.primitive.FShape#getShapeType()
104
         */
105
        public int getShapeType() {
106
                return FShape.CIRCLE;
107
        }
108

    
109
        /**
110
         * DOCUMENT ME!
111
         * 
112
         * @param at
113
         *            DOCUMENT ME!
114
         */
115
        public void transform(AffineTransform at) {
116
                Point2D pdist = UtilFunctions.getPerpendicularPoint(new Point2D.Double(
117
                                center.getX() + 10, center.getY()), new Point2D.Double(center
118
                                .getX() - 10, center.getY()), center, radio);
119
                Point2D aux = new Point2D.Double();
120
                at.transform(center, aux);
121
                center = aux;
122
                Point2D aux3 = new Point2D.Double();
123
                at.transform(pdist, aux3);
124
                radio = center.distance(aux3);
125
                gp.transform(at);
126
        }
127

    
128
        /**
129
         * DOCUMENT ME!
130
         * 
131
         * @return DOCUMENT ME!
132
         */
133
        public Handler[] getStretchingHandlers() {
134
                ArrayList handlers = new ArrayList();
135
                Rectangle2D rect = this.getBounds2D();
136
                handlers
137
                                .add(new CenterHandler(0, rect.getCenterX(), rect.getCenterY()));
138
                // handlers.add(new RadioHandler(1, rect.getX(), rect.getCenterY()));
139
                // handlers.add(new RadioHandler(2, rect.getMaxX(), rect.getCenterY()));
140
                // handlers.add(new RadioHandler(3, rect.getCenterX(), rect.getY()));
141
                // handlers.add(new RadioHandler(3, rect.getCenterX(), rect.getMaxY()));
142

    
143
                return (Handler[]) handlers.toArray(new Handler[0]);
144
        }
145

    
146
        public Handler[] getSelectHandlers() {
147
                ArrayList handlers = new ArrayList();
148
                handlers.add(new CenterSelHandler(0, center.getX(), center.getY()));
149
                handlers.add(new RadioSelHandler(1, center.getX() - radio, center
150
                                .getY()));
151
                handlers.add(new RadioSelHandler(2, center.getX() + radio, center
152
                                .getY()));
153
                handlers.add(new RadioSelHandler(3, center.getX(), center.getY()
154
                                - radio));
155
                handlers.add(new RadioSelHandler(3, center.getX(), center.getY()
156
                                + radio));
157

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

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

    
182
                /**
183
                 * DOCUMENT ME!
184
                 * 
185
                 * @param x
186
                 *            DOCUMENT ME!
187
                 * @param y
188
                 *            DOCUMENT ME!
189
                 * 
190
                 * @return DOCUMENT ME!
191
                 */
192
                public void move(double x, double y) {
193
                        center = new Point2D.Double(center.getX() + x, center.getY() + y);
194
                        for (int i = 0; i < gp.numCoords / 2; i++) {
195
                                gp.pointCoords[i * 2] += x;
196
                                gp.pointCoords[i * 2 + 1] += y;
197
                        }
198
                }
199

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

    
206
        }
207

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

    
229
                /**
230
                 * DOCUMENT ME!
231
                 * 
232
                 * @param x
233
                 *            DOCUMENT ME!
234
                 * @param y
235
                 *            DOCUMENT ME!
236
                 * 
237
                 * @return DOCUMENT ME!
238
                 */
239
                public void move(double x, double y) {
240
                        for (int i = 0; i < gp.numCoords / 2; i++) {
241
                                gp.pointCoords[i * 2] += x;
242
                                gp.pointCoords[i * 2 + 1] += y;
243
                        }
244
                }
245

    
246
                /**
247
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
248
                 */
249
                public void set(double x, double y) {
250
                        center = new Point2D.Double(x, y);
251
                        Arc2D.Double arc = new Arc2D.Double(center.getX() - radio, center
252
                                        .getY()
253
                                        - radio, 2 * radio, 2 * radio, 0, 360, Arc2D.OPEN);
254
                        gp = new GeneralPathX(arc);
255

    
256
                }
257
        }
258

    
259
        /**
260
         * DOCUMENT ME!
261
         * 
262
         * @author Vicente Caballero Navarro
263
         */
264
        class RadioSelHandler extends AbstractHandler implements CuadrantHandler {
265

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

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

    
293
                }
294

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

    
307
        /*
308
         * (non-Javadoc)
309
         * 
310
         * @see com.iver.cit.gvsig.fmap.core.FPolyline2D#intersects(java.awt.geom.Rectangle2D)
311
         */
312
        public boolean intersects(Rectangle2D r) {
313
                return gp.intersects(r);
314
        }
315

    
316
        public GeometryType getGeometryType() {
317
                return geomType;
318
        }
319
}