Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libFMap_geometries / src / org / gvsig / fmap / geom / primitive / Ellipse2D.java @ 20964

History | View | Annotate | Download (12.6 KB)

1 20761 jmvivo
/* gvSIG. Sistema de Informaci�n Geogr�fica de la Generalitat Valenciana
2 20964 jiyarza
 *
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 20761 jmvivo
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 20964 jiyarza
import org.gvsig.fmap.geom.GeometryManager;
51
import org.gvsig.fmap.geom.aggregate.MultiCurve2D;
52 20761 jmvivo
import org.gvsig.fmap.geom.handler.AbstractHandler;
53
import org.gvsig.fmap.geom.handler.CuadrantHandler;
54
import org.gvsig.fmap.geom.handler.Handler;
55 20964 jiyarza
import org.gvsig.fmap.geom.type.GeometryType;
56 20761 jmvivo
import org.gvsig.fmap.geom.util.UtilFunctions;
57
58
/**
59 20964 jiyarza
 * DOCUMENT ME!
60
 *
61
 * @author Vicente Caballero Navarro
62
 */
63 20761 jmvivo
public class Ellipse2D extends Surface2D implements Surface {
64
65
        private static final long serialVersionUID = 1L;
66 20964 jiyarza
67
        private static GeometryType geomType = GeometryManager.getInstance()
68
                        .registerGeometryType(Ellipse2D.class);
69
        public static int GEOM_TYPE = geomType.getType();
70
71 20761 jmvivo
        private Point2D init;
72
        private Point2D end;
73
        private double ydist;
74 20964 jiyarza
75 20761 jmvivo
        /**
76
         * DOCUMENT ME!
77 20964 jiyarza
         *
78 20761 jmvivo
         * @param gpx
79
         */
80 20964 jiyarza
        public Ellipse2D(String id, IProjection projection, GeneralPathX gpx,
81
                        Point2D i, Point2D e, double d) {
82 20761 jmvivo
                super(id, projection, gpx);
83 20964 jiyarza
                init = i;
84
                end = e;
85
                ydist = d;
86 20761 jmvivo
        }
87
88 20964 jiyarza
        public Point2D getInit() {
89 20761 jmvivo
                return init;
90
        }
91 20964 jiyarza
92
        public Point2D getEnd() {
93 20761 jmvivo
                return end;
94
        }
95 20964 jiyarza
96
        public double getDist() {
97 20761 jmvivo
                return ydist;
98
        }
99 20964 jiyarza
100
        /*
101
         * (non-Javadoc)
102
         *
103 20761 jmvivo
         * @see com.iver.cit.gvsig.fmap.core.FShape#cloneFShape()
104
         */
105
        public FShape cloneFShape() {
106 20964 jiyarza
                return new Ellipse2D(id, projection, (GeneralPathX) gp.clone(), init,
107
                                end, ydist);
108 20761 jmvivo
        }
109 20964 jiyarza
110 20761 jmvivo
        /**
111
         * @see org.gvsig.fmap.geom.primitive.FShape#getShapeType()
112
         */
113
        public int getShapeType() {
114
                return FShape.ELLIPSE;
115
        }
116 20964 jiyarza
117 20761 jmvivo
        /**
118
         * DOCUMENT ME!
119 20964 jiyarza
         *
120
         * @param at
121
         *            DOCUMENT ME!
122 20761 jmvivo
         */
123
        public void transform(AffineTransform at) {
124 20964 jiyarza
                Point2D center = new Point2D.Double((init.getX() + end.getX()) / 2,
125 20761 jmvivo
                                (init.getY() + end.getY()) / 2);
126 20964 jiyarza
                Point2D pdist = UtilFunctions.getPerpendicularPoint(init, end, center,
127
                                ydist);
128
                Point2D aux1 = new Point2D.Double();
129
                at.transform(init, aux1);
130
                init = aux1;
131
                Point2D aux2 = new Point2D.Double();
132
                at.transform(end, aux2);
133
                end = aux2;
134 20761 jmvivo
135 20964 jiyarza
                center = new Point2D.Double((init.getX() + end.getX()) / 2, (init
136
                                .getY() + end.getY()) / 2);
137 20761 jmvivo
138 20964 jiyarza
                Point2D aux3 = new Point2D.Double();
139
                at.transform(pdist, aux3);
140
                ydist = center.distance(aux3);
141 20761 jmvivo
                gp.transform(at);
142
        }
143 20964 jiyarza
144 20761 jmvivo
        /**
145
         * DOCUMENT ME!
146 20964 jiyarza
         *
147 20761 jmvivo
         * @return DOCUMENT ME!
148
         */
149
        public Handler[] getStretchingHandlers() {
150
                ArrayList handlers = new ArrayList();
151
                Rectangle2D rect = this.getBounds2D();
152 20964 jiyarza
                handlers
153
                                .add(new CenterHandler(0, rect.getCenterX(), rect.getCenterY()));
154 20761 jmvivo
                return (Handler[]) handlers.toArray(new Handler[0]);
155
        }
156 20964 jiyarza
157 20761 jmvivo
        public Handler[] getSelectHandlers() {
158
                ArrayList handlers = new ArrayList();
159
                Rectangle2D rect = this.getBounds2D();
160 20964 jiyarza
                handlers.add(new CenterSelHandler(0, rect.getCenterX(), rect
161
                                .getCenterY()));
162 20761 jmvivo
                handlers.add(new InitSelHandler(1, init.getX(), init.getY()));
163
                handlers.add(new EndSelHandler(2, end.getX(), end.getY()));
164
                Point2D mediop = new Point2D.Double((end.getX() + init.getX()) / 2,
165
                                (end.getY() + init.getY()) / 2);
166 20964 jiyarza
                Point2D[] p = UtilFunctions.getPerpendicular(init, end, mediop);
167
                Point2D u = UtilFunctions.getPoint(mediop, p[1], ydist);
168
                Point2D d = UtilFunctions.getPoint(mediop, p[1], -ydist);
169 20761 jmvivo
170
                handlers.add(new RadioSelYHandler(3, u.getX(), u.getY()));
171
                handlers.add(new RadioSelYHandler(4, d.getX(), d.getY()));
172
173
                return (Handler[]) handlers.toArray(new Handler[0]);
174
        }
175
176
        /**
177
         * DOCUMENT ME!
178 20964 jiyarza
         *
179 20761 jmvivo
         * @author Vicente Caballero Navarro
180
         */
181
        class CenterHandler extends AbstractHandler implements Handler {
182
                /**
183
                 * Crea un nuevo PointHandler.
184 20964 jiyarza
                 *
185
                 * @param i
186
                 *            DOCUMENT ME!
187
                 * @param x
188
                 *            DOCUMENT ME!
189
                 * @param y
190
                 *            DOCUMENT ME!
191 20761 jmvivo
                 */
192
                public CenterHandler(int i, double x, double y) {
193
                        point = new Point2D.Double(x, y);
194
                        index = i;
195
                }
196
197
                /**
198
                 * DOCUMENT ME!
199 20964 jiyarza
                 *
200
                 * @param x
201
                 *            DOCUMENT ME!
202
                 * @param y
203
                 *            DOCUMENT ME!
204
                 *
205 20761 jmvivo
                 * @return DOCUMENT ME!
206
                 */
207
                public void move(double x, double y) {
208 20964 jiyarza
                        for (int i = 0; i < gp.numCoords / 2; i++) {
209
                                gp.pointCoords[i * 2] += x;
210
                                gp.pointCoords[i * 2 + 1] += y;
211 20761 jmvivo
                        }
212
                        init = new Point2D.Double(init.getX() + x, init.getY() + y);
213
                        end = new Point2D.Double(end.getX() + x, end.getY() + y);
214
                }
215
216
                /**
217
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
218
                 */
219
                public void set(double x, double y) {
220
                }
221
        }
222 20964 jiyarza
223 20761 jmvivo
        /**
224
         * DOCUMENT ME!
225 20964 jiyarza
         *
226 20761 jmvivo
         * @author Vicente Caballero Navarro
227
         */
228
        class CenterSelHandler extends AbstractHandler implements Handler {
229
                /**
230
                 * Crea un nuevo PointHandler.
231 20964 jiyarza
                 *
232
                 * @param i
233
                 *            DOCUMENT ME!
234
                 * @param x
235
                 *            DOCUMENT ME!
236
                 * @param y
237
                 *            DOCUMENT ME!
238 20761 jmvivo
                 */
239
                public CenterSelHandler(int i, double x, double y) {
240
                        point = new Point2D.Double(x, y);
241
                        index = i;
242
                }
243
244
                /**
245
                 * DOCUMENT ME!
246 20964 jiyarza
                 *
247
                 * @param x
248
                 *            DOCUMENT ME!
249
                 * @param y
250
                 *            DOCUMENT ME!
251
                 *
252 20761 jmvivo
                 * @return DOCUMENT ME!
253
                 */
254
                public void move(double x, double y) {
255 20964 jiyarza
                        for (int i = 0; i < gp.numCoords / 2; i++) {
256
                                gp.pointCoords[i * 2] += x;
257
                                gp.pointCoords[i * 2 + 1] += y;
258 20761 jmvivo
                        }
259
                }
260
261
                /**
262
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
263
                 */
264
                public void set(double x, double y) {
265 20964 jiyarza
                        Point2D center = new Point2D.Double((init.getX() + end.getX()) / 2,
266 20761 jmvivo
                                        (init.getY() + end.getY()) / 2);
267 20964 jiyarza
                        double dx = x - center.getX();
268
                        double dy = y - center.getY();
269
                        for (int i = 0; i < gp.numCoords / 2; i++) {
270
                                gp.pointCoords[i * 2] += dx;
271
                                gp.pointCoords[i * 2 + 1] += dy;
272 20761 jmvivo
                        }
273 20964 jiyarza
                        init = new Point2D.Double(init.getX() + dx, init.getY() + dy);
274
                        end = new Point2D.Double(end.getX() + dx, end.getY() + dy);
275 20761 jmvivo
                }
276
        }
277
278
        /**
279
         * DOCUMENT ME!
280 20964 jiyarza
         *
281 20761 jmvivo
         * @author Vicente Caballero Navarro
282
         */
283 20964 jiyarza
        class InitSelHandler extends AbstractHandler implements CuadrantHandler {
284 20761 jmvivo
                /**
285
                 * Crea un nuevo PointHandler.
286 20964 jiyarza
                 *
287
                 * @param i
288
                 *            DOCUMENT ME!
289
                 * @param x
290
                 *            DOCUMENT ME!
291
                 * @param y
292
                 *            DOCUMENT ME!
293 20761 jmvivo
                 */
294
                public InitSelHandler(int i, double x, double y) {
295
                        point = new Point2D.Double(x, y);
296
                        index = i;
297
                }
298
299
                /**
300
                 * DOCUMENT ME!
301 20964 jiyarza
                 *
302
                 * @param x
303
                 *            DOCUMENT ME!
304
                 * @param y
305
                 *            DOCUMENT ME!
306
                 *
307 20761 jmvivo
                 * @return DOCUMENT ME!
308
                 */
309
                public void move(double x, double y) {
310
311
                }
312
313
                /**
314
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
315
                 */
316
                public void set(double x, double y) {
317 20964 jiyarza
                        // TODO comentado para quitar warning: double dx=x-init.getX();
318
                        // TODO comentado para quitar warning: double dy=y-init.getY();
319
                        Point2D center = new Point2D.Double((init.getX() + end.getX()) / 2,
320 20761 jmvivo
                                        (init.getY() + end.getY()) / 2);
321 20964 jiyarza
                        // Point2D[]
322
                        // p1=TrigonometricalFunctions.getPerpendicular(init,end,center);
323
                        // Point2D[]
324
                        // p2=TrigonometricalFunctions.getPerpendicular(p1[0],p1[1],new
325
                        // Point2D.Double(x,y));
326 20761 jmvivo
327 20964 jiyarza
                        // Point2D
328
                        // pl=TrigonometricalFunctions.getIntersection(p2[0],p2[1],p1[0],p1[1]);
329
                        // double xdist=2*pl.distance(x,y);
330
                        double xdist = 2 * center.distance(x, y);
331
                        // init=new Point2D.Double(init.getX()+dx,init.getY()+dy);
332
                        init = UtilFunctions.getPoint(center, init, center.distance(x, y));
333
                        end = UtilFunctions.getPoint(init, center, xdist);
334
                        Arc2D.Double arc = new Arc2D.Double(init.getX(), init.getY()
335
                                        - ydist, xdist, 2 * ydist, 0, 360, Arc2D.OPEN);
336
                        // TODO comentado para quitar warning: Point2D rotationPoint = new
337
                        // Point2D.Double(init.getX() + xdist /2, init.getY());
338 20761 jmvivo
339
                        double angle = UtilFunctions.getAngle(init, end);
340 20964 jiyarza
                        AffineTransform mT = AffineTransform.getRotateInstance(angle, init
341
                                        .getX(), init.getY());
342 20761 jmvivo
                        gp = new GeneralPathX(arc);
343
                        gp.transform(mT);
344
345
                }
346
        }
347 20964 jiyarza
348 20761 jmvivo
        /**
349
         * DOCUMENT ME!
350 20964 jiyarza
         *
351 20761 jmvivo
         * @author Vicente Caballero Navarro
352
         */
353 20964 jiyarza
        class EndSelHandler extends AbstractHandler implements CuadrantHandler {
354 20761 jmvivo
                /**
355
                 * Crea un nuevo PointHandler.
356 20964 jiyarza
                 *
357
                 * @param i
358
                 *            DOCUMENT ME!
359
                 * @param x
360
                 *            DOCUMENT ME!
361
                 * @param y
362
                 *            DOCUMENT ME!
363 20761 jmvivo
                 */
364
                public EndSelHandler(int i, double x, double y) {
365
                        point = new Point2D.Double(x, y);
366
                        index = i;
367
                }
368
369
                /**
370
                 * DOCUMENT ME!
371 20964 jiyarza
                 *
372
                 * @param x
373
                 *            DOCUMENT ME!
374
                 * @param y
375
                 *            DOCUMENT ME!
376
                 *
377 20761 jmvivo
                 * @return DOCUMENT ME!
378
                 */
379
                public void move(double x, double y) {
380
381
                }
382
383
                /**
384
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
385
                 */
386
                public void set(double x, double y) {
387 20964 jiyarza
                        // double dx=x-getPoint().getX();
388
                        // double dy=y-getPoint().getY();
389
                        Point2D center = new Point2D.Double((init.getX() + end.getX()) / 2,
390 20761 jmvivo
                                        (init.getY() + end.getY()) / 2);
391 20964 jiyarza
                        // Point2D[]
392
                        // p1=TrigonometricalFunctions.getPerpendicular(init,end,center);
393
                        // Point2D[]
394
                        // p2=TrigonometricalFunctions.getPerpendicular(p1[0],p1[1],new
395
                        // Point2D.Double(x,y));
396 20761 jmvivo
397 20964 jiyarza
                        // Point2D
398
                        // pl=TrigonometricalFunctions.getIntersection(p2[0],p2[1],p1[0],p1[1]);
399
                        // double xdist=2*pl.distance(x,y);
400
                        double xdist = 2 * center.distance(x, y);
401
                        end = UtilFunctions.getPoint(center, end, center.distance(x, y));
402
                        // end=new Point2D.Double(end.getX()+dx,end.getY()+dy);
403
                        init = UtilFunctions.getPoint(end, center, xdist);
404
                        Arc2D.Double arc = new Arc2D.Double(init.getX(), init.getY()
405
                                        - ydist, xdist, 2 * ydist, 0, 360, Arc2D.OPEN);
406
                        // Point2D rotationPoint = new Point2D.Double(init.getX() + xdist
407
                        // /2, init.getY());
408 20761 jmvivo
409
                        double angle = UtilFunctions.getAngle(init, end);
410 20964 jiyarza
                        AffineTransform mT = AffineTransform.getRotateInstance(angle, init
411
                                        .getX(), init.getY());
412 20761 jmvivo
                        gp = new GeneralPathX(arc);
413
                        gp.transform(mT);
414
415
                }
416
        }
417 20964 jiyarza
418 20761 jmvivo
        /**
419
         * DOCUMENT ME!
420 20964 jiyarza
         *
421 20761 jmvivo
         * @author Vicente Caballero Navarro
422
         */
423 20964 jiyarza
        class RadioSelYHandler extends AbstractHandler implements CuadrantHandler {
424 20761 jmvivo
                /**
425
                 * Crea un nuevo PointHandler.
426 20964 jiyarza
                 *
427
                 * @param i
428
                 *            DOCUMENT ME!
429
                 * @param x
430
                 *            DOCUMENT ME!
431
                 * @param y
432
                 *            DOCUMENT ME!
433 20761 jmvivo
                 */
434
                public RadioSelYHandler(int i, double x, double y) {
435
                        point = new Point2D.Double(x, y);
436
                        index = i;
437
                }
438
439
                /**
440
                 * DOCUMENT ME!
441 20964 jiyarza
                 *
442
                 * @param x
443
                 *            DOCUMENT ME!
444
                 * @param y
445
                 *            DOCUMENT ME!
446
                 *
447 20761 jmvivo
                 * @return DOCUMENT ME!
448
                 */
449
                public void move(double x, double y) {
450
451
                }
452
453
                /**
454
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
455
                 */
456
                public void set(double x, double y) {
457 20964 jiyarza
                        ydist = new Point2D.Double((init.getX() + end.getX()) / 2, (init
458
                                        .getY() + end.getY()) / 2).distance(x, y);
459
                        // ydist=getSelectHandlers()[1].getPoint().distance(x,y);
460
                        // Point2D center=new Point2D.Double((init.getX() + end.getX()) / 2,
461
                        // (init.getY() + end.getY()) / 2);
462
                        // Point2D[]
463
                        // p=TrigonometricalFunctions.getPerpendicular(init,end,new
464
                        // Point2D.Double(x,y));
465
                        // Point2D
466
                        // pl=TrigonometricalFunctions.getIntersection(p[0],p[1],init,end);
467
                        // double xdist=2*pl.distance(x,y);
468 20761 jmvivo
                        double xdist = init.distance(end);
469 20964 jiyarza
                        Arc2D.Double arc = new Arc2D.Double(init.getX(), init.getY()
470
                                        - ydist, xdist, 2 * ydist, 0, 360, Arc2D.OPEN);
471
                        // Point2D rotationPoint = new Point2D.Double(init.getX() + xdist
472
                        // /2, init.getY());
473 20761 jmvivo
474
                        double angle = UtilFunctions.getAngle(init, end);
475 20964 jiyarza
                        AffineTransform mT = AffineTransform.getRotateInstance(angle, init
476
                                        .getX(), init.getY());
477 20761 jmvivo
                        gp = new GeneralPathX(arc);
478
                        gp.transform(mT);
479
                }
480
        }
481
482 20964 jiyarza
        /*
483
         * (non-Javadoc)
484
         *
485 20761 jmvivo
         * @see com.iver.cit.gvsig.fmap.core.FPolyline2D#intersects(java.awt.geom.Rectangle2D)
486
         */
487
        public boolean intersects(Rectangle2D r) {
488
                return gp.intersects(r);
489
        }
490
491
}