Diseño y Programación Orientados a Objetos
1er. Sem 2007
Tarea 1: Figuras Geométricas


Esta tarea tiene por objeto que:
  1. Usted se familiarice con el ambiente de desarrollo que usará en otras tareas y su proyecto.
  2. Evalúe la herramienta que resulte más cómoda para usted. En clases he sugerido trabajar con Emacs o Jgrasp.
  3. Aprenda a crear un Makefile
  4. Aprenda la generación automática de documentación usando javadoc.
  5. Ejercite los conceptos de clases, herencia y entrada y salida simple a consola.
Esta tarea es la primera de una secuencia donde paso a paso iremos aplicando el patrón de diseño Modelo-Vista-Control. Este modelo sugiere organizar en forma separada: los objetos que almacenan información (son el Modelo), las vistas que corresponde a la representación visual de esos datos (puede haber varias vistas), y el control que son las formas cómo los datos cambian. En esta primera tarea usted sólo trabajará en la forma cómo almacenará figuras geométricas. En cierto sentido hay mucha similitud con la tarea del año 2006. En próximas tareas en lugar de figuras geométricas, los objetos a manipular serán componentes eléctricas como Resistencias, Condensadores, Fuentes para armar un circuito (no una figura). Espero noten la analogía con lo que esta tarea les pide.

La tarea será revisada desde consola; es decir se requiere que usted cree un archivo Makefile para que el ayudante compile su trabajo sólo ejecutando la sentencia
$ make
Para ejecutar su programa el ayudante ejecutará
$ make run

Descripción General:
En esta tarea se le pide que usted implemente las clases rectángulo y círculo. Con instancias de estas clases usted construirá una figura a través de un menú por consola que le permitirá agregar formas a su figura.
Una vez que la figura esté creada, otro menú le permitirá trasladar, rotar, o escalar la figura previamente ingresada. Ante cada operación el programa mostrará por consola el estado de la figura luego de la operación.

Clase Forma
   Como diseño considere un requisito de la tarea que las clases Circulo y Rectangulo, sean subclase de la clase Forma.

La clase Forma es una clase abstracta con los siguientes métodos:
/**
 * Superclass para distintas formas en R2.
 * @author Agustín J. González
 */
public abstract class Forma
{
/** 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 desplazándola 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);
}

Clases Rectangulo y Circulo

Usted decida cómo representará los atributos de cada forma específica.

Para cada subclase redefina el método toString. En este método, usted deberá incluir la siguiente información:
Este es un <Clase del Objeto>: <lista de atributos>
Por ejemplo, para un rectángulo, podríamos tener:
"Este es un Rectangulo: Centro=(3,4) ; Ancho=5; alto=4, inclinación=45 grados."
O algo así.

Como constructores usted debe proveer:
Rectangulo(Point a, Point b);  /* rectángulo con lados paralelos a los ejes coordenados definido por los dos puntos indicados.*/
Circulo(Point c, double radio); /* Círculo de radio dado y centro en punto c. */
Incluya el método equals para cada tipo de forma.
Incluya el método clone para cada tipo de forma.

Clase Figura
Figura es una abstracción para una conjunto de formas. También podemos decir que una figura es una forma compuesta de otras formas más simples. Cada figura contiene una arreglo (ArrayList) de formas. La clase Figura también es subclase de Forma y como tal implementa todos sus métodos.
Redefina el método toString para Figura.

Clase TestFigura
  Esta clase permitirá revisar si las implementaciones de cada forma y Figura respondes a lo requerido.
La clase TestFigura posee al menos los siguientes métodos:
public Forma figuraFactory(); este método muestra un menú de texto en consola con opciones:
1: Crear Rectángulo
2: Crear Círculo
3: Salir
Este menú es presentado hasta que el usuario opta por 3 en cuyo caso el método retorna con la figura creada hasta entonces.

Otro método de TestFigura es:
public void manipularForma(Forma f); este método muestra un menú de texto en consola con opciones:
1: rotar
2: trasladar
3: escalar
4: Salir
Para cada operación se solicitan los parámetros, se aplica la operación a la forma, y se muestra en consola el resultado.

Notas:
En la documentación de esta tarea, no es necesario que usted haga una descripción en alto nivel de los algoritmos usados. En esta tarea la verificación de estilo es voluntaria. Usted debe entregar su código documentado de manera que se pueda generar la documentación con el utilitario javadoc.

Dele una mirada a la mejor solución del año pasado, también a otra implementación previa y al ejemplo de Makefile. Más información sobre Makefiles.