001package sec.geo.shape;
002
003import sec.sun.awt.geom.Area;
004import sec.geo.kml.KmlOptions.AltitudeMode;
005import sec.geo.GeoBlock;
006import sec.geo.GeoEllipse;
007import sec.geo.GeoPoint;
008import sec.geo.ShapeObject;
009import java.util.ArrayList;
010
011public class Orbit /* extends APath */ { //APath extends AExtrusion
012
013    private double minAltitudeMeters;
014    private double maxAltitudeMeters;
015    protected double maxDistanceMeters;
016    protected double flatnessDistanceMeters;
017    protected AltitudeMode altitudeMode;
018    private Area shape;
019    protected int limit;
020    private double widthMeters;
021    protected final ArrayList<GeoPoint> points;
022
023    public Orbit() {
024        points = new ArrayList<GeoPoint>();
025        maxDistanceMeters = 100000;
026        flatnessDistanceMeters = 1;
027        limit = 4;
028    }
029
030    public void addPoint(GeoPoint point) {
031        points.add(point);
032        shapeChanged();
033    }
034
035    public void addPoints(ArrayList<GeoPoint> points) {
036        this.points.addAll(points);
037        shapeChanged();
038    }
039
040    public void setWidth(double widthMeters) {
041        this.widthMeters = widthMeters;
042        shapeChanged();
043    }
044
045    //@Override
046    protected Area createShape() {
047        Area orbit = new Area();
048        GeoPoint previousPoint = null;
049
050        for (GeoPoint point : points) {
051            GeoEllipse ellipse = new GeoEllipse(point, widthMeters, widthMeters, maxDistanceMeters,
052                    flatnessDistanceMeters, limit);
053            ShapeObject el = new ShapeObject(ellipse);
054                        //orbit.add(new Area(ellipse));
055            //orbit.add(new Area(el));
056            Area rhs = new Area(el);
057            orbit.add(rhs);
058
059            if (previousPoint != null) {
060                GeoBlock block = new GeoBlock(previousPoint, point, widthMeters, maxDistanceMeters,
061                        flatnessDistanceMeters, limit);
062                ShapeObject bl = new ShapeObject(block);
063                Area rhs2 = new Area(bl);
064                //orbit.add(new Area(bl));
065                orbit.add(rhs2);
066            }
067            previousPoint = point;
068        }
069        return orbit;
070    }
071
072    public Area getShape() {
073        if (shape == null) {
074            shape = createShape();
075        }
076        return shape;
077    }
078
079    protected void shapeChanged() {
080        shape = null;
081    }
082
083        //protected abstract Shape createShape();
084    public double getMinAltitude() {
085        return minAltitudeMeters;
086    }
087
088    public void setMinAltitude(double minAltitudeMeters) {
089        this.minAltitudeMeters = minAltitudeMeters;
090        shapeChanged();
091    }
092
093    public double getMaxAltitude() {
094        return maxAltitudeMeters;
095    }
096
097    public void setMaxAltitude(double maxAltitudeMeters) {
098        this.maxAltitudeMeters = maxAltitudeMeters;
099        shapeChanged();
100    }
101
102    public void setMaxDistance(double maxDistanceMeters) {
103        this.maxDistanceMeters = maxDistanceMeters;
104        shapeChanged();
105    }
106
107    public void setFlatness(double flatnessDistanceMeters) {
108        this.flatnessDistanceMeters = flatnessDistanceMeters;
109        shapeChanged();
110    }
111
112    public void setLimit(int limit) {
113        this.limit = limit;
114        shapeChanged();
115    }
116
117    public AltitudeMode getAltitudeMode() {
118        return altitudeMode;
119    }
120
121    public void setAltitudeMode(AltitudeMode altitudeMode) {
122        this.altitudeMode = altitudeMode;
123    }
124}