/** * Dibujador esta hecho para analizar una imagen animada, la que contiene * un punto, y describir su trayectoria a traves de trazos. * @author Nadia Herrera R. * @author Rodrigo Vidal M. * @version 0.000001 */ import java.awt.*; import java.awt.event.*; import java.awt.image.*; import java.util.*; import java.awt.geom.*; class Dibujador extends Frame { Image imagenNueva; Image imagenAlternativa; private BufferedImage[] arregloBuffer; private int largoBufered; private int iniAlto; private int iniAncho; private int color; private int contador = 0; private int anchoActual; private int alturaActual; private ArrayList lista = new ArrayList(); private ArrayList lista2 = new ArrayList(); private ArrayList lista3 = new ArrayList(); /** /*Constructor de la clase Dibujador /*Aqui se realiza todo el analisis de las imagenes /*@param arregloBuffer BufferedImage[] /*@param largoBufered int /*@param iniAlto int /*@param iniAncho int */ public Dibujador(BufferedImage[] arregloBuffer, int largoBufered, int iniAlto, int iniAncho) { this.arregloBuffer = arregloBuffer; this.largoBufered = largoBufered; this.iniAlto = iniAlto; this.iniAncho = iniAncho; Line2D.Double linea; int puntoMedioY = 0; int puntoMedioX = 0; int nuevoPuntoMedio = 0; int nuevoPuntoMedioX = 0; int ultimoPuntoXFinal = 0; int x1 = 0; int y1 = 0; int x2 = 0; int y2 = 0; int primerPuntoX = 0; int primerPuntoY = 0; int ultimoPuntoX = 0; int ultimoPuntoY = 0; int nuevoPuntoX = 0; int nuevoPuntoY = 0; int ultimoPuntoXTemp = 0; int primerY = 0; int primerX = 0; int nuevoMedioX = 0; int nuevoMedioY = 0; int[] arreglo = new int[iniAncho * iniAlto]; int[] arreglo2 = new int[iniAlto * iniAncho]; int[] arreglo3 = new int[iniAlto * iniAncho]; this.setVisible( true ); this.setSize( 4 * iniAncho + 40, 70 + iniAlto); this.setTitle( "JDetector" ); this.setBackground( Color.white ); this.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ) { System.exit( 0 ); } }); while (true) { try { if(contador == largoBufered) contador = 0; PixelGrabber pgObj = new PixelGrabber((Image)arregloBuffer[contador], 0,0,iniAncho,iniAlto,arreglo,0,iniAncho ); if(pgObj.grabPixels()) { color = arreglo[0]; anchoActual = 0; alturaActual = 0; ultimoPuntoX = 0; ultimoPuntoY = 0; primerPuntoX = 0; primerPuntoY = 0; primerY = 0; primerX = 0; for(int i = 0; i < (iniAncho * iniAlto); i++ ) { arreglo3[i] = arreglo[i] - arreglo2[i]; arreglo2[i] = arreglo[i]; anchoActual++; if( i % iniAncho == 0) { alturaActual++; anchoActual = 0; ultimoPuntoX = 0; ultimoPuntoXTemp = 0; } //seguimiento filtrado if(arreglo3[i] != 0 && primerY == 0) { primerY = alturaActual; //valor Y del primer punto primerX = anchoActual; } if(arreglo[i] != color && primerPuntoY == 0) { primerPuntoY = alturaActual; //valor Y del primer punto primerPuntoX = anchoActual; } if(arreglo[i] != color && primerPuntoY != 0 && alturaActual != 0) { ultimoPuntoY = alturaActual; //valor Y del primer punto if(arreglo[i-1] == color) { ultimoPuntoX = anchoActual; ultimoPuntoXTemp = anchoActual; } else if(ultimoPuntoX == arreglo[i]) { ultimoPuntoXTemp = anchoActual; } else if(arreglo[i] == color) { ultimoPuntoX = ultimoPuntoX - ultimoPuntoXTemp; } } if(ultimoPuntoX != 0) ultimoPuntoXFinal = ultimoPuntoX; puntoMedioY = (ultimoPuntoY + primerPuntoY) / 2; puntoMedioX = (ultimoPuntoXFinal + primerPuntoX) / 2; } } else { System.out.println( "Problemas al descomponer la imagen" ); } } catch( InterruptedException e ) { System.out.println( e ); } System.out.println(primerY); lista.add(new Line2D.Double(nuevoPuntoMedioX, nuevoPuntoMedio, puntoMedioX, puntoMedioY)); lista2.add(new Line2D.Double(0, 0, primerX, primerY)); lista3.add(new Line2D.Double(nuevoMedioX, nuevoMedioY, primerX, primerY)); nuevoPuntoMedio = puntoMedioY; nuevoPuntoMedioX = puntoMedioX; nuevoMedioX = primerX; nuevoMedioY = primerY; if(contador == 1) { lista.remove(0); lista2.remove(0); lista3.remove(0); } if(contador == 0) { lista.clear(); lista2.clear(); } imagenNueva = this.createImage(new MemoryImageSource(iniAncho,iniAlto,arreglo,0,iniAncho)); imagenAlternativa = this.createImage(new MemoryImageSource(iniAncho,iniAlto,arreglo3,0,iniAncho)); contador++; repaint(); for(int j = 0 ; j < 1000000 ; j++) { System.out.print(""); } } } /** /*Método paint /*Se encarga de redibujar las imagenes /*@param g Graphics */ public void paint( Graphics g ) { if( imagenNueva != null ) { g.drawImage( imagenNueva, 10, 50, this); g.drawImage( imagenNueva, 20 + iniAncho, 50, this ); g.drawImage( imagenAlternativa, 40 + 2 *iniAncho, 50, this ); Graphics2D g2 = (Graphics2D)g; for (int k = 0; k < lista.size(); k++) { g2.setColor(Color.red); Line2D.Double temp = (Line2D.Double)lista.get(k); g2.draw((Line2D) new Line2D.Double(temp.getX1() + 20 + iniAncho,temp.getY1() + 50, temp.getX2() + 20 + iniAncho,temp.getY2() + 50)); Line2D.Double temp3 = (Line2D.Double)lista3.get(k); g2.setColor(Color.blue); g2.draw((Line2D) new Line2D.Double(temp3.getX1() + 40 + 2 * iniAncho,temp3.getY1() + 50, temp3.getX2() + 40 + 2 * iniAncho,temp3.getY2() + 50)); Line2D.Double temp2 = (Line2D.Double)lista2.get(k); g2.setColor(Color.blue); g2.draw((Line2D) new Line2D.Double(temp2.getX1() + 40 + 3 * iniAncho,temp2.getY1() + 50, temp2.getX2() + 40 + 3 * iniAncho,temp2.getY2() + 50)); } } } }