// __________________________________________________________________________________________________________
// OBJETIVOS: Se crea una ventana con menUs y nos permite dibujar N Objetos
// Los objetos son:
// Lineas, Circulos, Cuadros, Cubos, Conos, Cilindros
//
// LINEA 2 CLICKS
// CIRCULO 2 CLICKS
// ELIPSE 2 CLICKS
// CUADRO 2 CLICKS
// CUBO 4 CLICKS
// Para ello, en el cubo se dan 4 clicks -2 para un cuadro y 2 para un
// segundo cuadro uniendose los vErtices con lIneas para formar al cubo
// P1 ( sup-izq, inf-der )
// CONO 3 CLICKS
// Son necesarios 3 clicks. 2 para la base -elipse- y uno para el vErtice
// ________________________________________________________________________________
// OJO <<<< Los 2 primeros clicks son para la elipse y el click 3 para el pico >>>>
// --------------------------------------------------------------------------------
// CILINDRO 4 CLICKS
// Se utilizan 4 clicks, 2 para la base -elipse-, 2 para la parte
// superior -elipse- y se unen automAticamente con 2 lIneas.
//
// PARTICULARIDADES
// 1.- Al hacer cambio de primitiva, N_CLICKS se pone a cero.
//
// 2.- AUn cuando algunos objetos aparentan tener volUmen, se trabajan como
// figuras planas. Es 2D, NO HAY TRAZOS 3D
//
// 3.- Se hace uso de la clase LinkedList que viene con el jdk para el
// el manejo de listas ligadas.
// __________________________________________________________________________________________________________
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.LinkedList;
public class Proyecto_1 extends JFrame
{
JMenu MenuArchivo, MenuGrafico, MenuEdicion, MenuColores;
JMenuItem ArchivoGuardar, ArchivoSalir, GraficoLinea, GraficoCirculo, EdicionLimpiar;
JMenuItem ColorAzul, ColorAmarillo, ColorBlanco, ColorVerde;
JMenuItem GraficoElipse, GraficoCuadro, GraficoCubo, GraficoCono, GraficoCilindro;
Grafico G = new Grafico();
final int NADA = 0, LINEA = 1, CIRCULO = 2, ELIPSE = 3, CUADRO = 4, CUBO = 5, CONO = 6, CILINDRO = 7;
final int AZUL = 1, AMARILLO = 2, BLANCO = 3, VERDE = 4;
int X[] = new int[4], Y[] = new int[4];
int N_CLICKS = 0, Primitiva = NADA, color = AMARILLO;
public static void main(String R[]) { new Proyecto_1(); }
public Proyecto_1()
{
this.getContentPane().setLayout(null); // Contenedor nulo
this.setTitle("Editor Grafico 1.0"); // Titulo de la ventana
this.setResizable(true); // Si es redimensionable
this.setLocation(100, 100); // Posicion
this.setSize(new Dimension(700, 500)); // Dimensiones
this.setBackground(Color.green);
this.add(G); G.setBounds(0, 0, 700, 500);
JMenuBar BarraMenu = new JMenuBar(); // Barra de menU
BarraMenu.setBackground(Color.green);
BarraMenu.setForeground(Color.yellow);
MenuArchivo = InsertaMenu("Archivo");
MenuArchivo.setMnemonic(KeyEvent.VK_A); // Se accesa con Alt-A
InsertaItem(MenuArchivo, ArchivoGuardar, "guardaR", KeyEvent.VK_R); //Alt-R
InsertaItem(MenuArchivo, ArchivoSalir, "Salir", KeyEvent.VK_S); //Alt-S
MenuGrafico = InsertaMenu("Primitiva");
MenuGrafico.setMnemonic(KeyEvent.VK_P); // Se accesa con Alt-G
InsertaItem(MenuGrafico, GraficoLinea, "Linea", KeyEvent.VK_L); // Alt-L
InsertaItem(MenuGrafico, GraficoCirculo, "Circulo", KeyEvent.VK_I); // Alt-I
InsertaItem(MenuGrafico, GraficoElipse, "Elipse", KeyEvent.VK_E); // Alt-E
InsertaItem(MenuGrafico, GraficoCuadro, "Cuadro", KeyEvent.VK_U);
InsertaItem(MenuGrafico, GraficoCubo, "Cubo", KeyEvent.VK_B);
InsertaItem(MenuGrafico, GraficoCono, "Cono", KeyEvent.VK_N);
InsertaItem(MenuGrafico, GraficoCilindro, "Cilindro", KeyEvent.VK_D);
MenuEdicion = InsertaMenu("Edicion");
MenuEdicion.setMnemonic(KeyEvent.VK_E); // Se accesa con Alt-E
InsertaItem(MenuEdicion, EdicionLimpiar, "Limpiar", KeyEvent.VK_L); // Alt-L
MenuColores = InsertaMenu("Color");
InsertaItem(MenuColores, ColorAzul, "Azul", KeyEvent.VK_A);
InsertaItem(MenuColores, ColorAmarillo, "Amarillo", KeyEvent.VK_M);
InsertaItem(MenuColores, ColorBlanco, "Blanco", KeyEvent.VK_B);
InsertaItem(MenuColores, ColorVerde, "Verde", KeyEvent.VK_V);
BarraMenu.add(MenuArchivo);
BarraMenu.add(MenuGrafico);
BarraMenu.add(MenuEdicion);
BarraMenu.add(MenuColores);
setJMenuBar(BarraMenu);
G.addMouseListener(new EventoRaton());
this.setVisible(true);
}
JMenu InsertaMenu(String CAD) { return new JMenu(CAD); }
void InsertaItem(JMenu MENU, JMenuItem ITEM, String CAD, int KEY_EVENT)
{
ITEM = new JMenuItem(CAD);
ITEM.setMnemonic(KEY_EVENT);
ITEM.setBackground(Color.green);
ITEM.setForeground(Color.black);
MENU.add(ITEM);
ITEM.addActionListener(new Evento_Opciones());
}
protected void processWindowEvent(WindowEvent e)
{ if (e.getID() == WindowEvent.WINDOW_CLOSING) System.exit(0); }
class Evento_Opciones implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if (e.getActionCommand().equals("Salir")) System.exit(0);
if (e.getActionCommand().equals("Guardar")) { }
if (e.getActionCommand().equals("Limpiar")) { G.LimpiaVentana( ); }
if (e.getActionCommand().equals("Linea")) { Primitiva = LINEA; N_CLICKS = 0; }
if (e.getActionCommand().equals("Circulo")) { Primitiva = CIRCULO; N_CLICKS = 0; }
if (e.getActionCommand().equals("Elipse")) { Primitiva = ELIPSE; N_CLICKS = 0; }
if (e.getActionCommand().equals("Cuadro")) { Primitiva = CUADRO; N_CLICKS = 0; }
if (e.getActionCommand().equals("Cubo")) { Primitiva = CUBO; N_CLICKS = 0; }
if (e.getActionCommand().equals("Cono")) { Primitiva = CONO; N_CLICKS = 0; }
if (e.getActionCommand().equals("Cilindro")) { Primitiva = CILINDRO; N_CLICKS = 0; }
if (e.getActionCommand().equals("Azul")) color = AZUL;
if (e.getActionCommand().equals("Amarillo")) color = AMARILLO;
if (e.getActionCommand().equals("Blanco")) color = BLANCO;
if (e.getActionCommand().equals("Verde")) color = VERDE;
}
}
class EventoRaton implements MouseListener
{
// Estos mEtodos no nos interesan por ahora. Sin embargo hay que ponerlos
// al tratarse de una interfaz
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
// Se crea el mEtodo que si nos interesa trabajar
public void mouseClicked(MouseEvent e)
{
String boton = "";
if ( Primitiva != NADA )
{
X[N_CLICKS] = e.getX();
Y[N_CLICKS] = e.getY();
N_CLICKS++;
}
switch (e.getButton())
{
// boton = "izquierdo";
case MouseEvent.BUTTON1:
if ( ( N_CLICKS == 2 ) &&
( (Primitiva == LINEA) || (Primitiva == CIRCULO) || (Primitiva == ELIPSE) || (Primitiva == CUADRO) )
) { G.Dibuja(X, Y, Primitiva, color); N_CLICKS = 0; }
if ( ( N_CLICKS == 3 ) && (Primitiva == CONO) )
{ G.Dibuja(X, Y, Primitiva, color); N_CLICKS = 0; }
if ( ( N_CLICKS == 4 ) && ( (Primitiva == CUBO) || (Primitiva == CILINDRO) ) )
{ G.Dibuja(X, Y, Primitiva, color); N_CLICKS = 0; }
break;
case MouseEvent.BUTTON2: break; // boton = "central";
case MouseEvent.BUTTON3: break; // boton = "derecho";
}
}
}
}
class Grafico extends Canvas
{
final int NADA = 0, LINEA = 1, CIRCULO = 2, ELIPSE = 3, CUADRO = 4, CUBO = 5, CONO = 6, CILINDRO = 7;
final int AZUL = 1, AMARILLO = 2, BLANCO = 3, VERDE = 4;
int Primitiva = NADA, color = NADA;
boolean Limpiar = false;
LinkedList L_Lineas = new LinkedList();
LinkedList L_Circulos = new LinkedList();
LinkedList L_Elipses = new LinkedList();
LinkedList L_Cuadros = new LinkedList();
LinkedList L_Cubos = new LinkedList();
LinkedList L_Conos = new LinkedList();
LinkedList L_Cilindros = new LinkedList();
public Grafico()
{
setBackground(Color.red); // Color del fondo
setForeground(Color.yellow); // Color de los trazos
LimpiaVentana( );
}
void Dibuja(int X[], int Y[], int Primitiva, int color)
{
Color Tinta = Color.red;
if ( color == AZUL ) Tinta = Color.blue;
if ( color == AMARILLO ) Tinta = Color.yellow;
if ( color == BLANCO ) Tinta = Color.white;
if ( color == VERDE ) Tinta = Color.green;
switch ( Primitiva )
{
case LINEA: L_Lineas.add( new Linea(Tinta, X, Y) ); break;
case CIRCULO: L_Circulos.add( new Circulo(Tinta, X, Y ) ); break;
case ELIPSE: L_Elipses.add( new Cuadro(Tinta, X, Y ) ); break;
case CUADRO: L_Cuadros.add( new Cuadro(Tinta, X, Y ) ); break;
case CUBO: L_Cubos.add( new Cubo(Tinta, X, Y) ); break;
case CONO: L_Conos.add( new Cono(Tinta, X, Y) ); break;
case CILINDRO: L_Cilindros.add( new Cilindro(Tinta, X, Y) ); break;
}
repaint();
}
void Dibuja_Linea(Graphics A, Color color, int x1, int y1, int x2, int y2)
{ A.setColor(color); A.drawLine(x1, y1, x2, y2); }
void Dibuja_Cuadro(Graphics A, Color color, int x, int y, int ancho, int alto)
{ A.setColor(color); A.drawRect(x, y, ancho, alto); }
void Dibuja_Elipse(Graphics A, Color color, int x, int y, int ancho, int alto)
{ A.setColor(color); A.drawOval(x, y, ancho, alto); }
public void paint(Graphics A)
{
Linea L_Actual; Circulo C_Actual; Cuadro Cu_Actual; Cubo Cb_Actual; Cono Co_Actual; Cilindro Ci_Actual;
int x = 0;
if ( !Limpiar )
{
// L I N E A S
// ___________________
for ( x = 0; x < L_Lineas.size(); x++)
{
L_Actual = (Linea)L_Lineas.get(x);
Dibuja_Linea(A, L_Actual.color, L_Actual.V1.X, L_Actual.V1.Y, L_Actual.V2.X, L_Actual.V2.Y );
}
// C I R C U L O S
// ___________________
for ( x = 0; x < L_Circulos.size(); x++)
{
C_Actual = (Circulo)L_Circulos.get(x);
A.setColor( C_Actual.color );
A.drawOval( C_Actual.X, C_Actual.Y, C_Actual.Diametro, C_Actual.Diametro );
}
// E L I P S E S
// ___________________
for ( x = 0; x < L_Elipses.size(); x++)
{
Cu_Actual = (Cuadro)L_Elipses.get(x);
Dibuja_Elipse(A, Cu_Actual.color, Cu_Actual.X, Cu_Actual.Y, Cu_Actual.Ancho, Cu_Actual.Alto );
}
// C U A D R O S
// ___________________
for ( x = 0; x < L_Cuadros.size(); x++)
{
Cu_Actual = (Cuadro)L_Cuadros.get(x);
Dibuja_Cuadro(A, Cu_Actual.color, Cu_Actual.X, Cu_Actual.Y, Cu_Actual.Ancho, Cu_Actual.Alto );
}
// C U B O S
// ___________________
for ( x = 0; x < L_Cubos.size(); x++)
{
Cb_Actual = (Cubo)L_Cubos.get(x);
Dibuja_Cuadro(A, Cb_Actual.C1.color, Cb_Actual.C1.X, Cb_Actual.C1.Y, Cb_Actual.C1.Ancho, Cb_Actual.C1.Alto);
Dibuja_Cuadro(A, Cb_Actual.C2.color, Cb_Actual.C2.X, Cb_Actual.C2.Y, Cb_Actual.C2.Ancho, Cb_Actual.C2.Alto);
Dibuja_Linea( A, Cb_Actual.L1.color, Cb_Actual.L1.V1.X, Cb_Actual.L1.V1.Y, Cb_Actual.L1.V2.X, Cb_Actual.L1.V2.Y);
Dibuja_Linea( A, Cb_Actual.L2.color, Cb_Actual.L2.V1.X, Cb_Actual.L2.V1.Y, Cb_Actual.L2.V2.X, Cb_Actual.L2.V2.Y);
Dibuja_Linea( A, Cb_Actual.L3.color, Cb_Actual.L3.V1.X, Cb_Actual.L3.V1.Y, Cb_Actual.L3.V2.X, Cb_Actual.L3.V2.Y);
Dibuja_Linea( A, Cb_Actual.L4.color, Cb_Actual.L4.V1.X, Cb_Actual.L4.V1.Y, Cb_Actual.L4.V2.X, Cb_Actual.L4.V2.Y);
}
// C O N O S
// ___________________
for ( x = 0; x < L_Conos.size(); x++)
{
Co_Actual = (Cono)L_Conos.get(x);
Dibuja_Elipse(A, Co_Actual.C.color, Co_Actual.C.X, Co_Actual.C.Y, Co_Actual.C.Ancho, Co_Actual.C.Alto);
Dibuja_Linea( A, Co_Actual.L1.color, Co_Actual.L1.V1.X, Co_Actual.L1.V1.Y, Co_Actual.L1.V2.X, Co_Actual.L1.V2.Y);
Dibuja_Linea( A, Co_Actual.L2.color, Co_Actual.L2.V1.X, Co_Actual.L2.V1.Y, Co_Actual.L2.V2.X, Co_Actual.L2.V2.Y);
}
// C I L I N D R O S
// ___________________
for ( x = 0; x < L_Cilindros.size(); x++)
{
Ci_Actual = (Cilindro)L_Cilindros.get(x);
Dibuja_Elipse(A, Ci_Actual.C1.color, Ci_Actual.C1.X, Ci_Actual.C1.Y, Ci_Actual.C1.Ancho, Ci_Actual.C1.Alto);
Dibuja_Elipse(A, Ci_Actual.C2.color, Ci_Actual.C2.X, Ci_Actual.C2.Y, Ci_Actual.C2.Ancho, Ci_Actual.C2.Alto);
Dibuja_Linea( A, Ci_Actual.L1.color, Ci_Actual.L1.V1.X, Ci_Actual.L1.V1.Y, Ci_Actual.L1.V2.X, Ci_Actual.L1.V2.Y);
Dibuja_Linea( A, Ci_Actual.L2.color, Ci_Actual.L2.V1.X, Ci_Actual.L2.V1.Y, Ci_Actual.L2.V2.X, Ci_Actual.L2.V2.Y);
}
}
else Limpiar = false;
}
void LimpiaVentana( )
{
L_Lineas.clear(); L_Circulos.clear(); L_Elipses.clear(); L_Cuadros.clear();
L_Cubos.clear(); L_Conos.clear(); L_Cilindros.clear();
Limpiar = true;
repaint();
}
}
class Vertice
{
int X = 0, Y = 0;
public Vertice() {}
public Vertice(int X, int Y) { this.X = X; this.Y = Y; }
}
class Linea
{
Vertice V1 = new Vertice();
Vertice V2 = new Vertice();
Color color = Color.white;
public Linea() { } // Se quedan los datos en ceros
public Linea(Color color, int X[], int Y[])
{
V1.X = X[0]; V1.Y = Y[0];
V2.X = X[1]; V2.Y = Y[1];
this.color = color;
}
}
class Circulo
{
int X = 0, Y = 0, Radio = 0, Diametro = 0;
Color color = Color.white;
public Circulo() {} // Se quedan los datos en ceros
public Circulo(Color color, int Xs[], int Ys[])
{
Radio = (int) Math.hypot ( (double)(Xs[1] - Xs[0]), (double)(Ys[1] - Ys[0]) );
X = Xs[0] - Radio;
Y = Ys[0] - Radio;
Diametro = 2 * Radio;
this.color = color;
}
}
//______________________________________________________________________________
// Se use la misma clase para el CUADRO que para la ELIPSE ya que son datos
// ------ ------
// y comportamientos exActamente iguales.
// La diferencia estA en el comando de dibujo, sin embargo se guardan
// en lista diferentes para su control correcto
//------------------------------------------------------------------------------
class Cuadro
{
int X = 0, Y = 0, Ancho = 0, Alto = 0;
Color color = Color.white;
public Cuadro() {} // Se quedan los datos en ceros
public Cuadro(Color color, int Xs[], int Ys[])
{
Ancho = (Xs[0] > Xs[1]) ? (Xs[0] - Xs[1]) : (Xs[1] - Xs[0]); // ( mayor - menor )
Alto = (Ys[0] > Ys[1]) ? (Ys[0] - Ys[1]) : (Ys[1] - Ys[0]); // ( mayor - menor )
X = (Xs[0] < Xs[1]) ? Xs[0] : Xs[1]; // La menor de las x's
Y = (Ys[0] < Ys[1]) ? Ys[0] : Ys[1]; // La menor de las y's
this.color = color;
}
}
class Cubo
{
Cuadro C1 = new Cuadro( ); Cuadro C2 = new Cuadro( );
Linea L1 = new Linea( ); Linea L2 = new Linea( );
Linea L3 = new Linea( ); Linea L4 = new Linea( );
int X[] = new int[2], Y[] = new int[2];
Color color = Color.white;
public Cubo() {} // Datos iniciales en 0's
public Cubo(Color color, int Xs[], int Ys[])
{
this.color = color;
// Cuadros base
X[0] = Xs[0]; X[1] = Xs[1]; Y[0] = Ys[0]; Y[1] = Ys[1];
C1 = new Cuadro(color, X, Y);
X[0] = Xs[2]; X[1] = Xs[3]; Y[0] = Ys[2]; Y[1] = Ys[3];
C2 = new Cuadro(color, X, Y);
// LIneas complementarias
X[0] = C1.X; X[1] = C2.X; Y[0] = C1.Y; Y[1] = C2.Y;
L1 = new Linea(color, X, Y); // superior izquierda
X[0] = C1.X+C1.Ancho; X[1] = C2.X+C2.Ancho; Y[0] = C1.Y; Y[1] = C2.Y;
L2 = new Linea(color, X, Y); // superior derecha
X[0] = C1.X; X[1] = C2.X; Y[0] = C1.Y+C1.Alto; Y[1] = C2.Y+C2.Alto;
L3 = new Linea(color, X, Y); // inferior izquierda
X[0] = C1.X+C1.Ancho; X[1] = C2.X+C2.Ancho; Y[0] = C1.Y+C1.Alto; Y[1] = C2.Y+C2.Alto;
L4 = new Linea(color, X, Y); // inferior derecha
}
}
class Cono
{
Linea L1 = new Linea(); Linea L2 = new Linea();
Cuadro C = new Cuadro(); // para la elipse
int X[] = new int[2], Y[] = new int[2];
Color color = Color.white;
public Cono() {} // Datos iniciales en 0's
public Cono(Color color, int Xs[], int Ys[])
{
this.color = color;
X[0] = Xs[0]; X[1] = Xs[1]; Y[0] = Ys[0]; Y[1] = Ys[1];
C = new Cuadro(color, X, Y);
if (C.Ancho > C.Alto) // Es un cono vertical <<<<<<<<<<<
{
X[0] = C.X; X[1] = Xs[2]; Y[0] = C.Y+C.Alto/2; Y[1] = Ys[2];
L1 = new Linea(color, X, Y);
X[0] = C.X+C.Ancho; X[1] = Xs[2]; Y[0] = C.Y+C.Alto/2; Y[1] = Ys[2];
L2 = new Linea(color, X, Y);
}
else // Es un cono horizontal <<<<<<<<<<<
{
X[0] = C.X+C.Ancho/2; X[1] = Xs[2]; Y[0] = C.Y; Y[1] = Ys[2];
L1 = new Linea(color, X, Y);
X[0] = C.X+C.Ancho/2; X[1] = Xs[2]; Y[0] = C.Y+C.Alto; Y[1] = Ys[2];
L2 = new Linea(color, X, Y);
}
}
}
class Cilindro
{
Cuadro C1 = new Cuadro(), C2 = new Cuadro(); // Las 2 elipses
Linea L1 = new Linea(), L2 = new Linea();
int X[] = new int[2], Y[] = new int[2];
Color color = Color.white;
public Cilindro() {} // Datos iniciales en 0's
public Cilindro(Color color, int Xs[], int Ys[])
{
this.color = color;
X[0] = Xs[0]; X[1] = Xs[1]; Y[0] = Ys[0]; Y[1] = Ys[1];
C1 = new Cuadro(color, X, Y);
X[0] = Xs[2]; X[1] = Xs[3]; Y[0] = Ys[2]; Y[1] = Ys[3];
C2 = new Cuadro(color, X, Y);
if (C1.Ancho > C1.Alto) // Es un cilindro vertical <<<<<<<<<<<
{
X[0] = C1.X; X[1] = C2.X; Y[0] = C1.Y+C1.Alto/2; Y[1] = C2.Y+C2.Alto/2;
L1 = new Linea(color, X, Y);
X[0] = C1.X+C1.Ancho; X[1] = C2.X+C2.Ancho; Y[0] = C1.Y+C1.Alto/2; Y[1] = C2.Y+C2.Alto/2;
L2 = new Linea(color, X, Y);
}
else // Es un cilindro horizontal <<<<<<<<<<<
{
X[0] = C1.X+C1.Ancho/2; X[1] = C2.X+C2.Ancho/2; Y[0] = C1.Y; Y[1] = C2.Y;
L1 = new Linea(color, X, Y);
X[0] = C1.X+C1.Ancho/2; X[1] = C2.X+C2.Ancho/2; Y[0] = C1.Y+C1.Alto; Y[1] = C2.Y+C2.Alto;
L2 = new Linea(color, X, Y);
}
}
}