import java.awt.*;
import java.awt.geom.*;
import java.lang.Math;

/**
* <strong> Clase que implementa la representation de una cruz usada para los
* metodos escalar y rotar de las formas geométricas.<strong>
*/
public class Cruz extends Forma
{
private static final int SIZE_CRUZ = 5;
/**
* Cuadraditos verde de selección de la Cruz.
*/
private Rectangle2D greenSquare;



/** Constructor
* Construye una cruz de tamaño 5 centrada en (0, 0).
*/
 public Cruz ()
    {
      center = new Point(0, 0);
      size = SIZE_CRUZ;
    }
 /**
 * Metodo que permite cambiar la ubicacion de la cruz.
 * @param c Punto en el centro de la cruz.
 */ 
 public void setPoint(Point c)
    {
      center = new Point(c);
    }

/**
* Metodo que permite acceder al punto central de la cruz.
* @return El punto central de la cruz.
*/
public Point getPoint()
{
return center;
}

/**
* Metodo que dibuja la cruz en el Graphics2D dado en parametro.
* @param g2d Graphics2D donde la cruz se dibuja.
*/
public void paintComponent(Graphics2D g2d)
  {
  g2d.draw(new Line2D.Double((int)(center.X - size), (int)(center.Y - size),
                             (int)(center.X + size), (int)(center.Y + size)));
  g2d.draw(new Line2D.Double((int)(center.X + size), (int)(center.Y - size),
                             (int)(center.X - size), (int)(center.Y + size)));
  }
  
/** Escala la cruz respecto al punto c en un factor dado.
* @param c Punto respecto del cual se hace el escalamiento.
* @param factor Factor usado en el escalamiento. >1 corresponde a amplificación,
*<1 corresponde a reducción.
*/
public void escalar (Point c, double factor)
    {
      if (!center.equals(c))
      {
      center.escalar (c, factor);
      size *= factor;
      }
    }

/** Rota la cruz respecto al punto c en un ángulo dado.
* @param c Punto respecto del cual se hace la rotación.
* @param deltaAngulo ángulo de rotación en radianes.
*/  
public void rotar (Point c, double deltaAngulo)
    {
    if (!center.equals(c)) center.rotar(c, deltaAngulo);
    
    }

/** Traslada la cruz desplazandolo en sentido X e Y.
* @param dx desplazamiento en sentido horizontal.
* @param dy desplazamiento en sentido vertical.
*/  
public void trasladar (double dx, double dy)
    {
    center.X += dx;
    center.Y += dy;
    }
  
/**
* Metodo que permite saber si el punto dado en parametro pertenece
* a la cruz.
* @param p punto Punto cuya coordenadas son revisadas para comprobar si 
* pertenecen o no a la cruz.
* @return True si punto hace parte de la cruz, False sino.
*/  
public boolean isSelected (Point p)
  {
  return ((p.X == center.X) && ((p.Y > center.Y - size)
  && (p.Y < center.Y + size)) || (p.Y == center.Y)
  && ((p.X > center.X - size) && (p.X < center.X + size)));
  }
  
/**
* Metodo que dibuja un cuadradito verde en el centro de la cruz para mostrar
* que esta está seleccionada.
* @param g Graphics donde se dibujan el cuadradito verde.
*/
public void select(Graphics g)
  {
   g.setColor(Color.green);
   greenSquare = new Rectangle2D.Double((center.X - 2), (center.Y - 2), 
   SIZE_OF_SQUARE, SIZE_OF_SQUARE);
   Graphics2D g2 = (Graphics2D) g;
   g2.draw(greenSquare);
   g.setColor(Color.black);
  }
  
/**
* Duplica la Cruz.
* @return Una Cruz identica a la cruz pendiente.
*/
public Forma clone()
{
Cruz copia = new Cruz();

copia.setPoint(center);

return copia;
}  

/**
* Metodo que permite saber si el punto dado en parametro pertenece al
* cuadraditos de seleccion de la Cruz. 
* @param p Punto cuyas coordinadas estan revisadas para ver si pertenece
* al cuadradito verde de seleccion de la Cruz.
* @return True si el punto dado en parametro pertenece al cuadradito
* de seleccion de la Cruz, False sino.
*/
public boolean isItInAGreenSquare(Point p)
{
Point2D p2 = new Point2D.Double(p.X, p.Y);
return (greenSquare.contains(p2));
}


/**
*Compara la forma dada en parametro con la Cruz.
*@param f Forma comparada con la cruz.
*@return True si la forma es una cruz identica a la cruz pendiente,
*False sino.
*/
public boolean equals (Forma f)
{
if (this == f) return true;

if (f == null) return false;

if (getClass() != f.getClass()) return false;

Cruz otro = (Cruz)f;

return ((center.equals(otro.getPoint())));
}
private Point center;
private int size;

}

