/* Maquina de Trazados * Version 1.2: Se permite el borrado de Lineas y Circulos */ import java.awt.*; import java.awt.event.*; import javax.swing.*; class Linea { Linea (int x1, int y1, int x2, int y2) { X1 = x1; Y1 = y1; X2 = x2; Y2 = y2; } int getX1() { return X1; } int getX2() { return X2; } int getY1() { return Y1; } int getY2() { return Y2; } private int X1, Y1, X2, Y2; } class Circulo { Circulo (int x1, int y1, int radio, Color relleno) { X1 = x1; Y1 = y1; Radio = radio; Relleno = relleno; } Circulo (int x1, int y1, int radio) { X1 = x1; Y1 = y1; Radio = radio; Relleno = null; } int getX1() { return X1; } int getY1() { return Y1; } int getRadio() { return Radio; } Color getRelleno() { return Relleno; } private int X1, Y1, Radio; private Color Relleno; } class MaquinaPanel extends JPanel { protected void paintComponent(Graphics g) { super.paintComponent(g); Dimension d = getSize(); g.translate(d.width / 2, d.height / 2); for (int i = 0; i < nlineas; i++) drawLinea(g, i); for (int i = 0; i < ncirculos; i++) drawCirculo(g, i); } void drawLinea(Graphics g, int i) { g.drawLine(lineas[i].getX1(), lineas[i].getY1(), lineas[i].getX2(), lineas[i].getY2()); } void drawCirculo(Graphics g, int i) { if (circulos[i].getRelleno() != null) { g.setColor(circulos[i].getRelleno()); g.fillOval(circulos[i].getX1() - circulos[i].getRadio(), circulos[i].getY1() - circulos[i].getRadio(), 2 * circulos[i].getRadio(), 2 * circulos[i].getRadio() ); } else { g.setColor(Color.black); g.drawArc(circulos[i].getX1() - circulos[i].getRadio(), circulos[i].getY1() - circulos[i].getRadio(), 2 * circulos[i].getRadio(), 2 * circulos[i].getRadio(), 0, 360); } } void dibujarLinea(int x1, int y1, int x2, int y2) { if (nlineas == MAXLINEAS) throw new IndexOutOfBoundsException ("No se pueden dibujar más de " + MAXLINEAS + " líneas"); lineas[nlineas] = new Linea(x1, y1, x2, y2); nlineas++; repaint(); } void dibujarCirculo(int x1, int y1, int radio) { if (ncirculos == MAXCIRCULOS) throw new IndexOutOfBoundsException ("No se pueden dibujar más de " + MAXCIRCULOS + " círculos"); circulos[ncirculos] = new Circulo(x1, y1, radio); ncirculos++; repaint(); } void dibujarCirculoRelleno(int x1, int y1, int radio, Color relleno) { if (ncirculos == MAXCIRCULOS) throw new IndexOutOfBoundsException ("No se pueden dibujar más de " + MAXCIRCULOS + " círculos"); circulos[ncirculos] = new Circulo(x1, y1, radio, relleno); ncirculos++; repaint(); } void limpiarMaquina() { ncirculos = 0; nlineas = 0; repaint(); } /* METODOS ADICIONALES */ void eliminarLineas(int xi, int yi, int xf, int yf) { Linea l; int x1, y1, x2, y2; for (int i=0; i= xi && x1 <= xf && x2 >= xi && x2 <= xf && y1 <= yi && y1 >= yf && y2 <= yi && y2 >= yf ) { quitarLinea(i); i--; } } } void eliminarCirculos(int xi, int yi, int xf, int yf) { Circulo c; int x, y, r; for (int i=0; i= xi && x+r <= xf && y-r <= yi && y+r >= yf ) { quitarCirculo(i); i--; } } } void quitarLinea(int n) { for (int i=n; i XMAX) throw new IllegalArgumentException ("Error en \"dibujarLinea\" -> " + "El valor absoluto de la coordenada horizontal del " + "primer punto (" + x1 + "," + y1 + ") sobrepasa " + "el máximo " + XMAX); if (Math.abs(y1) > YMAX) throw new IllegalArgumentException ("Error en \"dibujarLinea\" -> " + "El valor absoluto de la coordenada vertical del " + "primer punto (" + x1 + "," + y1 + ") sobrepasa " + "el máximo " + YMAX); if (Math.abs(x2) > XMAX) throw new IllegalArgumentException ("Error en \"dibujarLinea\" -> " + "El valor absoluto de la coordenada horizontal del " + "segundo punto (" + x2 + "," + y2 + ") sobrepasa " + "el máximo " + XMAX); if (Math.abs(y2) > YMAX) throw new IllegalArgumentException ("Error en \"dibujarLinea\" -> " + "El valor absoluto de la coordenada vertical del " + "segundo punto (" + x2 + "," + y2 + ") sobrepasa " + "el máximo " + YMAX); y1 = -y1; y2 = -y2; maqPanel.dibujarLinea (x1,y1,x2,y2); } public void dibujarCirculo(int x1, int y1, int radio) { if (radio < 0) throw new IllegalArgumentException ("Error en \"dibujarCirculo\" -> " + "El radio " + radio + " es negativo"); if (Math.abs(x1) + radio > XMAX) throw new IllegalArgumentException ("Error en \"dibujarCirculo\" -> " + "El valor absoluto de la coordenada horizontal del " + "origen (" + x1 + "," + y1 + ") más el radio " + radio + " sobrepasa el máximo " + XMAX); if (Math.abs(y1) + radio > YMAX) throw new IllegalArgumentException ("Error en \"dibujarCirculo\" -> " + "El valor absoluto de la coordenada vertical del " + "origen (" + x1 + "," + y1 + ") más el radio " + radio + " sobrepasa el máximo " + YMAX); y1 = -y1; maqPanel.dibujarCirculo (x1,y1,radio); } public void dibujarCirculoRelleno(int x1, int y1, int radio, Color relleno) { if (radio < 0) throw new IllegalArgumentException ("Error en \"dibujarCirculo\" -> " + "El radio " + radio + " es negativo"); if (Math.abs(x1) + radio > XMAX) throw new IllegalArgumentException ("Error en \"dibujarCirculo\" -> " + "El valor absoluto de la coordenada horizontal del " + "origen (" + x1 + "," + y1 + ") más el radio " + radio + " sobrepasa el máximo " + XMAX); if (Math.abs(y1) + radio > YMAX) throw new IllegalArgumentException ("Error en \"dibujarCirculo\" -> " + "El valor absoluto de la coordenada vertical del " + "origen (" + x1 + "," + y1 + ") más el radio " + radio + " sobrepasa el máximo " + YMAX); y1 = -y1; maqPanel.dibujarCirculoRelleno(x1,y1,radio,relleno); } public void Borrar() { maqPanel.limpiarMaquina(); } /* METODOS ADICIONALES */ public void borrarLineas(int xi, int yi, int xf, int yf) { if (xi > xf) throw new IllegalArgumentException ("Error en \"borrarLineas\" -> " + "El intervalo horizontal [" + xi + ", " + xf + "] " + "no esta definido. La coordenada inicial debe ser menor " + "o igual que la coordenada final"); if (yi > yf) throw new IllegalArgumentException ("Error en \"borrarLineas\" -> " + "El intervalo vertical [" + yi + ", " + yf + "] " + "no esta definido. La coordenada inicial debe ser menor " + "o igual que la coordenada final"); maqPanel.eliminarLineas(xi, -yi, xf, -yf); } public void borrarCirculos(int xi, int yi, int xf, int yf) { if (xi > xf) throw new IllegalArgumentException ("Error en \"borrarCirculos\" -> " + "El intervalo horizontal [" + xi + ", " + xf + "] " + "no esta definido. La coordenada inicial debe ser menor " + "o igual que la coordenada final"); if (yi > yf) throw new IllegalArgumentException ("Error en \"borrarCirculos\" -> " + "El intervalo vertical [" + yi + ", " + yf + "] " + "no esta definido. La coordenada inicial debe ser menor " + "o igual que la coordenada final"); maqPanel.eliminarCirculos(xi, -yi, xf, -yf); } /* FIN METODOS ADICIONALES */ public final int XMAX; public final int YMAX; private Container contentPane; private MaquinaPanel maqPanel; }