package geo_objects; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Polygon; import java.awt.RadialGradientPaint; import java.awt.geom.Point2D; import org.jdesktop.swingx.mapviewer.GeoPosition; import device.Device; import map.MapLayer; import utilities.MapCalc; import utilities.UColor; /** * @author Ahcene Bounceur * @version 1.0 */ public class GeoZone { protected int type = Device.GEOZONE; private double [] coordX ; private double [] coordY ; private int [] iCoordX ; private int [] iCoordY ; private int size = 0 ; private boolean selected = false ; private int mapZoom = 0; private double longitude = 0; private double latitude = 0; private int cx = 0; private int cy = 0; public GeoZone(int size) { mapZoom = MapLayer.mapViewer.getZoom(); this.size = size; coordX = new double [size] ; coordY = new double [size] ; iCoordX = new int [size] ; iCoordY = new int [size] ; } public void set(double x, double y, double z, int i) { coordX[i] = x; coordY[i] = y; computeIntCoord(i); } public void set(String x, String y, String z, int i) { coordX[i] = Double.valueOf(x); coordY[i] = Double.valueOf(y); computeIntCoord(i); } public double getXCoord(int i) { return coordX[i]; } public double getYCoord(int i) { return coordY[i]; } public double [] getXCoords() { return coordX; } public double [] getYCoords() { return coordY; } public int size() { return size; } public void computeIntCoord(int i) { int [] coord = MapCalc.geoToPixelMapA(Double.valueOf(coordX[i]), Double.valueOf(coordY[i])); iCoordX[i]=coord[0]; iCoordY[i]=coord[1]; coord = MapCalc.geoToPixelMapA(latitude, longitude); cx = coord[0]; cy = coord[1]; } public void computeIntCoords() { int [] coord = null ; for(int i=0; i<size; i++) { coord = MapCalc.geoToPixelMapA(Double.valueOf(coordX[i]), Double.valueOf(coordY[i])); iCoordX[i]=coord[0]; iCoordY[i]=coord[1]; coord = MapCalc.geoToPixelMapA(latitude, longitude); cx = coord[0]; cy = coord[1]; } } public void computeGeoCoords() { for(int i=0; i<size; i++) { GeoPosition gp = MapCalc.pixelMapToGeo(iCoordX[i], iCoordY[i]); coordX[i] = gp.getLatitude(); coordY[i] = gp.getLongitude(); } } public void draw(Graphics g) { int newZoom = MapLayer.mapViewer.getZoom(); if(newZoom != mapZoom) { mapZoom = newZoom; computeIntCoords() ; } Graphics2D g2 = (Graphics2D) g; Point2D center = new Point2D.Float(cx, cy); double paintRadius = 300 * (4.00/Math.pow(2, MapLayer.mapViewer.getZoom())); float[] dist = {0.0f, 0.2f, 0.7f}; Color [] colors = new Color[3]; colors[0] = new Color(255, 0, 0, 80); colors[1] = new Color(221, 148, 32, 50); colors[2] = new Color(255, 255, 255, 0); if(MapLayer.dark) { colors[0] = new Color(255, 0, 0, 80); colors[1] = new Color(221, 148,32, 50); colors[2] = new Color(221, 0,32, 0); } if(selected) { colors[0] = new Color(250, 5, 0, 80); colors[1] = new Color(250, 5, 0, 30); colors[2] = new Color(250, 5, 0, 0); } RadialGradientPaint p = new RadialGradientPaint(center, (float) paintRadius, dist, colors); g2.setPaint(p); g2.fillPolygon(iCoordX, iCoordY, size); g2.setColor(UColor.RED_TRANSPARENT); if(selected) { g2.setColor(UColor.RED); if(MapLayer.dark) g2.setColor(UColor.ORANGE); } g2.drawPolygon(iCoordX, iCoordY, size); } public boolean inside(int xs, int ys) { Point p = new Point(xs, ys); GeoPosition gp = MapLayer.mapViewer.convertPointToGeoPosition(p); Point2D p1 = MapLayer.mapViewer.getTileFactory().geoToPixel(gp, MapLayer.mapViewer.getZoom()); Polygon poly = new Polygon(iCoordX,iCoordY,size); return (poly.contains(p1)); } public void setSelected(boolean b) { selected = b ; } public boolean isSelected() { return selected ; } public boolean intersect(Polygon p) { for (int i=0; i<size; i++){ if(p.contains(iCoordX[i], iCoordY[i])) return true; } return false; } public void translate(double xref, double yref, double zm) { for(int i=0; i<size; i++) { coordX[i] = coordX[i]/zm+xref ; coordY[i] = coordY[i]/zm+yref ; computeIntCoord(i); } } public boolean contains(Point2D p) { Polygon poly = new Polygon(iCoordX, iCoordY, size); return (poly.contains(p)); } public boolean contains(double px, double py) { Polygon poly = new Polygon(iCoordX, iCoordY, size); return poly.contains(px, py); } public Polygon toPolygon() { Polygon poly = new Polygon(iCoordX, iCoordY, size); return poly; } public void display() { for(int i=0; i<size; i++) { System.out.print("("+iCoordX[i]+", "+iCoordY[i]+") "); } System.out.println(); } public int getICoordX(int i) { return iCoordX[i]; } public int getICoordY(int i) { return iCoordY[i]; } public void setICoordX(int i, int v) { iCoordX[i] = v; } public void setICoordY(int i, int v) { iCoordY[i] = v; } public void setInt(int x, int y, int i) { iCoordX[i]=x; iCoordY[i]=y; } public void setCxCy(double longitude, double latitude) { this.longitude = longitude ; this.latitude = latitude; int [] coord = MapCalc.geoToPixelMapA(latitude, longitude); cx = coord[0]; cy = coord[1]; } public int getCx() { return cx ; } public int getCy() { return cy ; } }