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
/* 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.aggregate.MultiCurve2D;
52
import org.gvsig.fmap.geom.handler.AbstractHandler;
53
import org.gvsig.fmap.geom.handler.CuadrantHandler;
54
import org.gvsig.fmap.geom.handler.Handler;
55
import org.gvsig.fmap.geom.type.GeometryType;
56
import org.gvsig.fmap.geom.util.UtilFunctions;
57

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

    
65
        private static final long serialVersionUID = 1L;
66

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

    
71
        private Point2D init;
72
        private Point2D end;
73
        private double ydist;
74

    
75
        /**
76
         * DOCUMENT ME!
77
         * 
78
         * @param gpx
79
         */
80
        public Ellipse2D(String id, IProjection projection, GeneralPathX gpx,
81
                        Point2D i, Point2D e, double d) {
82
                super(id, projection, gpx);
83
                init = i;
84
                end = e;
85
                ydist = d;
86
        }
87

    
88
        public Point2D getInit() {
89
                return init;
90
        }
91

    
92
        public Point2D getEnd() {
93
                return end;
94
        }
95

    
96
        public double getDist() {
97
                return ydist;
98
        }
99

    
100
        /*
101
         * (non-Javadoc)
102
         * 
103
         * @see com.iver.cit.gvsig.fmap.core.FShape#cloneFShape()
104
         */
105
        public FShape cloneFShape() {
106
                return new Ellipse2D(id, projection, (GeneralPathX) gp.clone(), init,
107
                                end, ydist);
108
        }
109

    
110
        /**
111
         * @see org.gvsig.fmap.geom.primitive.FShape#getShapeType()
112
         */
113
        public int getShapeType() {
114
                return FShape.ELLIPSE;
115
        }
116

    
117
        /**
118
         * DOCUMENT ME!
119
         * 
120
         * @param at
121
         *            DOCUMENT ME!
122
         */
123
        public void transform(AffineTransform at) {
124
                Point2D center = new Point2D.Double((init.getX() + end.getX()) / 2,
125
                                (init.getY() + end.getY()) / 2);
126
                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

    
135
                center = new Point2D.Double((init.getX() + end.getX()) / 2, (init
136
                                .getY() + end.getY()) / 2);
137

    
138
                Point2D aux3 = new Point2D.Double();
139
                at.transform(pdist, aux3);
140
                ydist = center.distance(aux3);
141
                gp.transform(at);
142
        }
143

    
144
        /**
145
         * DOCUMENT ME!
146
         * 
147
         * @return DOCUMENT ME!
148
         */
149
        public Handler[] getStretchingHandlers() {
150
                ArrayList handlers = new ArrayList();
151
                Rectangle2D rect = this.getBounds2D();
152
                handlers
153
                                .add(new CenterHandler(0, rect.getCenterX(), rect.getCenterY()));
154
                return (Handler[]) handlers.toArray(new Handler[0]);
155
        }
156

    
157
        public Handler[] getSelectHandlers() {
158
                ArrayList handlers = new ArrayList();
159
                Rectangle2D rect = this.getBounds2D();
160
                handlers.add(new CenterSelHandler(0, rect.getCenterX(), rect
161
                                .getCenterY()));
162
                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
                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

    
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
         * 
179
         * @author Vicente Caballero Navarro
180
         */
181
        class CenterHandler extends AbstractHandler implements Handler {
182
                /**
183
                 * Crea un nuevo PointHandler.
184
                 * 
185
                 * @param i
186
                 *            DOCUMENT ME!
187
                 * @param x
188
                 *            DOCUMENT ME!
189
                 * @param y
190
                 *            DOCUMENT ME!
191
                 */
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
                 * 
200
                 * @param x
201
                 *            DOCUMENT ME!
202
                 * @param y
203
                 *            DOCUMENT ME!
204
                 * 
205
                 * @return DOCUMENT ME!
206
                 */
207
                public void move(double x, double y) {
208
                        for (int i = 0; i < gp.numCoords / 2; i++) {
209
                                gp.pointCoords[i * 2] += x;
210
                                gp.pointCoords[i * 2 + 1] += y;
211
                        }
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

    
223
        /**
224
         * DOCUMENT ME!
225
         * 
226
         * @author Vicente Caballero Navarro
227
         */
228
        class CenterSelHandler extends AbstractHandler implements Handler {
229
                /**
230
                 * Crea un nuevo PointHandler.
231
                 * 
232
                 * @param i
233
                 *            DOCUMENT ME!
234
                 * @param x
235
                 *            DOCUMENT ME!
236
                 * @param y
237
                 *            DOCUMENT ME!
238
                 */
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
                 * 
247
                 * @param x
248
                 *            DOCUMENT ME!
249
                 * @param y
250
                 *            DOCUMENT ME!
251
                 * 
252
                 * @return DOCUMENT ME!
253
                 */
254
                public void move(double x, double y) {
255
                        for (int i = 0; i < gp.numCoords / 2; i++) {
256
                                gp.pointCoords[i * 2] += x;
257
                                gp.pointCoords[i * 2 + 1] += y;
258
                        }
259
                }
260

    
261
                /**
262
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
263
                 */
264
                public void set(double x, double y) {
265
                        Point2D center = new Point2D.Double((init.getX() + end.getX()) / 2,
266
                                        (init.getY() + end.getY()) / 2);
267
                        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
                        }
273
                        init = new Point2D.Double(init.getX() + dx, init.getY() + dy);
274
                        end = new Point2D.Double(end.getX() + dx, end.getY() + dy);
275
                }
276
        }
277

    
278
        /**
279
         * DOCUMENT ME!
280
         * 
281
         * @author Vicente Caballero Navarro
282
         */
283
        class InitSelHandler extends AbstractHandler implements CuadrantHandler {
284
                /**
285
                 * Crea un nuevo PointHandler.
286
                 * 
287
                 * @param i
288
                 *            DOCUMENT ME!
289
                 * @param x
290
                 *            DOCUMENT ME!
291
                 * @param y
292
                 *            DOCUMENT ME!
293
                 */
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
                 * 
302
                 * @param x
303
                 *            DOCUMENT ME!
304
                 * @param y
305
                 *            DOCUMENT ME!
306
                 * 
307
                 * @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
                        // 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
                                        (init.getY() + end.getY()) / 2);
321
                        // 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

    
327
                        // 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

    
339
                        double angle = UtilFunctions.getAngle(init, end);
340
                        AffineTransform mT = AffineTransform.getRotateInstance(angle, init
341
                                        .getX(), init.getY());
342
                        gp = new GeneralPathX(arc);
343
                        gp.transform(mT);
344

    
345
                }
346
        }
347

    
348
        /**
349
         * DOCUMENT ME!
350
         * 
351
         * @author Vicente Caballero Navarro
352
         */
353
        class EndSelHandler extends AbstractHandler implements CuadrantHandler {
354
                /**
355
                 * Crea un nuevo PointHandler.
356
                 * 
357
                 * @param i
358
                 *            DOCUMENT ME!
359
                 * @param x
360
                 *            DOCUMENT ME!
361
                 * @param y
362
                 *            DOCUMENT ME!
363
                 */
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
                 * 
372
                 * @param x
373
                 *            DOCUMENT ME!
374
                 * @param y
375
                 *            DOCUMENT ME!
376
                 * 
377
                 * @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
                        // double dx=x-getPoint().getX();
388
                        // double dy=y-getPoint().getY();
389
                        Point2D center = new Point2D.Double((init.getX() + end.getX()) / 2,
390
                                        (init.getY() + end.getY()) / 2);
391
                        // 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

    
397
                        // 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

    
409
                        double angle = UtilFunctions.getAngle(init, end);
410
                        AffineTransform mT = AffineTransform.getRotateInstance(angle, init
411
                                        .getX(), init.getY());
412
                        gp = new GeneralPathX(arc);
413
                        gp.transform(mT);
414

    
415
                }
416
        }
417

    
418
        /**
419
         * DOCUMENT ME!
420
         * 
421
         * @author Vicente Caballero Navarro
422
         */
423
        class RadioSelYHandler extends AbstractHandler implements CuadrantHandler {
424
                /**
425
                 * Crea un nuevo PointHandler.
426
                 * 
427
                 * @param i
428
                 *            DOCUMENT ME!
429
                 * @param x
430
                 *            DOCUMENT ME!
431
                 * @param y
432
                 *            DOCUMENT ME!
433
                 */
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
                 * 
442
                 * @param x
443
                 *            DOCUMENT ME!
444
                 * @param y
445
                 *            DOCUMENT ME!
446
                 * 
447
                 * @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
                        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
                        double xdist = init.distance(end);
469
                        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

    
474
                        double angle = UtilFunctions.getAngle(init, end);
475
                        AffineTransform mT = AffineTransform.getRotateInstance(angle, init
476
                                        .getX(), init.getY());
477
                        gp = new GeneralPathX(arc);
478
                        gp.transform(mT);
479
                }
480
        }
481

    
482
        /*
483
         * (non-Javadoc)
484
         * 
485
         * @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
}