Diseño y Programación Orientados a Objetos
1er. Sem 2006
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.
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, círculo, línea, y triángulo. Luego usted deberá crear un programa de prueba donde ejercitará los métodos creados para cada clase. Usted hará uso de implementaciones de toString para mostrar por consola el resultado de sus operaciones.

Clase Forma
   Como diseño considere como requisito dado de la tarea que las clases Circulo, Rectangulo, Linea, y Triangulo, son 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 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);
}

Clases Rectangulo, Circulo, Triangulo, y Linea

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(double ancho, double alto);  /* rectángulo inicialmente centrado en (0,0), e inclincación 0 grados.*/
Circulo(double radio); /* Círculo de radio dado y centro en (0,0). */
Triangulo(Point a, Point b, Point c);  /* triángulo en algún punto del espacio R2 con vértices a,b,c.
Linea(Point a, Point b); /* Línea que va desde punto a a punto b. */
Incluya el método equals para cada tipo de forma.
Incluya el método clone para cada tipo de forma.


Clase TestForma
  Esta clase permitirá revisar si las implementaciones de cada forman responden a lo requerido.
Por ejemplo uno puede crear un rectángulo, luego lo muestra por consola, luego le aplica una rotación en Math.PI, lo que luego se muestra por pantalla consola debería ser lo mismo que antes.
Así se pueden aplicar algunas operaciones cuyo resultado puede ser chaqueado observando el estado posterior del objeto.
Se recomienda crear un arreglo de Formas en el cual usted puede incorporar un grupo de cada tipo, luego recorra el arreglo para trasladar todas, rotar todas, etc... Si usted hace un clone del arreglo, luego traslada las figuras en un sentido y luego hace otra traslación en sentido contrario debería poder comparar por la igualdad el arreglo clonado con el final.

Observación, para revisar su tarea, el ayudante además de correr su programa TestForma, él correrá su propio TestForma.
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 un ejemplo de Makefile. Más información sobre Makefiles.