package interfaz.utilidades;
import baseconocimiento.utilidades.Mapeo;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import javax.swing.JFrame;
import modelo.Barrio;
import modelo.Localidad;
import modelo.Mapa;
/**
*
* @author UNL
*/
public class PizarraSimulacion extends Canvas {
private Mapa mapa;
private boolean init = true;
private int factorEscala = 4;
private boolean estadoRutaOptima=false;
ArrayList<Localidad> localidades;
ArrayList<Integer> rutaOptima;
public Point[] extraerCoordenadasLocalidades() {
localidades = this.mapa.getLocalidades();
System.out.println("Num. Localidades: " + localidades.size());
Point[] listaPuntos = new Point[localidades.size()];
for (int i = 0; i < listaPuntos.length; i++) {
int x = (int) localidades.get(i).getBarrio().getCoordenadaX();
int y = (int) localidades.get(i).getBarrio().getCoordenadaY();
Point punto = null;
try {
punto = new Point(x / this.factorEscala, y / this.factorEscala);
} catch (Exception e) {
System.out.println("Division por cero");
}
listaPuntos[i] = punto;
}
return listaPuntos;
}
public void graficarRutaOptima(Graphics2D g){
//pintamos cada una de los barrios de la ruta optima
int contador=0;
Point puntoAnterior = null;
for (Integer id : this.rutaOptima) {
Barrio barrio = this.localidades.get(id-1).getBarrio();
Point punto= barrio.getPoint(this.factorEscala);
g.setColor(Color.GREEN);
g.drawOval((int) punto.getX() - 15, (int) punto.getY()- 15, 30, 30);
if(contador>0){
g.drawLine((int)puntoAnterior.getX()-2, (int)puntoAnterior.getY()-2, (int)punto.getX()-2, (int)punto.getY()-2);
}
puntoAnterior= punto;
contador++;
}
}
public void graficarPuntos(Graphics2D g, Point[] points) {
int cont = 0;
for (Point point : points) {
//recorremos por cada localidad sus vecinos
ArrayList<Barrio> barrios = this.localidades.get(cont).getVecinos();
System.out.println("-------------------------------");
System.out.println("Tengo "+barrios.size());
for (Barrio barrio : barrios) {
System.out.println(barrio);
graficarCamino(g, point, barrio.getPoint(this.factorEscala));
}
System.out.println("-------------------------------");
g.setColor(Color.YELLOW);
g.fillOval((int) point.getX()-2 , (int) point.getY()-2, 5, 5);
g.setColor(Color.red);
g.drawOval((int) point.getX() - 5, (int) point.getY()- 5, 10, 10);
g.setColor(Color.WHITE);
g.drawString(this.localidades.get(cont).getBarrio().getDenominacion(),(float) point.getX(), (float) point.getY());
//Localidad localidad= localidades.get(cont);
//g.drawString(" P" + (cont+1) + "(" + localidad.getBarrio().getCoordenadaX() + "," + localidad.getBarrio().getCoordenadaY() + ")", (float) point.getX(), (float) point.getY());
cont++;
}
}
public boolean isEstadoRutaOptima() {
return estadoRutaOptima;
}
public void setEstadoRutaOptima(boolean estadoRutaOptima) {
this.estadoRutaOptima = estadoRutaOptima;
}
public ArrayList<Integer> getRutaOptima() {
return rutaOptima;
}
public void setRutaOptima(ArrayList<Integer> rutaOptima) {
this.rutaOptima = rutaOptima;
}
public void graficarCamino(Graphics2D g, Point point1, Point point2) {
g.setColor(Color.blue);
g.drawLine((int) point1.getX(), (int) point1.getY(), (int) point2.getX(), (int) point2.getY());
}
/**
*
* @param g
* @param point1 es un punto de origen que describe las reglas de la base del conocimiento
* @param point2 es el punto de destino basado en las reglas del conocimiento */
public void trazarlinea(Graphics2D g, Point point1, Point point2) {
g.drawLine(point1.x, point1.y, point2.x, point2.y);
}
private PizarraListener zoomAndPanListener;
public PizarraSimulacion(Mapa mapaDatos) {
this.zoomAndPanListener = new PizarraListener(this);
this.addMouseListener(zoomAndPanListener);
this.addMouseMotionListener(zoomAndPanListener);
this.addMouseWheelListener(zoomAndPanListener);
this.mapa = mapaDatos;
}
public PizarraSimulacion(int minZoomLevel, int maxZoomLevel, double zoomMultiplicationFactor) {
this.zoomAndPanListener = new PizarraListener(this, minZoomLevel, maxZoomLevel, zoomMultiplicationFactor);
this.addMouseListener(zoomAndPanListener);
this.addMouseMotionListener(zoomAndPanListener);
this.addMouseWheelListener(zoomAndPanListener);
}
@Override
public void paint(Graphics g1) {
Dimension d = getSize();
BufferedImage imagen = new BufferedImage(d.width, d.height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = (Graphics2D) imagen.getGraphics();
imagen.getGraphics().setColor(Color.BLUE);
//imagen.getGraphics().fillRect(0, 0, d.width, d.height);
if (init) {
// Initialize the viewport by moving the origin to the center of the window,
// and inverting the y-axis to point upwards.
init = false;
// int xc = d.width / 2;
System.out.println(" ancho"+d.width/2);
// int yc = d.height / 2;
System.out.println("alto"+d.height/2);
int xc = 0;
int yc = d.height;
g2.translate(xc, yc);
g2.scale(1, -1);
// Save the viewport to be updated by the ZoomAndPanListener
zoomAndPanListener.setCoordTransform(g2.getTransform());
} else {
// Restore the viewport after it was updated by the ZoomAndPanListener
g2.setTransform(zoomAndPanListener.getCoordTransform());
}
g2.setColor(Color.red);
Font font = g2.getFont();
AffineTransform affineTransform = new AffineTransform();
affineTransform.scale(1,-1);
g2.setFont(font.deriveFont(affineTransform));
g2.setColor(Color.BLUE);
graficarPuntos(g2, extraerCoordenadasLocalidades());
if(this.estadoRutaOptima){
System.out.println("Graficando Ruta Optima");
graficarRutaOptima(g2);
}
g1.drawImage(imagen, 0, 0, this);
}
@Override
public void update(Graphics g) {
paint(g);
}
public static void main(String[] args) {
JFrame frame = new JFrame("Pizarra");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
PizarraSimulacion chart = new PizarraSimulacion(new Mapa(1, "Loja", new Mapeo().mapearLocalidades()));
frame.add(chart, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
chart.createBufferStrategy(2);
}
}