001package sec.geo.shape;
002
003import sec.geo.GeoPath;
004import java.util.ArrayList;
005import sec.geo.GeoPoint;
006import sec.geo.ShapeObject;
007import sec.geo.kml.KmlOptions.AltitudeMode;
008
009public class Polyarc /* extends APath implements IArc */ {   //APath extedns AExtruusion
010
011    private double minAltitudeMeters;
012    private double maxAltitudeMeters;
013    private ShapeObject shape;  //was shape
014    protected double maxDistanceMeters;
015    protected double flatnessDistanceMeters;
016
017    protected int limit;
018    private GeoPoint pivot;
019    private double radiusMeters;
020    private double leftAzimuthDegrees, rightAzimuthDegrees;
021    protected AltitudeMode altitudeMode;
022
023    protected final ArrayList<GeoPoint> points;
024
025    public Polyarc() {
026        points = new ArrayList<GeoPoint>();
027        maxDistanceMeters = 100000;
028        flatnessDistanceMeters = 1;
029        limit = 4;
030    }
031
032    public void addPoint(GeoPoint point) {
033        points.add(point);
034        shapeChanged();
035    }
036
037    public void addPoints(ArrayList<GeoPoint> points) {
038        this.points.addAll(points);
039        shapeChanged();
040    }
041
042    //@Override
043    public void setRadius(double radiusMeters) {
044        this.radiusMeters = radiusMeters;
045        shapeChanged();
046    }
047
048    //@Override
049    public void setPivot(GeoPoint pivot) {
050        this.pivot = pivot;
051        shapeChanged();
052    }
053
054    public void setRightAzimuthDegrees(double rightAzimuthDegrees) {
055        this.rightAzimuthDegrees = rightAzimuthDegrees;
056        shapeChanged();
057    }
058
059    public void setLeftAzimuthDegrees(double leftAzimuthDegrees) {
060        this.leftAzimuthDegrees = leftAzimuthDegrees;
061        shapeChanged();
062    }
063
064    //@Override
065    protected ShapeObject createShape() {
066        GeoPath path = new GeoPath(maxDistanceMeters, flatnessDistanceMeters, limit);
067        int n = points.size();
068        //for (int i = 0; i < points.size(); i++) 
069        for (int i = 0; i < n; i++) {
070            GeoPoint point = points.get(i);
071            if (i == 0) {
072                path.moveTo(point);
073            } else {
074                path.lineTo(point);
075            }
076        }
077        path.arcTo(pivot, radiusMeters * 2, radiusMeters * 2, leftAzimuthDegrees, rightAzimuthDegrees);
078        path.closePath();
079        return new ShapeObject(path);
080    }
081
082    protected void shapeChanged() {
083        shape = null;
084    }
085
086    public ShapeObject getShape() {
087        if (shape == null) {
088            shape = createShape();
089        }
090        return shape;
091    }
092
093        //protected abstract Shape createShape();
094    public double getMinAltitude() {
095        return minAltitudeMeters;
096    }
097
098    public void setMinAltitude(double minAltitudeMeters) {
099        this.minAltitudeMeters = minAltitudeMeters;
100        shapeChanged();
101    }
102
103    public double getMaxAltitude() {
104        return maxAltitudeMeters;
105    }
106
107    public void setMaxAltitude(double maxAltitudeMeters) {
108        this.maxAltitudeMeters = maxAltitudeMeters;
109        shapeChanged();
110    }
111
112    public void setMaxDistance(double maxDistanceMeters) {
113        this.maxDistanceMeters = maxDistanceMeters;
114        shapeChanged();
115    }
116
117    public void setFlatness(double flatnessDistanceMeters) {
118        this.flatnessDistanceMeters = flatnessDistanceMeters;
119        shapeChanged();
120    }
121
122    public void setLimit(int limit) {
123        this.limit = limit;
124        shapeChanged();
125    }
126
127    public AltitudeMode getAltitudeMode() {
128        return altitudeMode;
129    }
130
131    public void setAltitudeMode(AltitudeMode altitudeMode) {
132        this.altitudeMode = altitudeMode;
133    }
134}