blob: 15482a3cc11e218adb8728d29acd370873a44a92 [file] [log] [blame]
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);
}
}