Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.geometry / org.gvsig.fmap.geometry.impl / src / main / java / org / gvsig / fmap / geom / primitive / impl / Arc2D.java @ 40435

History | View | Annotate | Download (18.9 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.slf4j.Logger;
54
import org.slf4j.LoggerFactory;
55

    
56
import org.gvsig.fmap.geom.Geometry;
57
import org.gvsig.fmap.geom.GeometryLocator;
58
import org.gvsig.fmap.geom.GeometryManager;
59
import org.gvsig.fmap.geom.handler.AbstractHandler;
60
import org.gvsig.fmap.geom.handler.CenterHandler;
61
import org.gvsig.fmap.geom.handler.FinalHandler;
62
import org.gvsig.fmap.geom.handler.Handler;
63
import org.gvsig.fmap.geom.primitive.Arc;
64
import org.gvsig.fmap.geom.primitive.FShape;
65
import org.gvsig.fmap.geom.primitive.GeneralPathX;
66
import org.gvsig.fmap.geom.primitive.Point;
67
import org.gvsig.fmap.geom.type.GeometryType;
68
import org.gvsig.fmap.geom.util.UtilFunctions;
69

    
70

    
71

    
72
/**
73
 * DOCUMENT ME!
74
 *
75
 * @author Vicente Caballero Navarro
76
 */
77
public class Arc2D extends Curve2D implements Arc {
78
        private static final long serialVersionUID = 6416027005106924030L;
79
        
80
        private static final Logger logger = LoggerFactory.getLogger(Arc2D.class);
81

    
82
        private Point2D init;
83
        
84
        /**
85
         * This is the middle point (belongs to the arc), not the center
86
         * of the circle/ellipse
87
         */
88
        private Point2D middle;
89
        private Point2D end;
90
        
91
        private static final GeometryManager geomManager = GeometryLocator.getGeometryManager();
92
                
93
        /**
94
         * The constructor with the GeometryType like and argument 
95
         * is used by the {@link GeometryType}{@link #create()}
96
         * to create the geometry
97
         * @param type
98
         * The geometry type
99
         */
100
        public Arc2D(GeometryType geometryType) {
101
                super(geometryType);                
102
        }
103
        
104
        /**
105
         * Constructor used in the {@link Geometry#cloneGeometry()} method
106
         * @param id
107
         * @param projection
108
         * @param gpx
109
         * @param i
110
         * @param c
111
         * @param e
112
         */
113
        protected Arc2D(GeometryType geometryType, String id, IProjection projection, GeneralPathX gpx, Point2D i,Point2D c, Point2D e) {
114
                super(geometryType, id, projection, gpx);
115
                init=i;
116
                middle=c;
117
                end=e;
118
        }        
119
        
120
        /* (non-Javadoc)
121
         * @see com.iver.cit.gvsig.fmap.core.FShape#cloneFShape()
122
         */
123
        public FShape cloneFShape() {
124
                Arc2D arc = new Arc2D(getGeometryType(), id, projection, (GeneralPathX) gp.clone(),init,middle,end);
125
                return arc;
126
        }
127
        
128
        /*
129
         * (non-Javadoc)
130
         * @see org.gvsig.fmap.geom.primitive.impl.OrientablePrimitive2D#transform(java.awt.geom.AffineTransform)
131
         */
132
        public void transform(AffineTransform at) {
133
            
134
            if (at == null) {
135
                return;
136
            }
137
            
138
                gp.transform(at);
139
                InitHandler inithandler=(InitHandler)getStretchingHandlers()[0];
140
                //CenterHandler centerhandler=(CenterHandler)getHandlers()[1];
141
                EndHandler endhandler=(EndHandler)getStretchingHandlers()[1];
142
                Point2D aux1=new Point2D.Double();
143
                Point2D aux2=new Point2D.Double();
144
                Point2D aux3=new Point2D.Double();
145
                at.transform(inithandler.getPoint(),aux1);
146
                inithandler.setPoint(aux1);
147
                //at.transform(centerhandler.getPoint(),aux2);
148
                //centerhandler.setPoint(aux2);
149
                at.transform(endhandler.getPoint(),aux3);
150
                endhandler.setPoint(aux3);
151
                CenterSelHandler centerhandler=(CenterSelHandler)getSelectHandlers()[1];
152
                at.transform(centerhandler.getPoint(),aux2);
153
                centerhandler.setPoint(aux2);
154

    
155
        }
156
        
157
        /*
158
         * (non-Javadoc)
159
         * @see org.gvsig.fmap.geom.primitive.impl.Curve2D#getShapeType()
160
         */
161
        public int getShapeType() {
162
                return TYPES.ARC;
163
        }
164
        
165
        /*
166
         * (non-Javadoc)
167
         * @see org.gvsig.fmap.geom.primitive.impl.OrientablePrimitive2D#getStretchingHandlers()
168
         */
169
        public Handler[] getStretchingHandlers() {
170
                ArrayList handlers = new ArrayList();
171

    
172
                handlers.add(new InitHandler(0, init.getX(), init.getY()));
173
                //handlers.add(new CenterHandler(1, center.getX(), center.getY()));
174
                handlers.add(new EndHandler(1, end.getX(), end.getY()));
175

    
176
                return (Handler[]) handlers.toArray(new Handler[0]);
177
        }
178

    
179
        /*
180
         * (non-Javadoc)
181
         * @see org.gvsig.fmap.geom.primitive.impl.OrientablePrimitive2D#getSelectHandlers()
182
         */        
183
        public Handler[] getSelectHandlers() {
184
                ArrayList handlers = new ArrayList();
185

    
186
                handlers.add(new InitSelHandler(0, init.getX(), init.getY()));
187
                handlers.add(new CenterSelHandler(1, middle.getX(), middle.getY()));
188
                handlers.add(new EndSelHandler(2, end.getX(), end.getY()));
189

    
190
                return (Handler[]) handlers.toArray(new Handler[0]);
191
        }
192
        /**
193
         * DOCUMENT ME!
194
         *
195
         * @author Vicente Caballero Navarro
196
         */        
197
        class CenterSelHandler extends AbstractHandler implements CenterHandler{
198
                /**
199
                 * Crea un nuevo PointHandler.
200
                 *
201
                 * @param i DOCUMENT ME!
202
                 * @param x DOCUMENT ME!
203
                 * @param y DOCUMENT ME!
204
                 */
205
                public CenterSelHandler(int i, double x, double y) {
206
                    middle = new Point2D.Double(x, y);
207
                        index = i;
208
                }
209

    
210
                /**
211
                 * DOCUMENT ME!
212
                 *
213
                 * @param x DOCUMENT ME!
214
                 * @param y DOCUMENT ME!
215
                 *
216
                 * @return DOCUMENT ME!
217
                 */
218
                public void move(double x, double y) {
219
                }
220
                public void setPoint(Point2D p){
221
                    middle=p;
222
                }
223
                public Point2D getPoint(){
224
                        return middle;
225
                }
226

    
227
                /**
228
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
229
                 */
230
                public void set(double x, double y) {
231
                    middle=new Point2D.Double(x,y);
232
                        java.awt.geom.Arc2D arco = UtilFunctions.createArc(init, middle, end);
233
                        gp = new GeneralPathX(arco.getPathIterator(null));
234
                }
235
        }
236

    
237
        /**
238
         * DOCUMENT ME!
239
         *
240
         * @author Vicente Caballero Navarro
241
         */
242
        class InitHandler extends AbstractHandler implements FinalHandler{
243
                /**
244
                 * Crea un nuevo PointHandler.
245
                 *
246
                 * @param i DOCUMENT ME!
247
                 * @param x DOCUMENT ME!
248
                 * @param y DOCUMENT ME!
249
                 */
250
                public InitHandler(int i, double x, double y) {
251
                        init = new Point2D.Double(x, y);
252
                        index = i;
253
                }
254

    
255
                /**
256
                 * DOCUMENT ME!
257
                 *
258
                 * @param x DOCUMENT ME!
259
                 * @param y DOCUMENT ME!
260
                 *
261
                 * @return DOCUMENT ME!
262
                 */
263
                public void move(double x, double y) {
264
                        Point2D mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
265
                        double dist=mediop.distance(middle);
266
                        init=new Point2D.Double(init.getX()+x,init.getY()+y);
267

    
268
                        mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
269
                        Point2D[] perp=UtilFunctions.getPerpendicular(init,end,mediop);
270
                        if (UtilFunctions.getAngle(end,init)<=Math.PI){
271
                                dist=-dist;
272
                        }
273
                        middle=UtilFunctions.getPoint(mediop,perp[1],dist);
274

    
275
                        java.awt.geom.Arc2D arco = UtilFunctions.createArc(init,middle, end);
276
                        gp=new GeneralPathX(arco.getPathIterator(null));
277
                }
278
                public void setPoint(Point2D p){
279
                        init=p;
280
                }
281
                public Point2D getPoint(){
282
                        return init;
283
                }
284

    
285
                /**
286
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
287
                 */
288
                public void set(double x, double y) {
289
                        }
290
        }
291

    
292
        /**
293
         * DOCUMENT ME!
294
         *
295
         * @author Vicente Caballero Navarro
296
         */
297
        class EndHandler extends AbstractHandler implements FinalHandler{
298
                /**
299
                 * Crea un nuevo PointHandler.
300
                 *
301
                 * @param i DOCUMENT ME!
302
                 * @param x DOCUMENT ME!
303
                 * @param y DOCUMENT ME!
304
                 */
305
                public EndHandler(int i, double x, double y) {
306
                        end = new Point2D.Double(x, y);
307
                        index = i;
308
                }
309

    
310
                /**
311
                 * DOCUMENT ME!
312
                 *
313
                 * @param x DOCUMENT ME!
314
                 * @param y DOCUMENT ME!
315
                 *
316
                 * @return DOCUMENT ME!
317
                 */
318
                public void move(double x, double y) {
319
                        Point2D mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
320
                        double dist=mediop.distance(middle);
321
                        end=new Point2D.Double(end.getX()+x,end.getY()+y);
322

    
323
                        mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
324
                        Point2D[] perp=UtilFunctions.getPerpendicular(init,end,mediop);
325
                        if (UtilFunctions.getAngle(end,init)<=Math.PI){
326
                                dist=-dist;
327
                        }
328
                        middle=UtilFunctions.getPoint(mediop,perp[1],dist);
329

    
330
                        java.awt.geom.Arc2D arco = UtilFunctions.createArc(init,middle, end);
331
                        gp=new GeneralPathX(arco.getPathIterator(null));
332
                }
333
                public void setPoint(Point2D p){
334
                        end=p;
335
                }
336
                public Point2D getPoint(){
337
                        return end;
338
                }
339

    
340
                /**
341
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
342
                 */
343
                public void set(double x, double y) {
344

    
345
                }
346
        }
347

    
348
        /**
349
         * DOCUMENT ME!
350
         *
351
         * @author Vicente Caballero Navarro
352
         */
353
        class InitSelHandler extends AbstractHandler implements FinalHandler{
354
                /**
355
                 * Crea un nuevo PointHandler.
356
                 *
357
                 * @param i DOCUMENT ME!
358
                 * @param x DOCUMENT ME!
359
                 * @param y DOCUMENT ME!
360
                 */
361
                public InitSelHandler(int i, double x, double y) {
362
                        init = new Point2D.Double(x, y);
363
                        index = i;
364
                }
365

    
366
                /**
367
                 * DOCUMENT ME!
368
                 *
369
                 * @param x DOCUMENT ME!
370
                 * @param y DOCUMENT ME!
371
                 *
372
                 * @return DOCUMENT ME!
373
                 */
374
                public void move(double x, double y) {
375
                        Point2D mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
376
                        double dist=mediop.distance(middle);
377
                        init=new Point2D.Double(init.getX()+x,init.getY()+y);
378

    
379
                        mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
380
                        Point2D[] perp=UtilFunctions.getPerpendicular(init,end,mediop);
381
                        if (UtilFunctions.getAngle(end,init)<=Math.PI){
382
                                dist=-dist;
383
                        }
384
                        middle=UtilFunctions.getPoint(mediop,perp[1],dist);
385

    
386
                        java.awt.geom.Arc2D arco = UtilFunctions.createArc(init,middle, end);
387
                        gp=new GeneralPathX(arco.getPathIterator(null));
388
                }
389
                public void setPoint(Point2D p){
390
                        init=p;
391
                }
392
                public Point2D getPoint(){
393
                        return init;
394
                }
395

    
396
                /**
397
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
398
                 */
399
                public void set(double x, double y) {
400
                        Point2D mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
401
                        double dist=mediop.distance(middle);
402
                        init=new Point2D.Double(x,y);
403

    
404
                        mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
405
                        // TODO comentado para quitar warning: Point2D[] perp=UtilFunctions.getPerpendicular(init,end,mediop);
406
                        if (UtilFunctions.getAngle(end,init)<=Math.PI){
407
                                dist=-dist;
408
                        }
409
                        ///center=TrigonometricalFunctions.getPoint(mediop,perp[1],dist);
410
                        java.awt.geom.Arc2D arco = UtilFunctions.createArc(init,middle, end);
411
                        gp=new GeneralPathX(arco.getPathIterator(null));
412
                }
413
        }
414

    
415
        /**
416
         * DOCUMENT ME!
417
         *
418
         * @author Vicente Caballero Navarro
419
         */
420
        class EndSelHandler extends AbstractHandler implements FinalHandler{
421
                /**
422
                 * Crea un nuevo PointHandler.
423
                 *
424
                 * @param i DOCUMENT ME!
425
                 * @param x DOCUMENT ME!
426
                 * @param y DOCUMENT ME!
427
                 */
428
                public EndSelHandler(int i, double x, double y) {
429
                        end = new Point2D.Double(x, y);
430
                        index = i;
431
                }
432

    
433
                /**
434
                 * DOCUMENT ME!
435
                 *
436
                 * @param x DOCUMENT ME!
437
                 * @param y DOCUMENT ME!
438
                 *
439
                 * @return DOCUMENT ME!
440
                 */
441
                public void move(double x, double y) {
442
                        Point2D mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
443
                        double dist=mediop.distance(middle);
444
                        end=new Point2D.Double(end.getX()+x,end.getY()+y);
445

    
446
                        mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
447
                        Point2D[] perp=UtilFunctions.getPerpendicular(init,end,mediop);
448
                        if (UtilFunctions.getAngle(end,init)<=Math.PI){
449
                                dist=-dist;
450
                        }
451
                        middle=UtilFunctions.getPoint(mediop,perp[1],dist);
452

    
453
                        java.awt.geom.Arc2D arco = UtilFunctions.createArc(init,middle, end);
454
                        gp=new GeneralPathX(arco.getPathIterator(null));
455
                }
456
                public void setPoint(Point2D p){
457
                        end=p;
458
                }
459
                public Point2D getPoint(){
460
                        return end;
461
                }
462

    
463
                /**
464
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
465
                 */
466
                public void set(double x, double y) {
467
                        Point2D mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
468
                        double dist=mediop.distance(middle);
469
                        end=new Point2D.Double(x,y);
470

    
471
                        mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
472
                        // TODO comentado para quitar warning: Point2D[] perp=UtilFunctions.getPerpendicular(init,end,mediop);
473
                        if (UtilFunctions.getAngle(end,init)<=Math.PI){
474
                                dist=-dist;
475
                        }
476
                        ///center=TrigonometricalFunctions.getPoint(mediop,perp[1],dist);
477
                        java.awt.geom.Arc2D arco = UtilFunctions.createArc(init,middle, end);
478
                        gp=new GeneralPathX(arco.getPathIterator(null));
479
                }
480
        }
481

    
482
        /* (non-Javadoc)
483
         * @see com.iver.cit.gvsig.fmap.core.FPolyline2D#intersects(java.awt.geom.Rectangle2D)
484
         */
485
        public boolean intersects(Rectangle2D r) {
486
                return gp.intersects(r);
487
        }
488

    
489
        /* (non-Javadoc)
490
         * @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)
491
         */
492
        public void setPoints(Point p1, Point p2, Point p3) {
493
                Point2D _p1 = new java.awt.geom.Point2D.Double(p1.getCoordinateAt(0), p1.getCoordinateAt(1));
494
                Point2D _p2 = new java.awt.geom.Point2D.Double(p2.getCoordinateAt(0), p2.getCoordinateAt(1));
495
                Point2D _p3 = new java.awt.geom.Point2D.Double(p3.getCoordinateAt(0), p3.getCoordinateAt(1));
496
                setPoints(_p1, _p2, _p3);
497
        }
498

    
499
        /* (non-Javadoc)
500
         * @see org.gvsig.fmap.geom.primitive.Curve2D#setGeneralPath(org.gvsig.fmap.geom.primitive.GeneralPathX)
501
         */
502
        public void setGeneralPath(GeneralPathX generalPathX) {
503
                throw new UnsupportedOperationException("Use setPoints(Point p1, Point p2, Point p3)");
504
        }
505

    
506
        /* (non-Javadoc)
507
         * @see org.gvsig.fmap.geom.primitive.Arc#setPoints(java.awt.geom.Point2D, java.awt.geom.Point2D, java.awt.geom.Point2D)
508
         */
509
        private void setPoints(Point2D p1, Point2D p2, Point2D p3) {
510
                java.awt.geom.Arc2D arco = UtilFunctions.createArc(p1, p2, p3);
511
                if (arco == null) {
512
            logger.info("Did not set arc points (probably aligned points): "
513
                + p1.getX() + " " + p1.getY() + " :: "
514
                + p2.getX() + " " + p2.getY() + " :: "
515
                + p3.getX() + " " + p3.getY());
516
                    throw new IllegalArgumentException("Did not set arc points (probably aligned points).");
517
                }
518
                this.gp = new GeneralPathX(arco.getPathIterator(null));
519
                this.init = p1;
520
        this.middle = p2;
521
                this.end = p3;
522
        }
523

    
524
        /* (non-Javadoc)
525
         * @see org.gvsig.fmap.geom.primitive.Arc#setPoints(org.gvsig.fmap.geom.primitive.Point, double, double, double)
526
         */
527
        public void setPoints(Point center, double radius, double initAngle,
528
                        double angleExt) {
529
                Point2D _center = new java.awt.geom.Point2D.Double(center.getCoordinateAt(0), center.getCoordinateAt(1));
530
                setPoints(_center, radius, initAngle, angleExt);
531
        }
532
        
533
    /* (non-Javadoc)
534
     * @see org.gvsig.fmap.geom.primitive.Arc#setPointsStartExt(org.gvsig.fmap.geom.primitive.Point, double, double, double)
535
     */
536
    public void setPointsStartExt(Point center, double radius,
537
        double startAngle, double angleExt) {
538
        
539
        setPoints(center, radius, startAngle, angleExt);
540
    }
541

    
542
    /* (non-Javadoc)
543
     * @see org.gvsig.fmap.geom.primitive.Arc#setPointsStartEnd(org.gvsig.fmap.geom.primitive.Point, double, double, double)
544
     */
545
    public void setPointsStartEnd(Point center, double radius,
546
        double startAngle, double endAngle) {
547
        
548
        if (startAngle == endAngle) {
549
            setPointsStartExt(center, radius, startAngle, 0);
550
        } else {
551
            
552
            /*
553
             * Normalize then force clockwise:
554
             */
555
            double norm_start = normalizeAngle(startAngle);
556
            double norm_end = normalizeAngle(endAngle);
557
            double ang_ext = 0;
558

    
559
            // clockwise
560
            // ang_ext must be positive
561
            if (norm_start >= norm_end) {
562
                ang_ext = norm_start - norm_end;
563
            } else {
564
                ang_ext = 2 * Math.PI - (norm_end - norm_start);
565
            }
566

    
567
            // finally call other method with ang_ext
568
            setPointsStartExt(center, radius, startAngle, ang_ext);
569
        }
570
    }
571

    
572
        /**
573
         * Leaves the angle between PI and -PI
574
     * @param angle (radians)
575
     * @return
576
     */
577
    private double normalizeAngle(double angle) {
578
        
579
        if (angle > -Math.PI && angle <= Math.PI) {
580
            return angle;
581
        }
582
        
583
        if (angle == Double.NEGATIVE_INFINITY
584
            || angle == Double.POSITIVE_INFINITY) {
585
            return 0;
586
        }
587
        
588
        double abs_ang = Math.abs(angle);
589
        double remove = Math.floor(abs_ang / (2 * Math.PI));
590
        remove = remove * 2 * Math.PI;
591
        double resp = 0;
592
        
593
        if (angle > 0) {
594
            resp = angle - remove;
595
            if (resp > Math.PI) {
596
                // final adjustment
597
                resp = resp - 2 * Math.PI;
598
            }
599
        } else {
600
            resp = angle + remove;
601
            if (resp <= -Math.PI) {
602
                // final adjustment
603
                resp = resp + 2 * Math.PI;
604
            }
605
        }
606
        
607
        return resp;
608
    }
609

    
610
    /* (non-Javadoc)
611
         * @see org.gvsig.fmap.geom.primitive.Arc#setPoints(java.awt.geom.Point2D, double, double, double)
612
         */
613
        private void setPoints(Point2D center, double radius, double initAngle,
614
                        double angleExt) {
615
                java.awt.geom.Arc2D arco = UtilFunctions.createArc(center, radius, initAngle, angleExt);
616

    
617
                java.awt.geom.Arc2D semiarco = UtilFunctions.createArc(center, radius, initAngle, angleExt/2);
618
                if (arco == null || semiarco == null) {
619
                    logger.info("Did not set arc points (probably aligned points)");
620
                        return;
621
                }
622

    
623
                Point2D p1 = arco.getStartPoint();
624
                Point2D p2 = semiarco.getEndPoint();
625
                Point2D p3 = arco.getEndPoint();
626

    
627
                setPoints(p1, p2, p3);                
628
        }
629
        
630

    
631

    
632
        /* (non-Javadoc)
633
         * @see org.gvsig.fmap.geom.primitive.Curve2D#setPoints(org.gvsig.fmap.geom.primitive.Point, org.gvsig.fmap.geom.primitive.Point)
634
         */
635
        public void setPoints(Point startPoint, Point endPoint) {
636
                throw new UnsupportedOperationException("Use setGeneralPathX");
637
        }
638

    
639
        /* (non-Javadoc)
640
         * @see org.gvsig.fmap.geom.primitive.Arc#getEndPoint()
641
         */
642
        public Point getEndPoint() {
643
                return new org.gvsig.fmap.geom.primitive.impl.Point2D(end.getX(), end.getY());
644
        }
645

    
646
        /* (non-Javadoc)
647
         * @see org.gvsig.fmap.geom.primitive.Arc#getInitPoint()
648
         */
649
        public Point getInitPoint() {
650
                return new org.gvsig.fmap.geom.primitive.impl.Point2D(init.getX(), init.getY());
651
        }
652

    
653
        /* (non-Javadoc)
654
         * @see org.gvsig.fmap.geom.primitive.Arc#getCenterPoint()
655
         */
656
        public Point getCenterPoint() {
657
                Point2D p = UtilFunctions.getCenter(init, middle,end);
658
                try {
659
                        return new org.gvsig.fmap.geom.primitive.impl.Point2D(p.getX(), p.getY());
660
                } catch (Exception e) {
661
                        return  null;
662
                }
663
        }
664

    
665

    
666

    
667
                
668
}