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}