001package sec.geo.shape;
002
003import sec.sun.awt.geom.Area;
004import sec.geo.GeoBlock2;
005import sec.geo.GeoPoint;
006import java.util.ArrayList;
007import sec.geo.ShapeObject;
008import sec.geo.kml.KmlOptions.AltitudeMode;
009
010public class Route /*extends APath*/ {
011
012    private double minAltitudeMeters;
013    private double maxAltitudeMeters;
014    protected double maxDistanceMeters;
015    protected double flatnessDistanceMeters;
016
017    protected AltitudeMode altitudeMode;
018    protected int limit;
019    private double leftWidthMeters;
020    private double rightWidthMeters;
021    private Area shape;
022    protected final ArrayList<GeoPoint> points;
023
024    public Route() {
025        maxDistanceMeters = 100000;
026        flatnessDistanceMeters = 1;
027        limit = 4;
028        points = new ArrayList<GeoPoint>();
029    }
030
031    public void addPoint(GeoPoint point) {
032        points.add(point);
033        shapeChanged();
034    }
035
036    public void addPoints(ArrayList<GeoPoint> points) {
037        this.points.addAll(points);
038        shapeChanged();
039    }
040
041    public void setLeftWidth(double widthMeters) {
042        this.leftWidthMeters = widthMeters;
043        shapeChanged();
044    }
045
046    public void setRightWidth(double widthMeters) {
047        this.rightWidthMeters = widthMeters;
048        shapeChanged();
049    }
050
051    //@Override
052    protected Area createShape() {
053        Area route = new Area();
054        GeoPoint previousPoint = null;
055        int n = points.size();
056        //for (int i = 0; i < points.size(); i++) 
057        for (int i = 0; i < n; i++) {
058
059            GeoPoint point = points.get(i);
060
061            if (previousPoint != null) {
062
063                // Skip if points are the same -- doesn't take into account height difference
064                if (previousPoint.equals(point)) {
065                    continue;
066                }
067
068                // Draw rectangle connection
069                GeoBlock2 block = new GeoBlock2(previousPoint, point, this.leftWidthMeters, this.rightWidthMeters, maxDistanceMeters,
070                        flatnessDistanceMeters, limit);
071                Area area = new Area(new ShapeObject(block));
072                route.add(area);
073
074            }
075            previousPoint = point;
076        }
077        return route;
078    }
079
080    protected void shapeChanged() {
081        shape = null;
082    }
083
084    public Area getShape() {
085        if (shape == null) {
086            shape = createShape();
087        }
088        return shape;
089    }
090
091    //protected abstract Shape createShape();
092    public double getMinAltitude() {
093        return minAltitudeMeters;
094    }
095
096    public void setMinAltitude(double minAltitudeMeters) {
097        this.minAltitudeMeters = minAltitudeMeters;
098        shapeChanged();
099    }
100
101    public double getMaxAltitude() {
102        return maxAltitudeMeters;
103    }
104
105    public void setMaxAltitude(double maxAltitudeMeters) {
106        this.maxAltitudeMeters = maxAltitudeMeters;
107        shapeChanged();
108    }
109
110    public void setMaxDistance(double maxDistanceMeters) {
111        this.maxDistanceMeters = maxDistanceMeters;
112        shapeChanged();
113    }
114
115    public void setFlatness(double flatnessDistanceMeters) {
116        this.flatnessDistanceMeters = flatnessDistanceMeters;
117        shapeChanged();
118    }
119
120    public void setLimit(int limit) {
121        this.limit = limit;
122        shapeChanged();
123    }
124
125    public AltitudeMode getAltitudeMode() {
126        return altitudeMode;
127    }
128
129    public void setAltitudeMode(AltitudeMode altitudeMode) {
130        this.altitudeMode = altitudeMode;
131    }
132}