04-01-2016, 12:10
Y aquí las clases proporcionadas por el profesor para comprobar el correcto funcionamiento de la práctica:
Código PHP:
package p5;
/**
* Gestiona formas geométricas que implementan la
* interfaz IMovible.
*
* @author Juan Ángel
*
*/
public class GestorFormas {
/**
* Identificadores de tipos de formas de objetos.
*/
public static final int FPrimeraForma = 1;
public static final int FPunto = 1;
public static final int FVector = 2;
public static final int FTriangulo = 3;
public static final int FCualquiera = 4;
public static final int FUltimaForma = 4;
/**
* Tamaños predeterminados
*/
public static final int Tiny = 1;
public static final int Small = 2;
public static final int Medium = 3;
public static final int Large = 4;
public static final int KingSize = 5;
/**
* Máximo de objetos permitidos en el gestor.
*/
public static final int MaxFormas = 18;
public static final int LimiteFormasAlcanzado = -1;
public static final int ArgumntoNulo = -2;
private IForma [] misFormas = new IForma[MaxFormas];
private int nroFormas = 0;
/**
* Añade un objeto al gestor si no se excede el máximo de objetos permitidos.
* Cuando un objeto se añade al gestor decimos que está registrado en el gestor.
*
* @param obj objeto añadido. obj debe ser distinto de null y no estar ya añadido.
* @return número de objetos registrados contando con el añadido,
* -1 si no se ha podido añadir la forma.
*/
public int aniadirForma(IForma obj){
if (obj==null)
return -1;
int count = 0;
for (int i=0; i<misFormas.length; i++){
if (misFormas[i]!=null)
count++;
}
if (count == MaxFormas)
return -1;
IForma [] misFormashechas = new IForma[count+1];
count = 0;
for (int i=0; i<misFormas.length; i++){
if (misFormas[i]!=null){
misFormashechas[count++]=misFormas[i];
}
if (misFormas[i]==obj)
return -1;
}
misFormashechas[count]=obj;
misFormas = misFormashechas;
return ++nroFormas;
}
/**
* Elimina todos los objetos del gestor.
*/
public void resetFormas(){
misFormas = new IForma[0];
nroFormas = 0;
}
/**
* Devuelve array con todos los objetos registrados en el gestor.
* @return array con todos los objetos registrados en el gestor.
*/
public IForma [] getFormas (){
IForma[] misFormashechas = new IForma[misFormas.length];
for (int i=0; i<misFormashechas.length; i++)
misFormashechas[i] = misFormas[i];
return misFormashechas;
}
/**
* Devuelve array con todos los puntos registrados en el gestor.
* @return array con todos los puntos registrados en el gestor.
*/
public Punto [] getPuntos(){
int count = 0;
for (int i=0; i<misFormas.length; i++)
if (misFormas[i] instanceof Punto)
count++;
Punto [] misPuntos = new Punto [count];
count = 0;
for (int i=0; i<misFormas.length; i++){
if (misFormas[i] instanceof Punto){
misPuntos[count] = (Punto) misFormas[i];
count++;
}
}
return misPuntos;
}
/**
* Devuelve array con todos los vectores registrados en el gestor.
* @return array con todos los vectores registrados en el gestor.
*/
public Vector [] getVectores(){
int count = 0;
for (int i=0; i<misFormas.length; i++)
if (misFormas[i] instanceof Vector)
count++;
Vector [] misVectores = new Vector [count];
count = 0;
for (int i=0; i<misFormas.length; i++){
if (misFormas[i] instanceof Vector)
misVectores[count++] = (Vector) misFormas[i];
}
return misVectores;
}
/**
* Devuelve array con todos los triángulos registrados en el gestor.
* @return array con todos los triángulos registrados en el gestor.
*/
public TrianguloEquilatero [] getTriangulos(){
int count = 0;
for (int i=0; i<misFormas.length; i++)
if (misFormas[i] instanceof TrianguloEquilatero)
count++;
TrianguloEquilatero [] misTriangulos = new TrianguloEquilatero [count];
count = 0;
for (int i=0; i<misFormas.length; i++){
if (misFormas[i] instanceof TrianguloEquilatero)
misTriangulos[count++] = (TrianguloEquilatero) misFormas[i];
}
return misTriangulos;
}
/**
* Mueve el objeto obj al punto especificado.
* Coloca el centro del objeto en el punto destino y lo
* orienta respecto del eje X según un determinado ángulo.
*
* Si el objeto no está registrado no hace nada.
*
* @param obj objeto a mover
* @param destino punto destino del objeto.
* @param orientacion angulo en grados de la figura con el eje X
*/
public void moverA(IForma obj, Punto destino, double orientacion){
if (obj instanceof Punto)
obj = destino;
if (obj instanceof Vector)
obj = new Vector (destino, ((Vector) obj).modulo(), orientacion);
if (obj instanceof TrianguloEquilatero){
TrianguloEquilatero a = (TrianguloEquilatero) obj;
Vector traslada = new Vector (a.getCentro(),destino);
Vector orienta = new Vector (new Punto(),1,orientacion);
a.trasladar(traslada);
a.orientar(orienta);
}
}
/**
* Mueve todas las formas de un cierto tipo a un punto determinado.
* Coloca todos los centros de las figuras en el punto destino y
* las orienta de igual forma respecto del eje X.
*
* @param tipoForma tipo de las formas a agrupar.
* @param destino punto de agrupamiento.
* @param orientacion angulo en grados de la figura con el eje X
*/
public void agruparFormas(int tipoForma, Punto destino, double orientacion){
if (tipoForma == FPunto){
for (int i=0; i<getPuntos().length; i++)
moverA(getVectores()[i],destino,orientacion);
}
if (tipoForma == FVector){
for (int i=0; i<getVectores().length; i++)
moverA(getVectores()[i],destino,orientacion);
}
if (tipoForma == FTriangulo){
for (int i=0; i<getTriangulos().length; i++){
moverA(getTriangulos()[i],destino,orientacion);
}
}
}
/**
* Devuelve una forma de un cierto tipo y tamaño colocada en el
* origen de coordenadas y orientada según eje Y.
*
* @param formaId Tipo de forma solicitada.
* @param size tamaño según tamaños predefinidos en la clase.
*
* @return forma generada.
*/
public static IForma getForma(int formaId, int size){
if (formaId == FPunto)
return new Punto();
if (formaId == FVector){
if (size == Tiny)
return new Vector (new Punto(),10,90);
if (size == Small)
return new Vector (new Punto(),20,90);
if (size == Medium)
return new Vector (new Punto(),30,90);
if (size == Large)
return new Vector (new Punto(),40,90);
if (size == KingSize)
return new Vector (new Punto(),50,90);
}
if (formaId == FTriangulo){
if (size == Tiny)
return new TrianguloEquilatero (10);
if (size == Small)
return new TrianguloEquilatero (20);
if (size == Medium)
return new TrianguloEquilatero (30);
if (size == Large)
return new TrianguloEquilatero (40);
if (size == KingSize)
return new TrianguloEquilatero (50);
}
return null;
}
}
Código PHP:
package p5;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Polygon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
public class TestGestorFormas extends JFrame implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
/*******************************************************************************
* Model elements
*/
private GestorFormas miGestor = new GestorFormas();
// Meeting points.
public static final Punto Origin = new Punto(0,0);
public static Vector V1 = new Vector(new Punto(150, 150), new Punto(160, 160)).getUnitario();
public static Vector V2 = new Vector(new Punto(150, -150), new Punto(160, -160)).getUnitario();
public static Vector V3 = new Vector(new Punto(-150, -150), new Punto(-160, -160)).getUnitario();
public static Vector V4 = new Vector(-150, 150).getUnitario();
// Predefined forms
private Punto [] puntos;
private IForma [] triangulos;
private IForma [] vectores;
Punto pos = new Punto();
Vector orientacion = new Vector();
private boolean rgPto, rgTri, rgVec;
// Color codes.
Color [] colors = {Color.DARK_GRAY, Color.black, Color.blue, Color.red};
int colorIndex = 0;
DecimalFormat form = new DecimalFormat();
/*******************************************************************************
* Graphical elements
*/
JMenuBar menuBar;
// Figure selection menu
JMenu menuFigs;
JMenuItem itCrearPuntos, itCrearTriangulos, itListar;
JMenu menuOperaciones;
// Rotation center entries
JMenuItem itDistancias, itAgruparTriangulos, itAreasPerimetros;
// Reset Panel
JButton btReset;
// Drawing area
private Lienzo lienzo;
public TestGestorFormas(){
super("Práctica 3. Test Gestor Formas");
form.setMaximumFractionDigits(2);
// Create and arrange application menus, controls and panels
buildMenus();
lienzo = new Lienzo();
// Event subscription. Window handles all events.
// Event sources have been instantiated in buildMenus.
// This code can be moved there.
// Form creation
itCrearPuntos.addActionListener(this);
itCrearTriangulos.addActionListener(this);
itListar.addActionListener(this);
// Operations
itDistancias.addActionListener(this);
itAgruparTriangulos.addActionListener(this);
itAreasPerimetros.addActionListener(this);
// Debug trace activation
btReset.addActionListener(this);
// Window layout.
getContentPane().add(lienzo);
// Window arrangements.
setSize (540,650);
setVisible(true);
validate();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent ae){
int signo = 1;
if (ae.getSource() == btReset){
System.out.println("btReset clicked.");
rgPto = rgTri = rgVec = false;
triangulos = vectores = null;
miGestor.resetFormas();
lienzo.updateForma();
System.out.println("-------------------------------------------------------");
System.out.println();
return;
}
// Form Selection
if (ae.getSource() == itCrearPuntos){
System.out.println("itCrearPuntos: Obteniendo y dibujando Puntos...");
if (!rgPto){
Punto p = new Punto(100, 100);
p.setColor(colorIndex);
miGestor.aniadirForma(p);
System.out.println("Punto creado en: " + p + " y añadido a gestor de formas.");
p = new Punto(-100, 50);
p.girar(20);
p.setColor(colorIndex);
miGestor.aniadirForma(p);
System.out.println("Punto creado en: " + p + " y añadido a gestor de formas.");
p = new Punto(-50, 50);
p.girar(-60);
p.setColor(colorIndex);
miGestor.aniadirForma(p);
System.out.println("Punto creado en: " + p + " y añadido a gestor de formas.");
colorIndex = (colorIndex+1)%colors.length;
rgPto = true;
}
puntos = miGestor.getPuntos();
lienzo.updateForma();
System.out.println("-------------------------------------------------------");
System.out.println();
return;
}
if (ae.getSource() == itCrearTriangulos){
System.out.println("itCrearTriangulos: Obteniendo y dibujando triángulos...");
if (!rgTri){
System.out.println("registrarFormas: Creando y registrando triángulos...");
TrianguloEquilatero tr = null;
for(int i = 0; i < 3; i++){
tr = new TrianguloEquilatero(30 * (i+1));
tr.trasladar(new Vector((-signo) * 60 * i, (-signo) * 40));
tr.girar(45 * (i+1));
tr.setColor(colorIndex);
miGestor.aniadirForma(tr);
colorIndex = (colorIndex+1)%colors.length;
signo = -signo;
System.out.println("Triángulo creado en: " + tr.getCentro());
}
rgTri = true;
}
triangulos = miGestor.getTriangulos();
lienzo.updateForma();
lienzo.updateForma();
System.out.println("-------------------------------------------------------");
System.out.println();
return;
}
if (ae.getSource() == itListar){
System.out.println("itListar: Lista de figuras registradas ...");
IForma misFormas [] = miGestor.getFormas();
for (int i = 0; i < misFormas.length; i++){
System.out.println(misFormas[i]);
}
System.out.println("-------------------------------------------------------");
System.out.println();
return;
}
if (ae.getSource() == itAreasPerimetros){
System.out.println("itAreasPerimetros: Lista áreas y perímetros de figuras registradas ...");
IForma misFormas [] = miGestor.getFormas();
for (int i = 0; i < misFormas.length; i++){
if (misFormas[i] instanceof IPoligonoRegular){
IPoligonoRegular f = (IPoligonoRegular) misFormas[i];
System.out.println("Forma ("+ misFormas[i].getClass() +")" + i + " Área = " + form.format(f.getArea()) + " perímetro = " + form.format(f.getPerimetro()));
}
else{
System.out.println("Forma (" + misFormas[i].getClass() + ") " + i + " no tiene definida ni área ni perímetro.");
}
}
System.out.println("-------------------------------------------------------");
System.out.println();
return;
}
if (ae.getSource() == itDistancias){
System.out.println("Calculando distancias ... ");
IForma [] misFormas = miGestor.getFormas();
for (int i = 0; i < misFormas.length-1; i++){
System.out.println("Distancia forma " + i + " a: ");
Punto p1 = new Punto(misFormas[i].getX(), misFormas[i].getY());
for(int j = i+1; j < misFormas.length; j++){
Punto p2 = new Punto(misFormas[j].getX(), misFormas[j].getY());
System.out.println("Forma " + j + " = " + p1.distancia(p2.getX(), p2.getY()));
}
System.out.println();
}
System.out.println("-------------------------------------------------------");
System.out.println();
return;
}
if (ae.getSource() == itAgruparTriangulos){
System.out.println("Agrupando triángulos en pC ... ");
miGestor.agruparFormas(GestorFormas.FTriangulo, V3.getPuntoAplicacion(), V3.getOrientacion());
lienzo.updateForma();
System.out.println("-------------------------------------------------------");
System.out.println();
return;
}
}
private void buildMenus(){
menuBar = new JMenuBar();
// Figure creation menu
menuFigs = new JMenu("Dibujar Figuras");
itCrearPuntos = new JMenuItem("Dibujar Puntos");
itCrearTriangulos = new JMenuItem("Dibujar Triángulos");
itListar = new JMenuItem("Listar en consola");
itAreasPerimetros = new JMenuItem("Listar áreas en consola");
menuBar.add(menuFigs);
menuFigs.add(itCrearPuntos);
menuFigs.add(itCrearTriangulos);
menuFigs.add(itListar);
menuFigs.add(itAreasPerimetros);
// Operations menu
menuOperaciones = new JMenu("Operaciones");
itDistancias = new JMenuItem("Calcular distancias");
itAgruparTriangulos = new JMenuItem("Agrupar triángulos");
menuBar.add(menuOperaciones);
menuOperaciones.add(itDistancias);
menuOperaciones.add(itAgruparTriangulos);
// Debug buttons
btReset = new JButton("Reset");
menuBar.add(btReset);
setJMenuBar(menuBar);
}
public static void main(String[] args) {
new TestGestorFormas();
}
public class Lienzo extends JPanel{
private static final long serialVersionUID = 1L;
IForma forma = null;
boolean debug = true;
boolean updated = false;
Color colorPincel = Color.white;
int Lx, Ly, Ox, Oy;
int margen = 20;
int longEjes = 100;
int anchoPunto = 4;
public void debugOn(){
debug = true;
System.out.println("Lienzo: Trace ON");
}
public void debugOff(){
debug = false;
System.out.println("Lienzo: Trace OFF");
}
public void setForma(IForma ob){
if (ob != null){
forma = ob;
repaint();
}
else if (debug){
System.out.println("Lienzo: Error --> setForma(null)");
}
}
public void updateForma(){
updated = false;
repaint();
}
public Lienzo(){
setBorder(BorderFactory.createLineBorder(Color.GREEN));
setBackground(Color.white);
}
public void setColor(Color c){
colorPincel = c;
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.black);
// Drawing canvas edges
Dimension dim = this.getSize();
Lx = dim.width - margen;
Ly = dim.height - margen;
Ox = dim.width / 2;
Oy = dim.height - dim.height/2;
g.drawLine(Ox - longEjes, Oy, Ox + longEjes, Oy);
g.drawLine(Ox, Oy - longEjes, Ox, Oy + longEjes);
g.drawRect(10, 10, Lx, Ly);
// Drawing rotation points
dibujarVector(V1, "v1", g);
dibujarVector(V2, "v2", g);
dibujarVector(V3, "v3", g);
dibujarVector(V4, "v4", g);
IForma [] misFormas = miGestor.getFormas();
if (misFormas != null){
for (int i = 0; i < misFormas.length; i++){
dibujarForma(misFormas[i], "f_" + i , g);
}
}
updated = true;
}
public void dibujarForma(IForma forma, String id, Graphics g){
if (forma == null){
return;
}
if (forma instanceof Punto){
dibujarPunto((Punto)forma, id, g);
}
if (forma instanceof Vector){
dibujarVector((Vector)forma, id, g);
}
else if (forma instanceof IPoligonoRegular){
dibujarPoligono((IPoligonoRegular)forma, id, g);
}
}
public void dibujarVector(Vector vtr, String id, Graphics g){
Color c = g.getColor();
g.setColor(colors[vtr.getColor()]);
Punto p = vtr.getPuntoAplicacion();
int x1 = (int)p.getX();
int y1 = (int)p.getY();
int x2 = x1 + (int)(vtr.getCompX() * 30);
int y2 = y1 + (int)(vtr.getCompY() * 30);
int ax = x2 - (int)(vtr.getUnitario().getCompX() * 15);
int ay = y2 - (int)(vtr.getUnitario().getCompY() * 15);
double tetha = vtr.getUnitario().getOrientacion() * Math.PI / 180.0;
int bx = ax - (int)(10 * Math.cos((Math.PI/2) - tetha));
int by = ay + (int)(10 * Math.sin((Math.PI/2) - tetha));
int cx = ax + (int)(10 * Math.cos((Math.PI/2) - tetha));
int cy = ay - (int)(10 * Math.sin((Math.PI/2) - tetha));
g.drawLine(Ox + x1, Oy - y1, Ox + x2, Oy - y2);
g.drawLine(Ox + x2, Oy - y2, Ox + bx, Oy - by);
g.drawLine(Ox + x2, Oy - y2, Ox + cx, Oy - cy);
g.drawString(id, Ox + (int)p.getX() + 10, Oy - (int)p.getY() + 10);
g.setColor(c);
}
public void dibujarPunto(Punto p, String id, Graphics g){
g.setColor(colors[p.getColor()]);
g.fillOval(Ox + (int)((p.getX() - anchoPunto)),
Oy - (int)((p.getY() + anchoPunto)),
anchoPunto * 2, anchoPunto * 2);
g.drawString(id, Ox + (int)p.getX() + 10, Oy - (int)p.getY() + 10);
Color color = g.getColor();
colorPincel = Color.GREEN;
colorPincel = color;
}
public void dibujarPoligono(IPoligonoRegular pr, String id, Graphics g){
if (!(pr instanceof IPoligonoRegular)){
return;
}
IPoligonoRegular pr1 = (IPoligonoRegular) pr;
g.setColor(colors[((IForma)pr).getColor()]);
Punto pto [] = pr1.getVertices();
int xC [] = new int[pto.length];
int yC [] = new int[pto.length];
for (int i = 0; i < pto.length; i++){
xC[i] = (int) pto[i].getX() + Ox;
yC[i] = Oy - (int) pto[i].getY();
}
Polygon pol = new Polygon(xC, yC, xC.length);
dibujarPunto(pr.getCentro(), id, g);
g.drawPolygon(pol);
}
}
/*
private String toCoords(double x, double y){
return "[" + x + ", " + y + "]";
}
*/
}
Código PHP:
package p5;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Polygon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
public class TestMovimientos extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
/*******************************************************************************
* Model elements
*/
// Translation modes:
public static final int PuntosCardinales = 1;
public static final int EjeFigura = 2;
// Rotation modes:
public static final int CentroExterno = 1;
public static final int CentroDeMasas = 2;
// Vectores de traslación según ejes x e y
public static final Vector I = new Vector(1, 0);
public static final Vector MenosI = new Vector(-1, 0);
public static final Vector J = new Vector(0, 1);
public static final Vector MenosJ = new Vector(0, -1);
// Rotation centers.
public static final Punto Origin = new Punto(0,0);
public static final Punto P1 = new Punto(100, 100);
public static final Punto P2 = new Punto(100, -100);
public static final Punto P3 = new Punto(-100, -100);
public static final Punto P4 = new Punto(-100, 100);
// Current shape
private IForma forma = null; //new Punto();
// Current shift and rotation steps
private double pasoLineal = 10;
private double pasoGiro = 10;
private double zoom = 1;
// Current translation model;
private int modoTraslacion = PuntosCardinales;
// Current rotation center and mode
private Punto roc = Origin;
private int modoRotacion = CentroExterno;
// Color codes.
Color [] colors = {Color.black, Color.orange, Color.green, Color.blue, Color.red};
int colorIndex = 0;
DecimalFormat form = new DecimalFormat();
/*******************************************************************************
* Graphical elements
*/
JMenuBar menuBar;
// Figure selection menu
JMenu menuFigs;
JMenuItem itVector, itTriangulo, itPunto;
// Motion parameters menu
JMenu menuParametrosMovimiento;
JMenu menuRotacion;
JMenu menuTraslacion;
// Rotation center entries
JMenuItem itRotOrig, itRotCdm, itRotP1, itRotP2, itRotP3, itRotP4;
JMenuItem itR10, itR30, itR90; // Rotation step in degrees.
// Translation configuration entries
JMenuItem itTrasladarSgOr, itTrasladarSgNSEO;
JMenuItem itD10, itD20, itD40; // Shift step
// Motion panels: Translation and rotation panels.
JPanel pnTranslate, pnRotate;
JButton btUp, btDown, btRigth, btLeft, btTurnRigth, btTurnLeft;
JLabel lbRotate, lbTranslate;
JLabel lbX, lbY, lbGrados;
// Reset Panel
JButton btReset, btZoomIn, btZoomOut;
// Drawing area
private Lienzo lienzo;
// Control area
private JPanel pnControl;
public TestMovimientos(){
super("Practica 3. Test Movimientos.");
// Create and arrange application menus, controls and panels
buildMenus();
buildMotionPanels();
lienzo = new Lienzo();
// Event subscription. Window handles all events.
// Event sources have been instantiated in buildMenus and buildMotion methods.
// This code can be moved there.
// Form selection
itVector.addActionListener(this);
itTriangulo.addActionListener(this);
itPunto.addActionListener(this);
// Translation mode selection
itTrasladarSgOr.addActionListener(this);
itTrasladarSgNSEO.addActionListener(this);
// Rotation center selection
itRotOrig.addActionListener(this);
itRotCdm.addActionListener(this);
itRotP1.addActionListener(this);
itRotP2.addActionListener(this);
itRotP3.addActionListener(this);
itRotP4.addActionListener(this);
// Translation buttons.
btUp.addActionListener(this);
btDown.addActionListener(this);
btRigth.addActionListener(this);
btLeft.addActionListener(this);
// Rotation buttons
btTurnRigth.addActionListener(this);
btTurnLeft.addActionListener(this);
// Reset Button
btReset.addActionListener(this);
// Zoom buttons
btZoomIn.addActionListener(this);
btZoomOut.addActionListener(this);
// Window layout.
getContentPane().add(lienzo);
getContentPane().add(pnControl, BorderLayout.SOUTH);
// Window arrangements.
setSize (500,650);
setVisible(true);
validate();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Double numbers representation.
form.setMaximumFractionDigits(2);
System.out.println("Centros de Rotación: ");
System.out.println("P1: " + P1);
System.out.println("P2: " + P2);
System.out.println("P3: " + P3);
System.out.println("P4: " + P4);
System.out.println("-------------------------------------------------------");
}
public void actionPerformed(ActionEvent ae){
if (ae.getSource() == btReset){
System.out.println("btReset clicked.");
if (forma != null){
forma = new Punto(0,0);
lienzo.setForma(forma);
updateLabels();
}
System.out.println("-------------------------------------------------------");
System.out.println();
return;
}
if (ae.getSource() == itPunto){
System.out.println("Se ha seleccionado un PUNTO.");
forma = new Punto(0,0);
System.out.println("Punto Creado --> " + forma);
lienzo.setForma(forma);
System.out.println("-------------------------------------------------------");
System.out.println();
return;
}
if (ae.getSource() == itVector){
System.out.println("Se ha seleccionado un VECTOR.");
forma = new Vector();
System.out.println("Punto Creado --> " + forma);
lienzo.setForma(forma);
System.out.println("-------------------------------------------------------");
System.out.println();
return;
}
if (ae.getSource() == itTriangulo){
System.out.println("Se ha seleccionado un TRIANGULO.");
forma = new TrianguloEquilatero(100);
System.out.println("Trinagulo Creado --> " + forma);
lienzo.setForma(forma);
System.out.println("-------------------------------------------------------");
System.out.println();
return;
}
// Escalado
if (ae.getSource() == btZoomIn){
System.out.println("Se ha seleccionado ZOOM IN.");
if (zoom > 0.25){
zoom /= 2;
forma = forma.escalar(0.5);
lienzo.setForma(forma);
}
return;
}
if (ae.getSource() == btZoomOut){
System.out.println("Se ha seleccionado ZOOM OUT.");
if (zoom <= 4){
zoom *= 2;
forma = forma.escalar(2);
lienzo.setForma(forma);
}
return;
}
// Traslation
if (ae.getSource() == btUp || ae.getSource() == btDown || ae.getSource() == btRigth || ae.getSource() == btLeft){
if (forma == null){
System.out.println("Movimiento imposible: No hay figura activa.");
return;
}
System.out.print("Traslación según " +
(modoTraslacion == PuntosCardinales? " NSEO ":" Eje figura ") +
" From: " + toCoords(forma.getX(), forma.getY()) + " Grados: " + form.format(forma.getOrientacion()) + " To ");
Vector vtrTraslacion = null;
if (modoTraslacion == PuntosCardinales) {
if (ae.getSource() == btUp){
vtrTraslacion = (Vector) J.escalar(pasoLineal);
}
else if (ae.getSource() == btDown){
vtrTraslacion = (Vector) J.escalar(-pasoLineal);
}
else if (ae.getSource() == btRigth){
vtrTraslacion = (Vector) I.escalar(pasoLineal);
}
else if (ae.getSource() == btLeft){
vtrTraslacion = (Vector) I.escalar(-pasoLineal);
}
forma = forma.trasladar(vtrTraslacion.getCompX(), vtrTraslacion.getCompY());
}
else{
if (ae.getSource() == btUp){
vtrTraslacion = (Vector) Vector.getUnitario(forma.getOrientacion()).escalar(pasoLineal);
}
else if (ae.getSource() == btDown){
vtrTraslacion = (Vector) Vector.getUnitario(forma.getOrientacion()).escalar(-pasoLineal);
}
forma = forma.trasladar(vtrTraslacion.getCompX(), vtrTraslacion.getCompY());
}
System.out.println(toCoords(forma.getX(), forma.getY()) + " Grados: " + form.format(forma.getOrientacion()));
System.out.println("-------------------------------------------------------");
System.out.println();
lienzo.setForma(forma);
//lienzo.updateForma();
updateLabels();
return;
}
// Rotation
if (ae.getSource() == btTurnRigth || ae.getSource() == btTurnLeft){
if (forma == null){
System.out.println("Movimiento imposible: No hay figura activa.");
return;
}
System.out.print("Rotación segun " +
(modoRotacion == CentroDeMasas? (" cdm " + toCoords(forma.getX(), forma.getY())):(" roc " + roc)) +
" From " + toCoords(forma.getX(), forma.getY()) + " Grados: " + form.format(forma.getOrientacion()) + " To ");
if (modoRotacion == CentroExterno) {
if (ae.getSource() == btTurnRigth){
forma = forma.girar(-pasoGiro, roc.getX(), roc.getY());
}
else if (ae.getSource() == btTurnLeft){
forma = forma.girar(pasoGiro, roc.getX(), roc.getY());
}
}
else{
if (ae.getSource() == btTurnRigth){
forma = forma.girar(-pasoGiro);
}
else if (ae.getSource() == btTurnLeft){
forma = forma.girar(pasoGiro);
}
}
System.out.println(toCoords(forma.getX(), forma.getY()) + " Grados: " + form.format(forma.getOrientacion()));
System.out.println("-------------------------------------------------------");
System.out.println();
lienzo.setForma(forma);
//lienzo.updateForma();
updateLabels();
return;
}
// Translation mode.
if (ae.getSource() == itTrasladarSgOr ){
System.out.println("Cambiando modo traslación ---> Según Orientación " );
btRigth.setEnabled(false);
btLeft.setEnabled(false);
modoTraslacion = EjeFigura;
System.out.println("-------------------------------------------------------");
System.out.println();
return;
}
if (ae.getSource() == itTrasladarSgNSEO){
System.out.println("Cambiando modo traslación ---> Según XY " );
btRigth.setEnabled(true);
btLeft.setEnabled(true);
modoTraslacion = PuntosCardinales;
System.out.println("-------------------------------------------------------");
System.out.println();
return;
}
// Rotation Center and mode
if (ae.getSource() == itRotOrig ||
ae.getSource() == itRotP1 ||ae.getSource() == itRotP2 ||ae.getSource() == itRotP3 ||ae.getSource() == itRotP4 ||
ae.getSource() == itRotCdm){
System.out.print("Cambiando centro de rotación a ");
if (ae.getSource() == itRotCdm){
System.out.println(" centro del cuerpo. ");
modoRotacion = CentroDeMasas;
}
else{
System.out.print(" punto externo: ");
modoRotacion = CentroExterno;
if (ae.getSource() == itRotP1){
roc = P1;
}
if (ae.getSource() == itRotP2){
roc = P2;
}
if (ae.getSource() == itRotP3){
roc = P3;
}
if (ae.getSource() == itRotP4){
roc = P4;
}
if (ae.getSource() == itRotOrig){
roc = Origin;
}
System.out.println(roc);
}
System.out.println("-------------------------------------------------------");
System.out.println();
return;
}
}
private void updateLabels(){
DecimalFormat form = new DecimalFormat();
form.setMaximumFractionDigits(2);
lbX.setText(String.valueOf(form.format(forma.getX())));
lbY.setText(String.valueOf(form.format(forma.getY())));
lbGrados.setText(String.valueOf(form.format(forma.getOrientacion())));
}
private void buildMenus(){
menuBar = new JMenuBar();
// Figure selection menu
menuFigs = new JMenu("Figura");
itVector = new JMenuItem("Vector");
itTriangulo = new JMenuItem("Triángulo");
itPunto = new JMenuItem("Punto");
menuBar.add(menuFigs);
menuFigs.add(itVector);
menuFigs.add(itTriangulo);
menuFigs.add(itPunto);
// Rotation center menu
menuParametrosMovimiento = new JMenu("Parametros de Movimiento");
// Rotation parameters
menuRotacion = new JMenu("Rotacion");
itRotOrig = new JMenuItem("Respecto Origen de Coordenadas");
itRotCdm = new JMenuItem("Respecto Centro de la figura");
itRotP1 = new JMenuItem("Respecto P1");
itRotP2 = new JMenuItem("Respecto P2");
itRotP3 = new JMenuItem("Respecto P3");
itRotP4 = new JMenuItem("Respecto P4");
menuRotacion.add(itRotOrig);
menuRotacion.add(itRotCdm);
menuRotacion.add(itRotP1);
menuRotacion.add(itRotP2);
menuRotacion.add(itRotP3);
menuRotacion.add(itRotP4);
// Translation parameters
menuTraslacion = new JMenu("Traslación");
itTrasladarSgOr = new JMenuItem("Según orientación");
itTrasladarSgNSEO = new JMenuItem("NSEO");
itD10 = new JMenuItem("Paso 10");
itD20 = new JMenuItem("Paso 20");
itD40 = new JMenuItem("Paso 40º");
menuTraslacion.add(itTrasladarSgOr);
menuTraslacion.add(itTrasladarSgNSEO);
// Menu Bar
menuBar.add(menuRotacion);
menuBar.add(menuTraslacion);
//menuBar.add(btReset);
setJMenuBar(menuBar);
}
private void buildMotionPanels(){
// Translation panel.
pnTranslate = new JPanel();
pnTranslate.setBorder(BorderFactory.createLineBorder(Color.BLUE));
btUp = new JButton("Ar");
btDown = new JButton("Ab");
btRigth = new JButton("D");
btLeft = new JButton("I");
btReset = new JButton("Reset Motion");
btZoomIn = new JButton("ZoomIn");
btZoomOut = new JButton("ZoomOut");
lbTranslate = new JLabel("Trasladar");
lbX = new JLabel("0");
lbY = new JLabel("0");
// Auxiliar elements.
JLabel [] relleno1 = new JLabel[5];
for (int i = 0; i < relleno1.length; i++){
relleno1[i] = new JLabel();
}
JPanel pnButtons1 = new JPanel();
pnButtons1.setBorder(BorderFactory.createLineBorder(Color.BLUE));
pnButtons1.setLayout(new GridLayout(3,3));
pnButtons1.add(relleno1[1]);
pnButtons1.add(btUp);
pnButtons1.add(relleno1[2]);
pnButtons1.add(btLeft);
pnButtons1.add(relleno1[3]);
pnButtons1.add(btRigth);
pnButtons1.add(relleno1[4]);
pnButtons1.add(btDown);
pnButtons1.add(relleno1[0]);
pnTranslate.setLayout(new GridLayout(1,2));
JPanel pnLabels1 = new JPanel();
pnLabels1.setLayout(new GridLayout(1,3));
pnLabels1.add(lbTranslate);
pnLabels1.add(lbX);
pnLabels1.add(lbY);
pnTranslate.add(pnLabels1);
pnTranslate.add(pnButtons1);
// Rotation panel.
pnRotate = new JPanel();
pnRotate.setBorder(BorderFactory.createLineBorder(Color.BLUE));
btTurnRigth = new JButton("Dcha");
btTurnLeft = new JButton("Izda");
lbRotate = new JLabel("Rotar");
lbGrados = new JLabel("0");
// Auxiliar elements.
JLabel relleno2 = new JLabel();
JPanel pnButtons2 = new JPanel();
pnButtons2.setBorder(BorderFactory.createLineBorder(Color.BLUE));
pnButtons2.setLayout(new GridLayout(1,3));
pnButtons2.add(btTurnLeft);
pnButtons2.add(relleno2);
pnButtons2.add(btTurnRigth);
pnRotate.setLayout(new GridLayout(1, 2));
JPanel pnLabels2 = new JPanel();
pnLabels2.setLayout(new GridLayout(1,2));
pnLabels2.add(lbRotate);
pnLabels2.add(lbGrados);
pnRotate.add(pnLabels2);
pnRotate.add(pnButtons2);
// Putting all together
JPanel pnMot = new JPanel();
pnMot.setLayout(new BorderLayout());
pnMot.add(pnTranslate);
pnMot.add(pnRotate, BorderLayout.SOUTH);
pnControl = new JPanel();
pnControl.setLayout(new BorderLayout());
pnControl.add(pnMot);
JPanel pnA = new JPanel();
pnA.add(btReset);
pnA.add(btZoomIn);
pnA.add(btZoomOut);
pnControl.add(pnA, BorderLayout.SOUTH);
}
public static void main(String[] args) {
new TestMovimientos();
}
public class Lienzo extends JPanel{
private static final long serialVersionUID = 1L;
IForma forma = null;
boolean debug = true;
boolean updated = false;
int Lx, Ly, Ox, Oy;
int margen = 20;
int longEjes = 100;
int anchoPunto = 4;
/*
public void debugOn(){
debug = true;
System.out.println("Lienzo: Trace ON");
}
public void debugOff(){
debug = false;
System.out.println("Lienzo: Trace OFF");
}
*/
public void setForma(IForma ob){
if (ob != null){
forma = ob;
repaint();
}
else if (debug){
System.out.println("Lienzo: Error --> setForma(null)");
}
}
/*
public void updateForma(){
updated = false;
repaint();
}
*/
public Lienzo(){
setBorder(BorderFactory.createLineBorder(Color.GREEN));
setBackground(Color.white);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.DARK_GRAY);
// Drawing canvas edges
Dimension dim = this.getSize();
Lx = dim.width - margen;
Ly = dim.height - margen;
Ox = dim.width / 2;
Oy = dim.height - dim.height/2;
g.drawLine(Ox - longEjes, Oy, Ox + longEjes, Oy);
g.drawLine(Ox, Oy - longEjes, Ox, Oy + longEjes);
//g.drawRect(10, 10, Lx, Ly);
// Drawing rotation points
dibujarPosicion(P1, g);
g.drawString("P1", Ox + (int)P1.getX() + 10, Oy - (int)P1.getY() + 10);
dibujarPosicion(P2, g);
g.drawString("P2", Ox + (int)P2.getX() + 10, Oy - (int)P2.getY() + 10);
dibujarPosicion(P3, g);
g.drawString("P3", Ox + (int)P3.getX() + 10, Oy - (int)P3.getY() + 10);
dibujarPosicion(P4, g);
g.drawString("P4", Ox + (int)P4.getX() + 10, Oy - (int)P4.getY() + 10);
double x = 0, y = 0;
if (forma == null){
return;
}
x = forma.getX();
y = forma.getY();
if (forma instanceof Punto){
dibujarPosicion((Punto)forma, g);
}
else if (forma instanceof IPoligonoRegular){
dibujarPoligono((IPoligonoRegular)forma, g);
}
else if (forma instanceof Vector){
dibujarVector((Vector)forma, g);
}
//g.drawString(toCoords(x, y), 30, 30);
updated = true;
}
public void dibujarVector(Vector vtr, Graphics g){
Color c = g.getColor();
g.setColor(Color.BLUE);
Punto p = vtr.getPuntoAplicacion();
int x1 = (int)p.getX();
int y1 = (int)p.getY();
int x2 = x1 + (int)(vtr.getCompX() * 30);
int y2 = y1 + (int)(vtr.getCompY() * 30);
int ax = x2 - (int)(vtr.getUnitario().getCompX() * 15);
int ay = y2 - (int)(vtr.getUnitario().getCompY() * 15);
double tetha = vtr.getUnitario().getOrientacion() * Math.PI / 180.0;
int bx = ax - (int)(10 * Math.cos((Math.PI/2) - tetha));
int by = ay + (int)(10 * Math.sin((Math.PI/2) - tetha));
int cx = ax + (int)(10 * Math.cos((Math.PI/2) - tetha));
int cy = ay - (int)(10 * Math.sin((Math.PI/2) - tetha));
g.drawLine(Ox + x1, Oy - y1, Ox + x2, Oy - y2);
g.drawLine(Ox + x2, Oy - y2, Ox + bx, Oy - by);
g.drawLine(Ox + x2, Oy - y2, Ox + cx, Oy - cy);
g.setColor(c);
}
/**
* Dibuja un punto
* @param p
* @param g
*/
public void dibujarPosicion(Punto p, Graphics g){
Color c = g.getColor();
g.setColor(Color.black);
g.fillOval(Ox + (int)((p.getX() - anchoPunto)),
Oy - (int)((p.getY() + anchoPunto)),
anchoPunto * 2, anchoPunto * 2);
g.setColor(c);
}
/**
* Dibuja un polígono
* @param pr
* @param g
*/
public void dibujarPoligono(IPoligonoRegular pr, Graphics g){
if (!(pr instanceof IPoligonoRegular)){
return;
}
IPoligonoRegular pr1 = (IPoligonoRegular) pr;
Color c = g.getColor();
g.setColor(Color.red);
Punto pto [] = pr1.getVertices();
int xC [] = new int[pto.length];
int yC [] = new int[pto.length];
for (int i = 0; i < pto.length; i++){
xC[i] = (int) pto[i].getX() + Ox;
yC[i] = Oy - (int) pto[i].getY();
}
dibujarPosicion(pr.getCentro(), g);
dibujarVector(pr1.getUnitario(), g);
Polygon pol = new Polygon(xC, yC, xC.length);
g.drawPolygon(pol);
g.setColor(c);
}
}
private String toCoords(double x, double y){
DecimalFormat form = new DecimalFormat();
form.setMaximumFractionDigits(2);
return "[" + form.format(x) + ", " + form.format(y) + "]";
}
}
"Que yo sepa, el español medio no es más honrado que los políticos que lo gobiernan"