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) + "]";
}
}