Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libGeometries / src / com / iver / cit / gvsig / fmap / core / FEllipse2D.java @ 20086

History | View | Annotate | Download (11.3 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 com.iver.cit.gvsig.fmap.core;
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.geometries.iso.primitive.Surface;
51

    
52
import com.iver.cit.gvsig.fmap.edition.UtilFunctions;
53

    
54

    
55
/**
56
* DOCUMENT ME!
57
*
58
* @author Vicente Caballero Navarro
59
*/
60
public class FEllipse2D extends FPolygon2D implements Surface {
61
        private Point2D init;
62
        private Point2D end;
63
        private double ydist;
64
        /**
65
         * DOCUMENT ME!
66
         *
67
         * @param gpx
68
         */
69
        public FEllipse2D(String id, IProjection projection, GeneralPathX gpx,Point2D i,Point2D e,double d) {
70
                super(id, projection, gpx);
71
                init=i;
72
                end=e;
73
                ydist=d;
74
        }
75

    
76
        public Point2D getInit(){
77
                return init;
78
        }
79
        public Point2D getEnd(){
80
                return end;
81
        }
82
        public double getDist(){
83
                return ydist;
84
        }
85
        /* (non-Javadoc)
86
         * @see com.iver.cit.gvsig.fmap.core.FShape#cloneFShape()
87
         */
88
        public FShape cloneFShape() {
89
                return new FEllipse2D(id, projection, (GeneralPathX) gp.clone(),init,end,ydist);
90
        }
91
        /**
92
         * @see com.iver.cit.gvsig.fmap.core.FShape#getShapeType()
93
         */
94
        public int getShapeType() {
95
                return FShape.ELLIPSE;
96
        }
97
        /**
98
         * DOCUMENT ME!
99
         *
100
         * @param at DOCUMENT ME!
101
         */
102
        public void transform(AffineTransform at) {
103
                Point2D center=new Point2D.Double((init.getX() + end.getX()) / 2,
104
                                (init.getY() + end.getY()) / 2);
105
                Point2D pdist=UtilFunctions.getPerpendicularPoint(init,end,center,ydist);
106
                Point2D aux1=new Point2D.Double();
107
                at.transform(init,aux1);
108
                init=aux1;
109
                Point2D aux2=new Point2D.Double();
110
                at.transform(end,aux2);
111
                end=aux2;
112

    
113
                center=new Point2D.Double((init.getX() + end.getX()) / 2,
114
                                (init.getY() + end.getY()) / 2);
115

    
116
                Point2D aux3=new Point2D.Double();
117
                at.transform(pdist,aux3);
118
                ydist=center.distance(aux3);
119
                gp.transform(at);
120
        }
121
        /**
122
         * DOCUMENT ME!
123
         *
124
         * @return DOCUMENT ME!
125
         */
126
        public Handler[] getStretchingHandlers() {
127
                ArrayList handlers = new ArrayList();
128
                Rectangle2D rect = this.getBounds2D();
129
                handlers.add(new CenterHandler(0, rect.getCenterX(), rect.getCenterY()));
130
                return (Handler[]) handlers.toArray(new Handler[0]);
131
        }
132
        public Handler[] getSelectHandlers() {
133
                ArrayList handlers = new ArrayList();
134
                Rectangle2D rect = this.getBounds2D();
135
                handlers.add(new CenterSelHandler(0, rect.getCenterX(), rect.getCenterY()));
136
                handlers.add(new InitSelHandler(1, init.getX(), init.getY()));
137
                handlers.add(new EndSelHandler(2, end.getX(), end.getY()));
138
                Point2D mediop = new Point2D.Double((end.getX() + init.getX()) / 2,
139
                                (end.getY() + init.getY()) / 2);
140
                Point2D[] p=UtilFunctions.getPerpendicular(init,end,mediop);
141
                Point2D u=UtilFunctions.getPoint(mediop,p[1],ydist);
142
                Point2D d=UtilFunctions.getPoint(mediop,p[1],-ydist);
143

    
144
                handlers.add(new RadioSelYHandler(3, u.getX(), u.getY()));
145
                handlers.add(new RadioSelYHandler(4, d.getX(), d.getY()));
146

    
147
                return (Handler[]) handlers.toArray(new Handler[0]);
148
        }
149

    
150
        /**
151
         * DOCUMENT ME!
152
         *
153
         * @author Vicente Caballero Navarro
154
         */
155
        class CenterHandler extends AbstractHandler implements ICenterHandler {
156
                /**
157
                 * Crea un nuevo PointHandler.
158
                 *
159
                 * @param i DOCUMENT ME!
160
                 * @param x DOCUMENT ME!
161
                 * @param y DOCUMENT ME!
162
                 */
163
                public CenterHandler(int i, double x, double y) {
164
                        point = new Point2D.Double(x, y);
165
                        index = i;
166
                }
167

    
168
                /**
169
                 * DOCUMENT ME!
170
                 *
171
                 * @param x DOCUMENT ME!
172
                 * @param y DOCUMENT ME!
173
                 *
174
                 * @return DOCUMENT ME!
175
                 */
176
                public void move(double x, double y) {
177
                        for (int i=0;i<gp.numCoords/2;i++){
178
                                gp.pointCoords[i*2]+=x;
179
                                gp.pointCoords[i*2+1]+=y;
180
                        }
181
                        init = new Point2D.Double(init.getX() + x, init.getY() + y);
182
                        end = new Point2D.Double(end.getX() + x, end.getY() + y);
183
                }
184

    
185
                /**
186
                 * @see com.iver.cit.gvsig.fmap.core.Handler#set(double, double)
187
                 */
188
                public void set(double x, double y) {
189
                }
190
        }
191
        /**
192
         * DOCUMENT ME!
193
         *
194
         * @author Vicente Caballero Navarro
195
         */
196
        class CenterSelHandler extends AbstractHandler implements ICenterHandler{
197
                /**
198
                 * Crea un nuevo PointHandler.
199
                 *
200
                 * @param i DOCUMENT ME!
201
                 * @param x DOCUMENT ME!
202
                 * @param y DOCUMENT ME!
203
                 */
204
                public CenterSelHandler(int i, double x, double y) {
205
                        point = new Point2D.Double(x, y);
206
                        index = i;
207
                }
208

    
209
                /**
210
                 * DOCUMENT ME!
211
                 *
212
                 * @param x DOCUMENT ME!
213
                 * @param y DOCUMENT ME!
214
                 *
215
                 * @return DOCUMENT ME!
216
                 */
217
                public void move(double x, double y) {
218
                        for (int i=0;i<gp.numCoords/2;i++){
219
                                gp.pointCoords[i*2]+=x;
220
                                gp.pointCoords[i*2+1]+=y;
221
                        }
222
                }
223

    
224
                /**
225
                 * @see com.iver.cit.gvsig.fmap.core.Handler#set(double, double)
226
                 */
227
                public void set(double x, double y) {
228
                        Point2D center=new Point2D.Double((init.getX() + end.getX()) / 2,
229
                                        (init.getY() + end.getY()) / 2);
230
                        double dx=x-center.getX();
231
                        double dy=y-center.getY();
232
                        for (int i=0;i<gp.numCoords/2;i++){
233
                                gp.pointCoords[i*2]+=dx;
234
                                gp.pointCoords[i*2+1]+=dy;
235
                        }
236
                        init=new Point2D.Double(init.getX()+dx,init.getY()+dy);
237
                        end=new Point2D.Double(end.getX()+dx,end.getY()+dy);
238
                }
239
        }
240

    
241
        /**
242
         * DOCUMENT ME!
243
         *
244
         * @author Vicente Caballero Navarro
245
         */
246
        class InitSelHandler extends AbstractHandler implements ICuadrantHandler{
247
                /**
248
                 * Crea un nuevo PointHandler.
249
                 *
250
                 * @param i DOCUMENT ME!
251
                 * @param x DOCUMENT ME!
252
                 * @param y DOCUMENT ME!
253
                 */
254
                public InitSelHandler(int i, double x, double y) {
255
                        point = new Point2D.Double(x, y);
256
                        index = i;
257
                }
258

    
259
                /**
260
                 * DOCUMENT ME!
261
                 *
262
                 * @param x DOCUMENT ME!
263
                 * @param y DOCUMENT ME!
264
                 *
265
                 * @return DOCUMENT ME!
266
                 */
267
                public void move(double x, double y) {
268

    
269
                }
270

    
271
                /**
272
                 * @see com.iver.cit.gvsig.fmap.core.Handler#set(double, double)
273
                 */
274
                public void set(double x, double y) {
275
                        double dx=x-init.getX();
276
                        double dy=y-init.getY();
277
                        Point2D center=new Point2D.Double((init.getX() + end.getX()) / 2,
278
                                        (init.getY() + end.getY()) / 2);
279
//                        Point2D[] p1=TrigonometricalFunctions.getPerpendicular(init,end,center);
280
//                        Point2D[] p2=TrigonometricalFunctions.getPerpendicular(p1[0],p1[1],new Point2D.Double(x,y));
281

    
282
//                        Point2D pl=TrigonometricalFunctions.getIntersection(p2[0],p2[1],p1[0],p1[1]);
283
//                        double xdist=2*pl.distance(x,y);
284
                        double xdist=2*center.distance(x,y);
285
                        //init=new Point2D.Double(init.getX()+dx,init.getY()+dy);
286
                        init=UtilFunctions.getPoint(center,init,center.distance(x,y));
287
                        end=UtilFunctions.getPoint(init,center,xdist);
288
                        Arc2D.Double arc = new Arc2D.Double(init.getX(),
289
                                        init.getY() - ydist, xdist, 2 * ydist, 0, 360, Arc2D.OPEN);
290
                        Point2D rotationPoint = new Point2D.Double(init.getX() + xdist /2, init.getY());
291

    
292
                        double angle = UtilFunctions.getAngle(init, end);
293
                        AffineTransform mT = AffineTransform.getRotateInstance(angle, init.getX(), init.getY());
294
                        gp = new GeneralPathX(arc);
295
                        gp.transform(mT);
296

    
297
                }
298
        }
299
        /**
300
         * DOCUMENT ME!
301
         *
302
         * @author Vicente Caballero Navarro
303
         */
304
        class EndSelHandler extends AbstractHandler implements ICuadrantHandler{
305
                /**
306
                 * Crea un nuevo PointHandler.
307
                 *
308
                 * @param i DOCUMENT ME!
309
                 * @param x DOCUMENT ME!
310
                 * @param y DOCUMENT ME!
311
                 */
312
                public EndSelHandler(int i, double x, double y) {
313
                        point = new Point2D.Double(x, y);
314
                        index = i;
315
                }
316

    
317
                /**
318
                 * DOCUMENT ME!
319
                 *
320
                 * @param x DOCUMENT ME!
321
                 * @param y DOCUMENT ME!
322
                 *
323
                 * @return DOCUMENT ME!
324
                 */
325
                public void move(double x, double y) {
326

    
327
                }
328

    
329
                /**
330
                 * @see com.iver.cit.gvsig.fmap.core.Handler#set(double, double)
331
                 */
332
                public void set(double x, double y) {
333
                        double dx=x-getPoint().getX();
334
                        double dy=y-getPoint().getY();
335
                        Point2D center=new Point2D.Double((init.getX() + end.getX()) / 2,
336
                                        (init.getY() + end.getY()) / 2);
337
//                        Point2D[] p1=TrigonometricalFunctions.getPerpendicular(init,end,center);
338
//                        Point2D[] p2=TrigonometricalFunctions.getPerpendicular(p1[0],p1[1],new Point2D.Double(x,y));
339

    
340
//                        Point2D pl=TrigonometricalFunctions.getIntersection(p2[0],p2[1],p1[0],p1[1]);
341
//                        double xdist=2*pl.distance(x,y);
342
                        double xdist=2*center.distance(x,y);
343
                        end=UtilFunctions.getPoint(center,end,center.distance(x,y));
344
                        //end=new Point2D.Double(end.getX()+dx,end.getY()+dy);
345
                        init=UtilFunctions.getPoint(end,center,xdist);
346
                        Arc2D.Double arc = new Arc2D.Double(init.getX(),
347
                                        init.getY() - ydist, xdist, 2 * ydist, 0, 360, Arc2D.OPEN);
348
                        Point2D rotationPoint = new Point2D.Double(init.getX() + xdist /2, init.getY());
349

    
350
                        double angle = UtilFunctions.getAngle(init, end);
351
                        AffineTransform mT = AffineTransform.getRotateInstance(angle, init.getX(), init.getY());
352
                        gp = new GeneralPathX(arc);
353
                        gp.transform(mT);
354

    
355
                }
356
        }
357
        /**
358
         * DOCUMENT ME!
359
         *
360
         * @author Vicente Caballero Navarro
361
         */
362
        class RadioSelYHandler extends AbstractHandler implements ICuadrantHandler{
363
                /**
364
                 * Crea un nuevo PointHandler.
365
                 *
366
                 * @param i DOCUMENT ME!
367
                 * @param x DOCUMENT ME!
368
                 * @param y DOCUMENT ME!
369
                 */
370
                public RadioSelYHandler(int i, double x, double y) {
371
                        point = new Point2D.Double(x, y);
372
                        index = i;
373
                }
374

    
375
                /**
376
                 * DOCUMENT ME!
377
                 *
378
                 * @param x DOCUMENT ME!
379
                 * @param y DOCUMENT ME!
380
                 *
381
                 * @return DOCUMENT ME!
382
                 */
383
                public void move(double x, double y) {
384

    
385
                }
386

    
387
                /**
388
                 * @see com.iver.cit.gvsig.fmap.core.Handler#set(double, double)
389
                 */
390
                public void set(double x, double y) {
391
                        ydist=new Point2D.Double((init.getX() + end.getX()) / 2,
392
                                        (init.getY() + end.getY()) / 2).distance(x,y);
393
                        //ydist=getSelectHandlers()[1].getPoint().distance(x,y);
394
//                        Point2D center=new Point2D.Double((init.getX() + end.getX()) / 2,
395
//                                        (init.getY() + end.getY()) / 2);
396
//                        Point2D[] p=TrigonometricalFunctions.getPerpendicular(init,end,new Point2D.Double(x,y));
397
//                        Point2D pl=TrigonometricalFunctions.getIntersection(p[0],p[1],init,end);
398
//                        double xdist=2*pl.distance(x,y);
399
                        double xdist = init.distance(end);
400
                        Arc2D.Double arc = new Arc2D.Double(init.getX(),
401
                                        init.getY() - ydist, xdist, 2 * ydist, 0, 360, Arc2D.OPEN);
402
                        Point2D rotationPoint = new Point2D.Double(init.getX() + xdist /2, init.getY());
403

    
404
                        double angle = UtilFunctions.getAngle(init, end);
405
                        AffineTransform mT = AffineTransform.getRotateInstance(angle, init.getX(), init.getY());
406
                        gp = new GeneralPathX(arc);
407
                        gp.transform(mT);
408
                }
409
        }
410

    
411
        /* (non-Javadoc)
412
         * @see com.iver.cit.gvsig.fmap.core.FPolyline2D#intersects(java.awt.geom.Rectangle2D)
413
         */
414
        public boolean intersects(Rectangle2D r) {
415
                return gp.intersects(r);
416
        }
417

    
418
}