Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libFMap_geometries / src / org / gvsig / fmap / geom / primitive / Circle2D.java @ 21308

History | View | Annotate | Download (7.52 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 Circle {
63

    
64
        private static final long serialVersionUID = 1L;
65

    
66
        private static GeometryType geomType = GeometryManager.getInstance()
67
                        .registerGeometryType(Circle2D.class);
68
        
69
        public static int CODE = geomType.getType();
70

    
71
        private Point2D center;
72
        private double radio;
73

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

    
86
        public Point2D getCenter() {
87
                return center;
88
        }
89

    
90
        public double getRadio() {
91
                return radio;
92
        }
93

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

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

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

    
130
        /**
131
         * DOCUMENT ME!
132
         * 
133
         * @return DOCUMENT ME!
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
                // handlers.add(new RadioHandler(1, rect.getX(), rect.getCenterY()));
141
                // handlers.add(new RadioHandler(2, rect.getMaxX(), rect.getCenterY()));
142
                // handlers.add(new RadioHandler(3, rect.getCenterX(), rect.getY()));
143
                // handlers.add(new RadioHandler(3, rect.getCenterX(), rect.getMaxY()));
144

    
145
                return (Handler[]) handlers.toArray(new Handler[0]);
146
        }
147

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

    
160
                return (Handler[]) handlers.toArray(new Handler[0]);
161
        }
162

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

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

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

    
208
        }
209

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

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

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

    
258
                }
259
        }
260

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

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

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

    
295
                }
296

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

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

    
318
        public GeometryType getGeometryType() {
319
                return geomType;
320
        }
321
}