Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libFMap_geometries / src / org / gvsig / fmap / geom / primitive / impl / Arc2D.java @ 28996

History | View | Annotate | Download (15.6 KB)

1
/*
2
 * Created on 09-feb-2005
3
 *
4
 * gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
5
 *
6
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
7
 *
8
 * This program is free software; you can redistribute it and/or
9
 * modify it under the terms of the GNU General Public License
10
 * as published by the Free Software Foundation; either version 2
11
 * of the License, or (at your option) any later version.
12
 *
13
 * This program is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU General Public License
19
 * along with this program; if not, write to the Free Software
20
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
21
   USA.
22
 *
23
 * For more information, contact:
24
 *
25
 *  Generalitat Valenciana
26
 *   Conselleria d'Infraestructures i Transport
27
 *   Av. Blasco Ib??ez, 50
28
 *   46010 VALENCIA
29
 *   SPAIN
30
 *
31
 *      +34 963862235
32
 *   gvsig@gva.es
33
 *      www.gvsig.gva.es
34
 *
35
 *    or
36
 *
37
 *   IVER T.I. S.A
38
 *   Salamanca 50
39
 *   46005 Valencia
40
 *   Spain
41
 *
42
 *   +34 963163400
43
 *   dac@iver.es
44
 */
45
package org.gvsig.fmap.geom.primitive.impl;
46

    
47
import java.awt.geom.AffineTransform;
48
import java.awt.geom.Point2D;
49
import java.awt.geom.Rectangle2D;
50
import java.util.ArrayList;
51

    
52
import org.cresques.cts.IProjection;
53
import org.gvsig.fmap.geom.GeometryLocator;
54
import org.gvsig.fmap.geom.handler.AbstractHandler;
55
import org.gvsig.fmap.geom.handler.CenterHandler;
56
import org.gvsig.fmap.geom.handler.FinalHandler;
57
import org.gvsig.fmap.geom.handler.Handler;
58
import org.gvsig.fmap.geom.primitive.Arc;
59
import org.gvsig.fmap.geom.primitive.FShape;
60
import org.gvsig.fmap.geom.primitive.GeneralPathX;
61
import org.gvsig.fmap.geom.primitive.Point;
62
import org.gvsig.fmap.geom.type.GeometryType;
63
import org.gvsig.fmap.geom.util.UtilFunctions;
64

    
65

    
66

    
67
/**
68
 * DOCUMENT ME!
69
 *
70
 * @author Vicente Caballero Navarro
71
 */
72
public class Arc2D extends Curve2D implements Arc {
73
        private static final long serialVersionUID = 6416027005106924030L;
74

    
75
        private static GeometryType geomType = GeometryLocator.getGeometryManager()
76
        .registerGeometryType(Arc2D.class, null, TYPES.ARC, SUBTYPES.GEOM2D);
77

    
78
        private Point2D init;
79
        private Point2D center;
80
        private Point2D end;
81
        /**
82
         * DOCUMENT ME!
83
         *
84
         * @param gpx
85
         */
86
        public Arc2D(String id, IProjection projection, GeneralPathX gpx, Point2D i,Point2D c, Point2D e) {
87
                super(id, projection, gpx);
88
                init=i;
89
                center=c;
90
                end=e;
91
        }
92
        
93
        /**
94
         * Constructor without arguments. It is necessary to create
95
         * geometries using the {@link GeometryType}{@link #create()}
96
         * method
97
         */
98
        public Arc2D() {
99
                super();                
100
        }        
101
        
102
        /* (non-Javadoc)
103
         * @see com.iver.cit.gvsig.fmap.core.FShape#cloneFShape()
104
         */
105
        public FShape cloneFShape() {
106
                Arc2D arc = new Arc2D(id, projection, (GeneralPathX) gp.clone(),init,center,end);
107
                return arc;
108
        }
109
        
110
        /*
111
         * (non-Javadoc)
112
         * @see org.gvsig.fmap.geom.primitive.impl.OrientablePrimitive2D#transform(java.awt.geom.AffineTransform)
113
         */
114
        public void transform(AffineTransform at) {
115
                gp.transform(at);
116
                InitHandler inithandler=(InitHandler)getStretchingHandlers()[0];
117
                //CenterHandler centerhandler=(CenterHandler)getHandlers()[1];
118
                EndHandler endhandler=(EndHandler)getStretchingHandlers()[1];
119
                Point2D aux1=new Point2D.Double();
120
                Point2D aux2=new Point2D.Double();
121
                Point2D aux3=new Point2D.Double();
122
                at.transform(inithandler.getPoint(),aux1);
123
                inithandler.setPoint(aux1);
124
                //at.transform(centerhandler.getPoint(),aux2);
125
                //centerhandler.setPoint(aux2);
126
                at.transform(endhandler.getPoint(),aux3);
127
                endhandler.setPoint(aux3);
128
                CenterSelHandler centerhandler=(CenterSelHandler)getSelectHandlers()[1];
129
                at.transform(centerhandler.getPoint(),aux2);
130
                centerhandler.setPoint(aux2);
131

    
132
        }
133
        
134
        /*
135
         * (non-Javadoc)
136
         * @see org.gvsig.fmap.geom.primitive.impl.Curve2D#getShapeType()
137
         */
138
        public int getShapeType() {
139
                return TYPES.ARC;
140
        }
141
        
142
        /*
143
         * (non-Javadoc)
144
         * @see org.gvsig.fmap.geom.primitive.impl.OrientablePrimitive2D#getStretchingHandlers()
145
         */
146
        public Handler[] getStretchingHandlers() {
147
                ArrayList handlers = new ArrayList();
148

    
149
                handlers.add(new InitHandler(0, init.getX(), init.getY()));
150
                //handlers.add(new CenterHandler(1, center.getX(), center.getY()));
151
                handlers.add(new EndHandler(1, end.getX(), end.getY()));
152

    
153
                return (Handler[]) handlers.toArray(new Handler[0]);
154
        }
155

    
156
        /*
157
         * (non-Javadoc)
158
         * @see org.gvsig.fmap.geom.primitive.impl.OrientablePrimitive2D#getSelectHandlers()
159
         */        
160
        public Handler[] getSelectHandlers() {
161
                ArrayList handlers = new ArrayList();
162

    
163
                handlers.add(new InitSelHandler(0, init.getX(), init.getY()));
164
                handlers.add(new CenterSelHandler(1, center.getX(), center.getY()));
165
                handlers.add(new EndSelHandler(2, end.getX(), end.getY()));
166

    
167
                return (Handler[]) handlers.toArray(new Handler[0]);
168
        }
169
        /**
170
         * DOCUMENT ME!
171
         *
172
         * @author Vicente Caballero Navarro
173
         */        
174
        class CenterSelHandler extends AbstractHandler implements CenterHandler{
175
                /**
176
                 * Crea un nuevo PointHandler.
177
                 *
178
                 * @param i DOCUMENT ME!
179
                 * @param x DOCUMENT ME!
180
                 * @param y DOCUMENT ME!
181
                 */
182
                public CenterSelHandler(int i, double x, double y) {
183
                        center = new Point2D.Double(x, y);
184
                        index = i;
185
                }
186

    
187
                /**
188
                 * DOCUMENT ME!
189
                 *
190
                 * @param x DOCUMENT ME!
191
                 * @param y DOCUMENT ME!
192
                 *
193
                 * @return DOCUMENT ME!
194
                 */
195
                public void move(double x, double y) {
196
                }
197
                public void setPoint(Point2D p){
198
                        center=p;
199
                }
200
                public Point2D getPoint(){
201
                        return center;
202
                }
203

    
204
                /**
205
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
206
                 */
207
                public void set(double x, double y) {
208
                        center=new Point2D.Double(x,y);
209
                        java.awt.geom.Arc2D arco = UtilFunctions.createArc(init, center, end);
210
                        gp = new GeneralPathX(arco);
211
                }
212
        }
213

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

    
232
                /**
233
                 * DOCUMENT ME!
234
                 *
235
                 * @param x DOCUMENT ME!
236
                 * @param y DOCUMENT ME!
237
                 *
238
                 * @return DOCUMENT ME!
239
                 */
240
                public void move(double x, double y) {
241
                        Point2D mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
242
                        double dist=mediop.distance(center);
243
                        init=new Point2D.Double(init.getX()+x,init.getY()+y);
244

    
245
                        mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
246
                        Point2D[] perp=UtilFunctions.getPerpendicular(init,end,mediop);
247
                        if (UtilFunctions.getAngle(end,init)<=Math.PI){
248
                                dist=-dist;
249
                        }
250
                        center=UtilFunctions.getPoint(mediop,perp[1],dist);
251

    
252
                        java.awt.geom.Arc2D arco = UtilFunctions.createArc(init,center, end);
253
                        gp=new GeneralPathX(arco);
254
                }
255
                public void setPoint(Point2D p){
256
                        init=p;
257
                }
258
                public Point2D getPoint(){
259
                        return init;
260
                }
261

    
262
                /**
263
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
264
                 */
265
                public void set(double x, double y) {
266
                        }
267
        }
268

    
269
        /**
270
         * DOCUMENT ME!
271
         *
272
         * @author Vicente Caballero Navarro
273
         */
274
        class EndHandler extends AbstractHandler implements FinalHandler{
275
                /**
276
                 * Crea un nuevo PointHandler.
277
                 *
278
                 * @param i DOCUMENT ME!
279
                 * @param x DOCUMENT ME!
280
                 * @param y DOCUMENT ME!
281
                 */
282
                public EndHandler(int i, double x, double y) {
283
                        end = new Point2D.Double(x, y);
284
                        index = i;
285
                }
286

    
287
                /**
288
                 * DOCUMENT ME!
289
                 *
290
                 * @param x DOCUMENT ME!
291
                 * @param y DOCUMENT ME!
292
                 *
293
                 * @return DOCUMENT ME!
294
                 */
295
                public void move(double x, double y) {
296
                        Point2D mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
297
                        double dist=mediop.distance(center);
298
                        end=new Point2D.Double(end.getX()+x,end.getY()+y);
299

    
300
                        mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
301
                        Point2D[] perp=UtilFunctions.getPerpendicular(init,end,mediop);
302
                        if (UtilFunctions.getAngle(end,init)<=Math.PI){
303
                                dist=-dist;
304
                        }
305
                        center=UtilFunctions.getPoint(mediop,perp[1],dist);
306

    
307
                        java.awt.geom.Arc2D arco = UtilFunctions.createArc(init,center, end);
308
                        gp=new GeneralPathX(arco);
309
                }
310
                public void setPoint(Point2D p){
311
                        end=p;
312
                }
313
                public Point2D getPoint(){
314
                        return end;
315
                }
316

    
317
                /**
318
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
319
                 */
320
                public void set(double x, double y) {
321

    
322
                }
323
        }
324

    
325
        /**
326
         * DOCUMENT ME!
327
         *
328
         * @author Vicente Caballero Navarro
329
         */
330
        class InitSelHandler extends AbstractHandler implements FinalHandler{
331
                /**
332
                 * Crea un nuevo PointHandler.
333
                 *
334
                 * @param i DOCUMENT ME!
335
                 * @param x DOCUMENT ME!
336
                 * @param y DOCUMENT ME!
337
                 */
338
                public InitSelHandler(int i, double x, double y) {
339
                        init = new Point2D.Double(x, y);
340
                        index = i;
341
                }
342

    
343
                /**
344
                 * DOCUMENT ME!
345
                 *
346
                 * @param x DOCUMENT ME!
347
                 * @param y DOCUMENT ME!
348
                 *
349
                 * @return DOCUMENT ME!
350
                 */
351
                public void move(double x, double y) {
352
                        Point2D mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
353
                        double dist=mediop.distance(center);
354
                        init=new Point2D.Double(init.getX()+x,init.getY()+y);
355

    
356
                        mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
357
                        Point2D[] perp=UtilFunctions.getPerpendicular(init,end,mediop);
358
                        if (UtilFunctions.getAngle(end,init)<=Math.PI){
359
                                dist=-dist;
360
                        }
361
                        center=UtilFunctions.getPoint(mediop,perp[1],dist);
362

    
363
                        java.awt.geom.Arc2D arco = UtilFunctions.createArc(init,center, end);
364
                        gp=new GeneralPathX(arco);
365
                }
366
                public void setPoint(Point2D p){
367
                        init=p;
368
                }
369
                public Point2D getPoint(){
370
                        return init;
371
                }
372

    
373
                /**
374
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
375
                 */
376
                public void set(double x, double y) {
377
                        Point2D mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
378
                        double dist=mediop.distance(center);
379
                        init=new Point2D.Double(x,y);
380

    
381
                        mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
382
                        // TODO comentado para quitar warning: Point2D[] perp=UtilFunctions.getPerpendicular(init,end,mediop);
383
                        if (UtilFunctions.getAngle(end,init)<=Math.PI){
384
                                dist=-dist;
385
                        }
386
                        ///center=TrigonometricalFunctions.getPoint(mediop,perp[1],dist);
387
                        java.awt.geom.Arc2D arco = UtilFunctions.createArc(init,center, end);
388
                        gp=new GeneralPathX(arco);
389
                }
390
        }
391

    
392
        /**
393
         * DOCUMENT ME!
394
         *
395
         * @author Vicente Caballero Navarro
396
         */
397
        class EndSelHandler extends AbstractHandler implements FinalHandler{
398
                /**
399
                 * Crea un nuevo PointHandler.
400
                 *
401
                 * @param i DOCUMENT ME!
402
                 * @param x DOCUMENT ME!
403
                 * @param y DOCUMENT ME!
404
                 */
405
                public EndSelHandler(int i, double x, double y) {
406
                        end = new Point2D.Double(x, y);
407
                        index = i;
408
                }
409

    
410
                /**
411
                 * DOCUMENT ME!
412
                 *
413
                 * @param x DOCUMENT ME!
414
                 * @param y DOCUMENT ME!
415
                 *
416
                 * @return DOCUMENT ME!
417
                 */
418
                public void move(double x, double y) {
419
                        Point2D mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
420
                        double dist=mediop.distance(center);
421
                        end=new Point2D.Double(end.getX()+x,end.getY()+y);
422

    
423
                        mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
424
                        Point2D[] perp=UtilFunctions.getPerpendicular(init,end,mediop);
425
                        if (UtilFunctions.getAngle(end,init)<=Math.PI){
426
                                dist=-dist;
427
                        }
428
                        center=UtilFunctions.getPoint(mediop,perp[1],dist);
429

    
430
                        java.awt.geom.Arc2D arco = UtilFunctions.createArc(init,center, end);
431
                        gp=new GeneralPathX(arco);
432
                }
433
                public void setPoint(Point2D p){
434
                        end=p;
435
                }
436
                public Point2D getPoint(){
437
                        return end;
438
                }
439

    
440
                /**
441
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
442
                 */
443
                public void set(double x, double y) {
444
                        Point2D mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
445
                        double dist=mediop.distance(center);
446
                        end=new Point2D.Double(x,y);
447

    
448
                        mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
449
                        // TODO comentado para quitar warning: Point2D[] perp=UtilFunctions.getPerpendicular(init,end,mediop);
450
                        if (UtilFunctions.getAngle(end,init)<=Math.PI){
451
                                dist=-dist;
452
                        }
453
                        ///center=TrigonometricalFunctions.getPoint(mediop,perp[1],dist);
454
                        java.awt.geom.Arc2D arco = UtilFunctions.createArc(init,center, end);
455
                        gp=new GeneralPathX(arco);
456
                }
457
        }
458

    
459
        /* (non-Javadoc)
460
         * @see com.iver.cit.gvsig.fmap.core.FPolyline2D#intersects(java.awt.geom.Rectangle2D)
461
         */
462
        public boolean intersects(Rectangle2D r) {
463
                return gp.intersects(r);
464
        }
465

    
466
        /*
467
         * (non-Javadoc)
468
         * @see org.gvsig.fmap.geom.primitive.impl.Curve2D#getGeometryType()
469
         */
470
        public GeometryType getGeometryType() {
471
                return geomType;
472
        }
473

    
474
        /* (non-Javadoc)
475
         * @see org.gvsig.fmap.geom.primitive.Arc#setPoints(org.gvsig.fmap.geom.primitive.Point, org.gvsig.fmap.geom.primitive.Point, org.gvsig.fmap.geom.primitive.Point)
476
         */
477
        public void setPoints(Point p1, Point p2, Point p3) {
478
                Point2D _p1 = new java.awt.geom.Point2D.Double(p1.getCoordinateAt(0), p1.getCoordinateAt(1));
479
                Point2D _p2 = new java.awt.geom.Point2D.Double(p2.getCoordinateAt(0), p2.getCoordinateAt(1));
480
                Point2D _p3 = new java.awt.geom.Point2D.Double(p3.getCoordinateAt(0), p3.getCoordinateAt(1));
481
                setPoints(_p1, _p2, _p3);
482
        }
483

    
484
        /* (non-Javadoc)
485
         * @see org.gvsig.fmap.geom.primitive.Curve2D#setGeneralPath(org.gvsig.fmap.geom.primitive.GeneralPathX)
486
         */
487
        public void setGeneralPath(GeneralPathX generalPathX) {
488
                throw new UnsupportedOperationException("Use setPoints(Point p1, Point p2, Point p3)");
489
        }
490

    
491
        /* (non-Javadoc)
492
         * @see org.gvsig.fmap.geom.primitive.Arc#setPoints(java.awt.geom.Point2D, java.awt.geom.Point2D, java.awt.geom.Point2D)
493
         */
494
        private void setPoints(Point2D p1, Point2D p2, Point2D p3) {
495
                java.awt.geom.Arc2D arco = UtilFunctions.createArc(p1, p2, p3);
496
                if (arco == null) {
497
                        throw new IllegalArgumentException();
498
                }
499
                this.gp = new GeneralPathX(arco);
500
                this.center = p1;
501
                this.init = p2;
502
                this.end = p3;
503
        }
504

    
505
        /* (non-Javadoc)
506
         * @see org.gvsig.fmap.geom.primitive.Arc#setPoints(org.gvsig.fmap.geom.primitive.Point, double, double, double)
507
         */
508
        public void setPoints(Point center, double radius, double initAngle,
509
                        double angleExt) {
510
                Point2D _center = new java.awt.geom.Point2D.Double(center.getCoordinateAt(0), center.getCoordinateAt(1));
511
                setPoints(_center, radius, initAngle, angleExt);
512
        }
513

    
514
        /* (non-Javadoc)
515
         * @see org.gvsig.fmap.geom.primitive.Arc#setPoints(java.awt.geom.Point2D, double, double, double)
516
         */
517
        private void setPoints(Point2D center, double radius, double initAngle,
518
                        double angleExt) {
519
                java.awt.geom.Arc2D arco = UtilFunctions.createArc(center, radius, initAngle, angleExt);
520

    
521
                java.awt.geom.Arc2D semiarco = UtilFunctions.createArc(center, radius, initAngle, angleExt/2);
522
                if (arco == null || semiarco == null) {
523
                        return;
524
                }
525

    
526
                Point2D p1 = arco.getStartPoint();
527
                Point2D p2 = semiarco.getEndPoint();
528
                Point2D p3 = arco.getEndPoint();
529

    
530
                setPoints(p1, p2, p3);                
531
        }
532

    
533
        /* (non-Javadoc)
534
         * @see org.gvsig.fmap.geom.primitive.Curve2D#setPoints(org.gvsig.fmap.geom.primitive.Point, org.gvsig.fmap.geom.primitive.Point)
535
         */
536
        public void setPoints(Point startPoint, Point endPoint) {
537
                throw new UnsupportedOperationException("Use setGeneralPathX");
538
        }
539

    
540
        /* (non-Javadoc)
541
         * @see org.gvsig.fmap.geom.primitive.Arc#getEndPoint()
542
         */
543
        public Point getEndPoint() {
544
                return new org.gvsig.fmap.geom.primitive.impl.Point2D(end.getX(), end.getY());
545
        }
546

    
547
        /* (non-Javadoc)
548
         * @see org.gvsig.fmap.geom.primitive.Arc#getInitPoint()
549
         */
550
        public Point getInitPoint() {
551
                return new org.gvsig.fmap.geom.primitive.impl.Point2D(init.getX(), init.getY());
552
        }
553

    
554
        /* (non-Javadoc)
555
         * @see org.gvsig.fmap.geom.primitive.Arc#getCenterPoint()
556
         */
557
        public Point getCenterPoint() {
558
                Point2D p = UtilFunctions.getCenter(init, center,end);
559
                return new org.gvsig.fmap.geom.primitive.impl.Point2D(p.getX(), p.getY());
560
        }                
561
}