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}