Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libFMap_geometries / src / org / gvsig / fmap / geom / primitive / impl / Arc2D.java @ 39063

History | View | Annotate | Download (18.8 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
                gp.transform(at);
134
                InitHandler inithandler=(InitHandler)getStretchingHandlers()[0];
135
                //CenterHandler centerhandler=(CenterHandler)getHandlers()[1];
136
                EndHandler endhandler=(EndHandler)getStretchingHandlers()[1];
137
                Point2D aux1=new Point2D.Double();
138
                Point2D aux2=new Point2D.Double();
139
                Point2D aux3=new Point2D.Double();
140
                at.transform(inithandler.getPoint(),aux1);
141
                inithandler.setPoint(aux1);
142
                //at.transform(centerhandler.getPoint(),aux2);
143
                //centerhandler.setPoint(aux2);
144
                at.transform(endhandler.getPoint(),aux3);
145
                endhandler.setPoint(aux3);
146
                CenterSelHandler centerhandler=(CenterSelHandler)getSelectHandlers()[1];
147
                at.transform(centerhandler.getPoint(),aux2);
148
                centerhandler.setPoint(aux2);
149

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

    
167
                handlers.add(new InitHandler(0, init.getX(), init.getY()));
168
                //handlers.add(new CenterHandler(1, center.getX(), center.getY()));
169
                handlers.add(new EndHandler(1, end.getX(), end.getY()));
170

    
171
                return (Handler[]) handlers.toArray(new Handler[0]);
172
        }
173

    
174
        /*
175
         * (non-Javadoc)
176
         * @see org.gvsig.fmap.geom.primitive.impl.OrientablePrimitive2D#getSelectHandlers()
177
         */        
178
        public Handler[] getSelectHandlers() {
179
                ArrayList handlers = new ArrayList();
180

    
181
                handlers.add(new InitSelHandler(0, init.getX(), init.getY()));
182
                handlers.add(new CenterSelHandler(1, middle.getX(), middle.getY()));
183
                handlers.add(new EndSelHandler(2, end.getX(), end.getY()));
184

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

    
205
                /**
206
                 * DOCUMENT ME!
207
                 *
208
                 * @param x DOCUMENT ME!
209
                 * @param y DOCUMENT ME!
210
                 *
211
                 * @return DOCUMENT ME!
212
                 */
213
                public void move(double x, double y) {
214
                }
215
                public void setPoint(Point2D p){
216
                    middle=p;
217
                }
218
                public Point2D getPoint(){
219
                        return middle;
220
                }
221

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

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

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

    
263
                        mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
264
                        Point2D[] perp=UtilFunctions.getPerpendicular(init,end,mediop);
265
                        if (UtilFunctions.getAngle(end,init)<=Math.PI){
266
                                dist=-dist;
267
                        }
268
                        middle=UtilFunctions.getPoint(mediop,perp[1],dist);
269

    
270
                        java.awt.geom.Arc2D arco = UtilFunctions.createArc(init,middle, end);
271
                        gp=new GeneralPathX(arco.getPathIterator(null));
272
                }
273
                public void setPoint(Point2D p){
274
                        init=p;
275
                }
276
                public Point2D getPoint(){
277
                        return init;
278
                }
279

    
280
                /**
281
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
282
                 */
283
                public void set(double x, double y) {
284
                        }
285
        }
286

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

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

    
318
                        mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
319
                        Point2D[] perp=UtilFunctions.getPerpendicular(init,end,mediop);
320
                        if (UtilFunctions.getAngle(end,init)<=Math.PI){
321
                                dist=-dist;
322
                        }
323
                        middle=UtilFunctions.getPoint(mediop,perp[1],dist);
324

    
325
                        java.awt.geom.Arc2D arco = UtilFunctions.createArc(init,middle, end);
326
                        gp=new GeneralPathX(arco.getPathIterator(null));
327
                }
328
                public void setPoint(Point2D p){
329
                        end=p;
330
                }
331
                public Point2D getPoint(){
332
                        return end;
333
                }
334

    
335
                /**
336
                 * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
337
                 */
338
                public void set(double x, double y) {
339

    
340
                }
341
        }
342

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

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

    
374
                        mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
375
                        Point2D[] perp=UtilFunctions.getPerpendicular(init,end,mediop);
376
                        if (UtilFunctions.getAngle(end,init)<=Math.PI){
377
                                dist=-dist;
378
                        }
379
                        middle=UtilFunctions.getPoint(mediop,perp[1],dist);
380

    
381
                        java.awt.geom.Arc2D arco = UtilFunctions.createArc(init,middle, end);
382
                        gp=new GeneralPathX(arco.getPathIterator(null));
383
                }
384
                public void setPoint(Point2D p){
385
                        init=p;
386
                }
387
                public Point2D getPoint(){
388
                        return init;
389
                }
390

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

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

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

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

    
441
                        mediop=new Point2D.Double((init.getX()+end.getX())/2,(init.getY()+end.getY())/2);
442
                        Point2D[] perp=UtilFunctions.getPerpendicular(init,end,mediop);
443
                        if (UtilFunctions.getAngle(end,init)<=Math.PI){
444
                                dist=-dist;
445
                        }
446
                        middle=UtilFunctions.getPoint(mediop,perp[1],dist);
447

    
448
                        java.awt.geom.Arc2D arco = UtilFunctions.createArc(init,middle, end);
449
                        gp=new GeneralPathX(arco.getPathIterator(null));
450
                }
451
                public void setPoint(Point2D p){
452
                        end=p;
453
                }
454
                public Point2D getPoint(){
455
                        return end;
456
                }
457

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

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

    
477
        /* (non-Javadoc)
478
         * @see com.iver.cit.gvsig.fmap.core.FPolyline2D#intersects(java.awt.geom.Rectangle2D)
479
         */
480
        public boolean intersects(Rectangle2D r) {
481
                return gp.intersects(r);
482
        }
483

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

    
494
        /* (non-Javadoc)
495
         * @see org.gvsig.fmap.geom.primitive.Curve2D#setGeneralPath(org.gvsig.fmap.geom.primitive.GeneralPathX)
496
         */
497
        public void setGeneralPath(GeneralPathX generalPathX) {
498
                throw new UnsupportedOperationException("Use setPoints(Point p1, Point p2, Point p3)");
499
        }
500

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

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

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

    
554
            // clockwise
555
            // ang_ext must be positive
556
            if (norm_start >= norm_end) {
557
                ang_ext = norm_start - norm_end;
558
            } else {
559
                ang_ext = 2 * Math.PI - (norm_end - norm_start);
560
            }
561

    
562
            // finally call other method with ang_ext
563
            setPointsStartExt(center, radius, startAngle, ang_ext);
564
        }
565
    }
566

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

    
605
    /* (non-Javadoc)
606
         * @see org.gvsig.fmap.geom.primitive.Arc#setPoints(java.awt.geom.Point2D, double, double, double)
607
         */
608
        private void setPoints(Point2D center, double radius, double initAngle,
609
                        double angleExt) {
610
                java.awt.geom.Arc2D arco = UtilFunctions.createArc(center, radius, initAngle, angleExt);
611

    
612
                java.awt.geom.Arc2D semiarco = UtilFunctions.createArc(center, radius, initAngle, angleExt/2);
613
                if (arco == null || semiarco == null) {
614
                    logger.info("Did not set arc points (probably aligned points)");
615
                        return;
616
                }
617

    
618
                Point2D p1 = arco.getStartPoint();
619
                Point2D p2 = semiarco.getEndPoint();
620
                Point2D p3 = arco.getEndPoint();
621

    
622
                setPoints(p1, p2, p3);                
623
        }
624
        
625

    
626

    
627
        /* (non-Javadoc)
628
         * @see org.gvsig.fmap.geom.primitive.Curve2D#setPoints(org.gvsig.fmap.geom.primitive.Point, org.gvsig.fmap.geom.primitive.Point)
629
         */
630
        public void setPoints(Point startPoint, Point endPoint) {
631
                throw new UnsupportedOperationException("Use setGeneralPathX");
632
        }
633

    
634
        /* (non-Javadoc)
635
         * @see org.gvsig.fmap.geom.primitive.Arc#getEndPoint()
636
         */
637
        public Point getEndPoint() {
638
                return new org.gvsig.fmap.geom.primitive.impl.Point2D(end.getX(), end.getY());
639
        }
640

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

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

    
660

    
661

    
662
                
663
}