import java.awt.*;
import java.awt.geom.*;
import java.lang.Math;
/**
 * class Circulo define a la forma geométrica circulo.
 * @author Luis Espinoza Severino.
 */
public class Circulo extends Forma
{
/**
 * Constructor de clase, inicializa los atributos de la clase circulo.
 */
   
   public Circulo (Point center, double radio)
     {
	elipse = new Ellipse2D.Double(center.getX()-radio, center.getY(),2*radio,2*radio);
	manipulable = false;
	centro = new Point2D.Double(center.getX(),center.getY());
	manSquare = new Rectangle2D.Double(center.getX()-2.5,center.getY()-2.5,5,5);
     }
   
/**Define como se pinta la figura en 2D.
 * @param g2d-
 */
   public void paintComponent(Graphics2D g2d)
     {
	g2d.setColor(Color.WHITE);
	g2d.draw(elipse);
	
	if(manipulable)//Si es manipulable pinta los cuadraditos.
	  {
	     g2d.draw(manSquare); 
	  }	
     }
/**Setea el radio y resetea el circulo(elipse).
 * @param r Radio.
 */
   public void setRadio(double r)
     {
	double centerX=elipse.getX()+elipse.getWidth()/2;
	double centerY=elipse.getY()+elipse.getHeight()/2;
	elipse.setFrame(centerX-r,centerY-r,2*r,2*r);
     }
   public void escalar(Point c, double factor)
     {
	double x = elipse.getX();
	double y = elipse.getY();
	x = c.getX()+factor*(x-c.getX());
	y = c.getY()+factor*(y-c.getY());
	double diameter = elipse.getWidth()*factor;
	elipse.setFrame(x,y,diameter,diameter);
	
	double centerX=elipse.getX()+elipse.getWidth()/2;
	double centerY=elipse.getY()+elipse.getHeight()/2;
	manSquare.setRect(centerX-2.5,centerY-2.5,5,5);	
	
     }
   public void rotar(Point c, double deltaAngulo)
     {
	double centerX=elipse.getX()+elipse.getWidth()/2-c.getX();
	double centerY=elipse.getY()+elipse.getHeight()/2-c.getY();
	double distancia = Math.sqrt(centerX*centerX+centerY*centerY);
	double anguloInicial=Math.atan2(centerY, centerX);
	centerX = distancia*Math.cos(anguloInicial+deltaAngulo) + c.getX();
	centerY = distancia*Math.sin(anguloInicial+deltaAngulo) + c.getY();
	double diameter=elipse.getWidth();
	elipse.setFrame(centerX-diameter/2, centerY-diameter/2,
			diameter, diameter);
	manSquare.setRect(centerX-2.5,centerY-2.5,5,5);
     }  

   public void trasladar (double dx, double dy)
     {
	double x=elipse.getX()+dx;
	double y=elipse.getY()+dy;
	double diameter=elipse.getWidth();
	elipse.setFrame(x, y, diameter, diameter);
	
	double centerX=elipse.getX()+elipse.getWidth()/2;
	double centerY=elipse.getY()+elipse.getHeight()/2;
	manSquare.setRect(centerX-2.5,centerY-2.5,5,5);	
     }
   
   public boolean isOn(Point p)
     {
	if(manSquare.contains(p))
	  return(true);
	else
	  return(false);
     }  	
   
   public void setManipulable(boolean b)
     {
	manipulable=b;
     }
//Atributos.   
   //Elipse para crear el circulo.
   private Ellipse2D.Double elipse;
   //manSquare son los cuadraditos de manipulacion,
   //para el circulo definimos el punto de manipulacion
   //como el centro.
   private Rectangle2D.Double manSquare;
   //manipulable, setea si la figura se puede manipular
   //o no.
   private boolean manipulable;
   //El centro de la circunferencia.
   private Point2D centro;
}	
