import java.awt.*;

/** 
* Superclass para distintas formas en R2.
* @author Agustín J. González
*/ 
public abstract class Forma 
{
/**
* Tamano de los cuadraditos verdes que aparecen cuando una forma
* esta seleccionada.
*/
protected static final int SIZE_OF_SQUARE = 4;

/** Escala la forma respecto al punto central en un factor dado.
* @param centro 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 abstract void escalar(Point centro, double factor);

/** Rota la forma respecto al punto central en un ángulo dado.
* @param centro Punto respecto del cual se hace la rotación.
* @param deltaAngulo ángulo de rotación en radianes.
*/
public abstract void rotar(Point centro, double deltaAngulo);

/** Traslada la forma desplazandola en sentido X e Y.
* @param deltaX desplazamiento en sentido horizontal.
* @param deltaY desplazamiento en sentido vertical.
*/
public abstract void trasladar(double deltaX, double deltaY);


/** Compara los contenidos de la forma pendiante y de la forma 
* dada en parametro.
* @param f Forma de comparada con la forma pendiente.
* @return True si los contenidos de las dos formas son iguales, false sino.
*/
public abstract boolean equals (Forma f);


/**Duplica la forma.
*@return Una copia de la forma.
*/
public abstract Forma clone();


/**
* Dibuja la forma en el Graphics2D dado en parametro.
* @param g Graphics2D donde se dibuja la forma.
*/
public abstract void paintComponent(Graphics2D g);

/**
* Selecciona la Forma de manera visual dibujando cuadraditos verdes a sus
* esquinas.
* @param g Graphics donde se dibujan los cuadraditos verdes de la figura
* seleccionada.
*/
public abstract void select(Graphics g);

/**
* Permite saber si la forma está seleccionada, es decir si el punto dado en
* parametro pertenece a ella.
* @param punto Point cuya coordinadas estan revisadas para comprobar si
* pertenecen a la forma.
* @return True si la figura está seleccionada, False sino.
*/
public abstract boolean isSelected(Point punto);

/**
* Permite saber si el punto dado en parametro está adentro de uno de los
* cuadraditos verdes que tiene la Forma cuando este seleccionada.
* @param p Point cuya coordinadas estan revisadas para comprobar si está
* adentro de uno de los cuadraditos verdes de la Figura.
* @return True si el punto está adentro de un cuadradito verde, False sino.
*/
public abstract boolean isItInAGreenSquare (Point p);

}

