package org.eclipse.stem.ui.grapheditor; | |
import java.awt.Polygon; | |
import java.util.ArrayList; | |
import java.util.List; | |
import org.eclipse.stem.definitions.adapters.spatial.geo.LatLong.Segment; | |
import org.eclipse.stem.ui.Activator; | |
public class DisplayPolygon extends Polygon | |
{ | |
Polygon transformedPolygon; | |
Polygon originalPolygon; | |
int npoints; | |
String name="no"; | |
public DisplayPolygon (Segment segment) | |
{ | |
this.transformedPolygon = getPolygon(segment); | |
this.originalPolygon = getPolygon(segment); | |
if (this.originalPolygon == null) this.npoints=0; | |
else this.npoints = this.originalPolygon.npoints; | |
for (int i=0; i<this.npoints; i++) | |
{ | |
this.transformedPolygon.xpoints[i] /= GraphDefs.R; | |
this.transformedPolygon.ypoints[i] /= GraphDefs.R; | |
} | |
} | |
public DisplayPolygon (String name, Segment segment) | |
{ | |
this(segment); | |
this.name = name; | |
} | |
double getArea() | |
{ | |
double area = 0; | |
int[] x = this.originalPolygon.xpoints; | |
int[] y = this.originalPolygon.ypoints; | |
for (int i = 0; i < x.length-1; i ++) { | |
area += (((double)x[i]*(double)y[i+1]) - ((double)x[i+1]*(double)y[i])); | |
} | |
area /= 2.0; | |
return area; | |
} | |
private static Polygon getPolygon(Segment segment) | |
{ | |
int size = segment.size(); | |
int[] lt = new int[size]; | |
int[] lg = new int[size]; | |
for (int i = 0; i < size; i ++) { | |
if ((segment.latitude(i) > Integer.MAX_VALUE) || | |
(segment.longitude(i) > Integer.MAX_VALUE)) | |
Activator.logError("Coordinate range too large... Exiting!", null); | |
lt[i] = -(int) Math.round(segment.latitude(i)* (int) GraphDefs.R ); | |
lg[i] = (int) Math.round(segment.longitude(i)* (int) GraphDefs.R ); | |
} | |
// check if it is a polygon, repair if necessary | |
if(!(size > 2 && lt[0] == lt[size-1] && lg[0] == lg[size - 1] | |
)) | |
{ | |
if (size > 2) { | |
size++; | |
int[] lt_new = new int[size]; | |
int[] lg_new = new int[size]; | |
for (int i=0; i<size-1; i++) | |
{ | |
lt_new[i] = lt[i]; | |
lg_new[i] = lg[i]; | |
} | |
lt_new[size-1] = lt[0]; | |
lg_new[size-1] = lg[0]; | |
if(size > 2 && lt_new[0] == lt_new[size-1] && lg_new[0] == lg_new[size - 1]) | |
return new Polygon(lg_new, lt_new, size); | |
} | |
else return null; | |
} | |
return new Polygon(lg, lt, size); | |
} | |
public String getName() | |
{ | |
return this.name; | |
} | |
GmlPolygon getUnscaledGmlPolygon() | |
{ | |
List<Double> lat = new ArrayList<Double>(); | |
List<Double> lng = new ArrayList<Double>(); | |
for (int i=0; i<this.originalPolygon.npoints; i++) | |
{ | |
lat.add((double)this.originalPolygon.xpoints[i]/GraphDefs.R); | |
lng.add((double)-this.originalPolygon.ypoints[i]/GraphDefs.R); | |
} | |
return new GmlPolygon(this.name, lat, lng); | |
} | |
} |