import java.awt.*;
import java.awt.geom.*;
import java.lang.Math;
/**Clase que define la figura Rectangulo.
 * @author Luis Espinoza Severino.
 */

public class Rectangulo extends Forma
{
   //Atributo Arreglo de esquinas.
   
   private Point2D[] esquina;
/**Constructor de la clase Rectangulo. Construye el rectangulo
 * a partir de el extremo izquierdo inferior, el ancho
 * y el alto.
 * @param punto Extremo izquierdo inferior.
 * @param ancho Ancho del rectangulo.
 * @param alto Alto del rectangulo.
 */
   public Rectangulo(Point punto, double ancho, double alto)
     {
	esquina = new Point2D[4];
	esquina[0] = new Point2D.Double(punto.getX(),punto.getY());
	esquina[1] = new Point2D.Double(punto.getX(),punto.getY()+alto);
	esquina[2] = new Point2D.Double(punto.getX()+ancho,punto.getY()+alto);
	esquina[3] = new Point2D.Double(punto.getX()+ancho,punto.getY());
	
	manipulable = false;	
	
     }
/**Metodo que define como se dibuja el rectangulo
 * @param g2d -
 */
   public void paintComponent(Graphics2D g2d)
     {
	g2d.setColor(Color.WHITE);
	for (int i=0; i<esquina.length;i++)
	  g2d.draw(new Line2D.Double(esquina[i],esquina[(i+1)%esquina.length]));
	
	if(manipulable)
	  {
	     g2d.draw(manSquare[0]);
	     g2d.draw(manSquare[1]);
	     g2d.draw(manSquare[2]);
	     g2d.draw(manSquare[3]);
	  }
	
     }
/**Escala en torno a center por un factor, vease Forma.java.
 * @param center -
 * @param factor -
 */
   public void escalar(Point center, double factor)
     {
	for (int i=0; i<esquina.length; i++)
	  {
	     esquina[i].setLocation(center.getX()+factor*(esquina[i].getX()-center.getX()),
				    center.getY()+factor*(esquina[i].getY()-center.getY()));
	     manSquare[i].setRect(esquina[i].getX()-2.5,esquina[i].getY()-2.5,5,5);
	  }
     }
/**Rota en torno al centro de rotacion dado el deltaAngulo, vease Forma.java
 * @param center -
 * @param deltaAngulo -
 */
   public void rotar(Point center, double deltaAngulo)
     {
	for(int i=0; i<esquina.length;i++){
	   double x = esquina[i].getX()-center.getX();
	   double y = esquina[i].getY()-center.getY();
	   double distancia = Math.sqrt(x*x + y*y);
	   double anguloInicial = Math.atan2(y, x);
	   x = distancia*Math.cos(anguloInicial+deltaAngulo) + center.getX();
	   y = distancia*Math.sin(anguloInicial+deltaAngulo) + center.getY();
	   esquina[i].setLocation(x,y);
	   manSquare[i].setRect(esquina[i].getX()-2.5,esquina[i].getY()-2.5,5,5);
	}
     }
/**Traslada el rectangulo, vease Forma.java
 * @param x movimiento horizontal.
 * @param y movimiento vertical.
 */
   public void trasladar(double x, double y)
     {
	for (int i=0; i<esquina.length;i++)
	  {
	     esquina[i].setLocation(esquina[i].getX()+x, esquina[i].getY()+y);
	     manSquare[i].setRect(esquina[i].getX()-2.5,esquina[i].getY()-2.5,5,5);
	  }
     }
/**Afirma si punto se encuentra sobre un cuadradito de manipulacion
 * @param punto Punto por el que se pregunta.
 */
   public boolean isOn(Point punto)
     {
	for (int i=0; i<manSquare.length;i++)
	  if(manSquare[i].contains(punto)) return true;
	return false;
     }
/**Fijar la tercera esquina del Rectangulo, se usa para su fijación dinámica
 * por parte del usuarion (con el mouse).
 * @param p
 */
   public void setThirdCorner(Point p) 
     {
	esquina[2] = new Point2D.Double(p.getX(),p.getY());
	esquina[1].setLocation(esquina[0].getX(), esquina[2].getY());
	esquina[3].setLocation(esquina[2].getX(), esquina[0].getY());      
	
     }
   
/**Fija los cuadraditos de manipulacion en las esquinas del triangulo.
 */
   public void lockmanSquares()
     {	manSquare = new Rectangle2D[4];
	manSquare[0] = new Rectangle2D.Double(esquina[0].getX()-2.5,esquina[0].getY()-2.5,5,5);
	manSquare[1] = new Rectangle2D.Double(esquina[1].getX()-2.5,esquina[1].getY()-2.5,5,5);
	manSquare[2] = new Rectangle2D.Double(esquina[2].getX()-2.5,esquina[2].getY()-2.5,5,5);
	manSquare[3] = new Rectangle2D.Double(esquina[3].getX()-2.5,esquina[3].getY()-2.5,5,5);
     }
/**Setea el valor de manipulable, para mostrar los cuadraditos o no.
 * @param b-
 */
   
   public void setManipulable(boolean b)
     {
	manipulable=b;
     }
   
   //Atributos
   //manipulable, verdadero, se puede manipular, se muestran los cuadrados.
   private boolean manipulable;
   //Cuadrados para manipulacion.
   private Rectangle2D[] manSquare;
   
}
