package buildings; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Polygon; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.geom.Point2D; import javax.vecmath.Vector3d; import org.jdesktop.swingx.mapviewer.GeoPosition; import device.Device; import geo_objects.GeoZone; import map.MapLayer; import math.Intersect; import utilities.MapCalc; /** * @author Ahcene Bounceur * @version 1.0 */ public class Building implements MouseListener, KeyListener { protected int type = Device.BUILDING; private double[] coordX ; private double[] coordY ; private int[] iCoordX ; private int[] iCoordY ; private int nPoints = 0 ; private boolean selected = false ; private boolean hide = false ; private int mapZoom = 0; private double height = 10 ; public Building(int nPoints) { mapZoom = MapLayer.mapViewer.getZoom(); this.nPoints = nPoints; coordX = new double [nPoints] ; coordY = new double [nPoints] ; iCoordX = new int [nPoints] ; iCoordY = new int [nPoints] ; } public Building(String [] str) { nPoints = str.length; coordX = new double [nPoints] ; coordY = new double [nPoints] ; iCoordX = new int [nPoints] ; iCoordY = new int [nPoints] ; for(int i=0; i<nPoints; i++) { coordX[i]=Double.valueOf(str[i*2]); coordY[i]=Double.valueOf(str[i*2+1]); computeIntCoord(i); } } public Building(String str) { String [] vStr = str.split(" "); nPoints = vStr.length/2; coordX = new double [nPoints] ; coordY = new double [nPoints] ; iCoordX = new int [nPoints] ; iCoordY = new int [nPoints] ; for(int i=0; i<nPoints; i++) { coordX[i]=Double.valueOf(vStr[i*2]); coordY[i]=Double.valueOf(vStr[i*2+1]); computeIntCoord(i); } } public void set(double x, double y, int i) { coordX[i]=x; coordY[i]=y; computeIntCoord(i); } public void setInt(int x, int y, int i) { iCoordX[i]=x; iCoordY[i]=y; coordX[i] = MapCalc.pixelMapToGeo(x, y).getLongitude(); coordY[i] = MapCalc.pixelMapToGeo(x, y).getLatitude(); } public void set(String x, String y, int i) { coordX[i] = Double.valueOf(x); coordY[i] = Double.valueOf(y); computeIntCoord(i); } public double getXCoords(int i) { return coordX[i]; } public double [] getXCoords() { return coordX; } public double [] getYCoords() { return coordY; } public double getYCoords(int i) { return coordY[i]; } public int getNPoints() { return nPoints; } public void computeIntCoord(int i) { int [] coord = MapCalc.geoToPixelMapA(Double.valueOf(coordY[i]), Double.valueOf(coordX[i])); iCoordX[i]=coord[0]; iCoordY[i]=coord[1]; } public void computeIntCoords() { int [] coord = null ; for(int i=0; i<nPoints; i++) { coord = MapCalc.geoToPixelMapA(Double.valueOf(coordY[i]), Double.valueOf(coordX[i])); iCoordX[i]=coord[0]; iCoordY[i]=coord[1]; } } public void draw(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setStroke(new BasicStroke(0.6f)); if(!hide) { int newZoom = MapLayer.mapViewer.getZoom(); if(newZoom != mapZoom) { mapZoom = newZoom; computeIntCoords() ; } g2.setColor(new Color(194, 182, 164, 50)); if (selected) g2.setColor(new Color(194, 182, 164, 120)); g2.fillPolygon(iCoordX, iCoordY, nPoints); g2.setColor(Color.GRAY); if (selected) g2.setColor(Color.DARK_GRAY); g2.drawPolygon(iCoordX, iCoordY, nPoints); } } @Override public void mouseClicked(MouseEvent arg) { if(inside(arg.getX(),arg.getY())) { selected = !selected; MapLayer.repaint(); } } @Override public void mouseEntered(MouseEvent arg0) {} @Override public void mouseExited(MouseEvent arg0) {} @Override public void mousePressed(MouseEvent arg0) {} @Override public void mouseReleased(MouseEvent arg0) {} 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,nPoints); return (poly.contains(p1)); } @Override public void keyPressed(KeyEvent key) { if(key.getKeyCode() == 27) { selected = false; } if (key.getKeyCode() == 65 && key.isControlDown()) { selected = true; } if (key.getKeyChar() == 'i') { selected = !selected; } if (key.getKeyChar() == 'H') { if(!selected) hide = !hide; if(hide) selected = false; MapLayer.repaint(); } } @Override public void keyReleased(KeyEvent arg0) {} @Override public void keyTyped(KeyEvent arg0) {} public void setSelection(boolean b) { selected = b ; } public boolean isSelected() { return selected ; } public int size() { return nPoints; } public Vector3d [] toIntVector3d() { Vector3d [] vector = new Vector3d [nPoints] ; for(int i=0; i<nPoints; i++) { vector[i] = new Vector3d(iCoordY[i], iCoordX[i], 10.0); System.out.println(vector[i]); } return vector; } public Vector3d [] toVector3d() { Vector3d [] vector = new Vector3d [nPoints] ; for(int i=0; i<nPoints; i++) { vector[i] = new Vector3d(coordY[i], coordX[i], 10.0); } return vector; } public Vector3d [] toVector3d(double xref, double yref, double zm) { Vector3d [] vector = new Vector3d [nPoints] ; for(int i=0; i<nPoints; i++) { //System.out.println((coordY[i]-xref)*zm); //System.out.println((coordX[i]-yref)*zm); vector[i] = new Vector3d((coordY[i]-xref)*zm, (coordX[i]-yref)*zm, 10.0); } return vector; } public Polygon getPoly() { Polygon poly = new Polygon(iCoordX,iCoordY,nPoints); return poly; } public void display() { for(int i=0; i<nPoints; i++) { System.out.println("("+iCoordX[i]+", "+iCoordY[i]+")"); } } public boolean intersect(Building building) { Polygon poly = new Polygon(iCoordX,iCoordY,nPoints); for(int i=0; i<building.getNPoints(); i++) { int[] coord = MapCalc.geoToPixelMapA(building.getYCoords(i), building.getXCoords(i)); Point p1 = new Point(coord[0], coord[1]); if(poly.contains(p1)) return true; } return false; } public boolean intersect(Polygon p) { for (int i=0; i<nPoints; i++){ if(p.contains(iCoordX[i], iCoordY[i])) return true; } return false; } public boolean intersect(GeoZone zone) { for (int i=0; i<nPoints; i++){ if(zone.toPolygon().contains(iCoordX[i], iCoordY[i])) return true; } return false; } public boolean isHide() { return hide; } public void setHide(boolean hide) { this.hide = hide; } @Override public String toString() { String s = ""; for (int i = 0; i < coordX.length; i++) { s += "(" + coordX[i] + ", "+ coordY[i] +") "; } return s; } public boolean intersect(double x1, double y1, double x2, double y2) { for(int i=0; i<nPoints-1; i++) { if(Intersect.intersect(x1, y1, x2, y2, coordY[i], coordX[i], coordY[i+1], coordX[i+1])) return true; } if(Intersect.intersect(x1, y1, x2, y2, coordY[0], coordX[0], coordY[nPoints-1], coordX[nPoints-1])) return true; return false; } public double getHeight() { return height; } public void setHeight(double height) { this.height = height; } }