import java.awt.*;
import java.awt.geom.*;
import java.lang.Math;
/**Esta clase define los atributos y comportamientos de la forma Linea.
 * @author Luis Espinoza Severino.
 */
public class Linea extends Forma
{
/**Constructor de la clase linea, construye a partir de las coordenadas
 * de los puntos que definen el segmento.
 * @param x1 -
 * @param y1 -
 * @param x2 -
 * @param y2 -
 */
   public Linea(double x1, double y1, double x2, double y2)
     {
	punto = new Point2D[2];
	punto[0] = new Point2D.Double(x1,y1);
	punto[1] = new Point2D.Double(x2,y2);
	
	manipulable = false;
	
	manSquare1 = new Rectangle2D.Double();
	manSquare2 = new Rectangle2D.Double();
	
     }
/**Define como se dibuja la figura Linea.
 * @param g2d -
 */
   public void paintComponent(Graphics2D g2d)
     {
	g2d.setColor(Color.WHITE);
	g2d.draw(new Line2D.Double(punto[0],punto[1]));
	
	if(manipulable)
	  {
	     g2d.draw(manSquare1);
	     g2d.draw(manSquare2);
	  }
     }
/**Setea el primer punto de la Linea a p1.
 * @param p1 -
 */
   public void setP1(Point p1)
     {
	punto[0].setLocation(p1.getX(),p1.getY());
	manSquare1.setRect(punto[0].getX()-2.5,punto[0].getY()-2.5,5,5);
     } 
/**Setea el segundo punto de la Linea a p2.
 * @param p2 -
 */
   public void setP2(Point p2)
     {
	punto[1].setLocation(p2.getX(),p2.getY());
	manSquare2.setRect(punto[1].getX()-2.5,punto[1].getY()-2.5,5,5);
     } 
/**Escala la figura linea.
 * @param center -
 * @param factor -
 */
   public void escalar(Point center, double factor)
     {
	punto[0].setLocation(center.getX()+factor*(punto[0].getX()-center.getX()),
			     center.getY()+factor*(punto[0].getY()-center.getY()));
	manSquare1.setRect(punto[0].getX()-2.5,punto[0].getY()-2.5,5,5);
	
	punto[1].setLocation(center.getX()+factor*(punto[1].getX()-center.getX()),
			     center.getY()+factor*(punto[1].getY()-center.getY()));
	manSquare2.setRect(punto[1].getX()-2.5,punto[1].getY()-2.5,5,5);
     }
/**Rota la figura linea.
 * @param center -
 * @param deltaAngulo -
 */
   public void rotar(Point center, double deltaAngulo)
     {
	for(int i=0; i<punto.length;i++){
	   double x = punto[i].getX()-center.getX();
	   double y = punto[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();
	   punto[i].setLocation(x,y);
	   
	}
	manSquare1.setRect(punto[0].getX()-2.5,punto[0].getY()-2.5,5,5);
	manSquare2.setRect(punto[1].getX()-2.5,punto[1].getY()-2.5,5,5);
     }
/**Traslada la figura linea.
 * @param dx -
 * @param dy -
 */
   public void trasladar(double dx, double dy)
     {
	punto[0].setLocation(punto[0].getX()+dx,punto[0].getY()+dy);
	manSquare1.setRect(punto[0].getX()-2.5,punto[0].getY()-2.5,5,5);
	
	punto[1].setLocation(punto[1].getX()+dx,punto[1].getY()+dy);
	manSquare2.setRect(punto[1].getX()-2.5,punto[1].getY()-2.5,5,5);
     }
/**Pregunta si punto pertenece a algun cuadro de manipulacion de la figura.
 * @param punto -
 */
   public boolean isOn(Point punto)
     {
	if(manSquare1.contains(punto))
	  return true;
		
	else if(manSquare2.contains(punto))
	  return true;
		
	else return false;
     }
/**Setea la manipulacion de la figura.
 * @param b -
 */
   public void setManipulable(boolean b)
     {
	manipulable=b;
     }

//Atributos
   //manipulable: Permite dibujar los cuadros de manipulacion.
   private boolean manipulable;
   //punto:Arreglo de puntos del segmento linea.
   private Point2D[] punto;
   //manSquare: Cuadrados para manipulacion.
   private Rectangle2D manSquare1;
   private Rectangle2D manSquare2;
}
