import java.awt.*;
import java.awt.geom.*;
import java.lang.Math;
/**Clase que define las caracteristicas y comportamiento de la figura "Triangulo".
 * @author Luis Espinoza S.
 */
public class Triangulo extends Forma
{
/*Constructor de la clase, el triangulo se reprecenta por sus puntos, se
 * setean sus atributos.
 * @param a Primer punto del triangulo.
 * @param b Segundo punto del triangulo.
 * @param c tercer punto del triangulo.
 */
   public Triangulo(Point a, Point b, Point c)
     {
	esquina = new Point2D[3];
	esquina[0] = new Point2D.Double(a.getX(),a.getY());
	esquina[1] = new Point2D.Double(b.getX(),b.getY());
	esquina[2] = new Point2D.Double(c.getX(),c.getY());
	
	manipulable = false;
		
	manSquare = new Rectangle2D[3];
	manSquare[0] = new Rectangle2D.Double();
	manSquare[1] = new Rectangle2D.Double();
	manSquare[2] = new Rectangle2D.Double();
	
	
     }
/**Define como pintar el triangulo.
 * @param g2d -
 */
   public void paintComponent(Graphics2D g2d)
     {
	g2d.setColor(Color.WHITE);
	g2d.draw(new Line2D.Double(esquina[0],esquina[1]));
	g2d.draw(new Line2D.Double(esquina[1],esquina[2]));
	g2d.draw(new Line2D.Double(esquina[2],esquina[0]));
	
	if(manipulable)
	  {
	     g2d.draw(manSquare[0]);
	     g2d.draw(manSquare[1]);
	     g2d.draw(manSquare[2]);
	  }


     }
/**Setea la primera esquina del triangulo sobre el punto p.
 * @param p -
 */
   public void setA(Point p)
     {
	esquina[0].setLocation(p.getX(),p.getY());
	manSquare[0].setRect(esquina[0].getX()-2.5,esquina[0].getY()-2.5,5,5);
     } 
/**Setea la segunda esquina del triangulo sobre el punto p.
 * @param p -
 */
   public void setB(Point p)
     {
	esquina[1].setLocation(p.getX(),p.getY());
	manSquare[1].setRect(esquina[1].getX()-2.5,esquina[1].getY()-2.5,5,5);	
     } 
/**Setea la tercera esquina del triangulo sobre el punto p.
 * @param p-
 */
   public void setC(Point p)
     {
	esquina[2].setLocation(p.getX(),p.getY());
	manSquare[2].setRect(esquina[2].getX()-2.5,esquina[2].getY()-2.5,5,5);	
	
     } 
/**Escala el triangulo en torno a center en 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 el triangulo en torno a un centro de rotacion un de angulo dado.
 * vease Forma.java.
 * @param center Centro de rotacion.
 * @param deltaAngulo angulo de rotacion.
 */
   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 triangulo. Vease Forma.java
 * @param x traslacion horizontal.
 * @param y traslacion 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);
	  }
     }
/**Averigua si el punto esta sobre un cuadradito de manipulacion.
 * @param punto -
 */
   public boolean isOn(Point punto)
     {
	for (int i=0; i<manSquare.length;i++)
	  if(manSquare[i].contains(punto)) return true;
	return false;
     }
/**Setea el bit manipulable, que permite el dibujo de los cuadrados y la manipulacion.
 * @param b -
 */
   public void setManipulable(boolean b)
     {
	manipulable=b;
     }
   
//Atributos   
   //manipulable: true permite dibujar los cuadraditos.
   private boolean manipulable;
   //esquina: esquinas del triangulo.
   private Point2D[] esquina;
   //manSquare: Cuadrados de manipulacion.
   private Rectangle2D[] manSquare;
   
}

