Ejercicio Práctico 2 Enunciado

Texto completo

(1)

Fundamentos de Programación – Grupo 15 – Samuel Martín

Ejercicio Práctico 2 – Enunciado

Instrucciones generales

El alumno deberá presentar los ejercicios planteados en este documento. Adicionalmente, se facilitarán en otro documento una serie de ejercicios previos ya resueltos que el alumno NO debe entregar (simplemente se facilitan como ejemplo de ejercicios relacionados con los conceptos que se emplean en la práctica, y sus soluciones).

Independientemente de si realizó los ejercicios previos a la práctica 1, utilice para este ejercicio las clases Punto, Circulo, Triangulo y SistemaCoordenado proporcionadas por los profesores en la página del enunciado del ejercicio. Recuerde utilizar para este ejercicio práctico exclusivamente las versiones que se facilitan con el enunciado: las versiones más antiguas de las clases auxiliares no proporcionan todas las funcionalidades necesarias para resolver este ejercicio.

Asimismo, puede utilizar las clases PruebaPoligono y GeneradorPruebasPoligono para realizar pruebas sobre su práctica. Es imprescindible que realice las pruebas que sean necesarias para asegurarse de que su práctica funciona adecuadamente.

Todos los resultados deben estar adecuadamente documentados mediante javadoc; asimismo, el código debe estar adecuadamente organizado, y comentado cuando sea necesario. La ausencia de estos aspectos limita al 50% la nota de la práctica.

El otro factor de evaluación es la correcta funcionalidad del resultado. Los ejercicios deberán resolverse mediante los algoritmos indicados en cada punto, aunque puedan existir otros métodos para resolver algunos de ellos. En caso de no hacerlo de esta manera, la calificación se verá penalizada. Asimismo, se considerarán errores graves en esta práctica repetir todos aquellos que se hayan indicado ya en las correcciones de la práctica anterior. Recuerde que los métodos que realice deben tener la signatura que se indica en el

enunciado del ejercicio (por supuesto, puede añadir otros métodos privados a sus clases si su solución lo necesitara, pero la evaluación siempre se llevará a cabo invocando los métodos aquí pedidos). Preste atención a utilizar los mismos nombres, con las

correspondientes mayúsculas y minúsculas. Asimismo, en la página del enunciado se facilita un enlace a la documentación de la solución creada por el profesor, en donde puede conocer más información sobre lo que debe hacer cada método, así como la documentación de las clases auxiliares.

La puntuación de los distintos ejercicios se indica respectivamente al principio de cada uno. La fecha límite de entrega del ejercicio es el 14/11/2009 16/11/2009 18/11/2009 para puntuar sobre 10, el 18/11/2009 20/11/2009 22/11/2009 sobre 8 y el 21/11/2009

23/11/2009 25/11/2009 sobre 5. Todos los límites se refieren a las 23:59:59 CET del día correspondiente.

(2)

La entrega se efectuará enviando el ejercicio a la dirección samuelm@dit.upm.es . El alumno deberá entregar los ficheros PoligonoL.java y PoligonoA.java adecuadamente completados y documentados.

Introducción

Una línea poligonal es una figura plana delimitada por una lista de segmentos no alineados y consecutivos, es decir, donde el extremo final de un segmento coincide con el extremo inicial del siguiente. Cuando, además, el extremo final del último segmento coincide con el extremo inicial del primer segmento, la línea poligonal queda cerrada y delimita en su interior una figura plana denominada polígono. Los segmentos que delimitan el polígono se denominan lados del polígono y los extremos de dichos segmentos se denominan vértices. Si ningún lado corta a otro, diremos que el polígono es simple. Además, si todos los ángulos internos del polígono son menores de 180º, diremos que el polígono es simple convexo. En estos ejercicios, supondremos que tratamos exclusivamente polígonos simples

convexos (v. fig. 1).

Figura 1. Ejemplos de polígonos: el polígono de la izquierda es un polígono simple convexo (como los que se usarán en el ejercicio práctico); el resto no lo son.

En los enunciados de los ejercicios, llamaremos n al número de vértices (y de lados) del polígono. Los vértices del polígono quedarán identificados como v0,v1, …, vn-1.

Análogamente, los lados quedarán identificados como l0, l1, … , ln-1, siendo l0 el lado que

une los vértices v0 y v1, y así sucesivamente (v. fig. 2).

(3)

Ejercicio 1

[1,5 puntos]

Se pide crear una clase PoligonoA para representan polígonos en el plano, empleando arrays para su implementación, y reutilizando la clase Punto facilitada. La clase PoligonoA deberá contar con:

• Un campo privado Punto[] vertices que representará los vértices del polígono de manera ordenada.

• Un constructor que permita construir un polígono a partir de un array de puntos dados ( public PoligonoA( Punto[] puntos) ) que representan los vértices del polígono.

• Un constructor que permita construir un polígono a partir de una lista de puntos dados ( public PoligonoA ( ArrayList<Punto> puntos ) ). Note que no se

trata de crear otra clase, sino otro constructor para la misma clase PoligonoA, cuya implementación debe estar basada en el uso de un campo de tipo Punto[].

• Un método accesor (getter) para obtener el array de vértices ( public Punto[] getVertices() ).

• Un método accesor (getter) para obtener cada uno de los vértices, identificado por su posición ( public Punto getVertice(int i) ).

Respecto a los constructores, deberá copiar manualmente cada uno de los elementos del contenido de la lista o el array que se pasa como parámetro al contenido del campo que utilice (es decir, no sirve almacenar directamente la referencia al array que recibe como parámetro).

Ejercicio 2

[1,5 puntos]

Modifique la clase PoligonoA realizada en el ejercicio anterior, e incluya:

• Un método que permita conocer el número de lados del polígono (public int getNLados() )

• Un método que permita conocer la longitud del lado i-ésimo del polígono ( public double getLongitud(int i) ).

• Un método public double[] getLongitudes() que permita conocer las longitudes de todos los lados del polígono.

• Un método public double getPerimetro() que permita conocer el perímetro de un polígono.

(4)

Ejercicio 3

[1,5 puntos]

Se facilita para este ejercicio una clase SistemaCoordenado, ya utilizada en el Ejercicio Práctico 1, que crea una ventana con unos ejes coordenados y permite dibujar distintos elementos gráficos en ella (v. fig. 3). Añada a la clase PoligonoA un método public void pinta(SistemaCoordenado sc) que pinte un polígono en un SistemaCoordenado dado.

(5)

Ejercicio 4

[2,5 puntos]

Añada a la clase PoligonoA un método public double getArea() que permita conocer la superficie de un polígono. El algoritmo que se debe emplear para calcular el área es el que se describe a continuación, que consiste en descomponer el polígono en una serie de triángulos y calcular el área del polígono como la suma de las áreas de los triángulos (v. fig. 4).

1. Tome un triángulo formado por el vértice v0 y otros dos vértices consecutivos

entre sí (y distintos de v0), por ejemplo, vi y vi+1 .

2. Calcule el área de dicho triángulo.

3. Vaya sumando las áreas de todos los triángulos de este tipo (Ti v0, vi, vi+1)

hasta haber recorrido todos los vértices del polígono (es decir, empezando por el triángulo T1 v0, v1, v2 hasta llegar al triángulo Tn-2 v0, vn-2, vn-1).

4. La suma final de todas las áreas de los Ti será el valor del área del polígono.

V

0

V

1

V

3 l0

V

2 l1

T

1

V

0

V

1

V

3 l0 l1

V

0

V

i li

T

2

V

2

T

i

V

i+1 l2 l2

V

0

V

1

V

... l0

V

2 l1 l...

V

n-2 ln-2 ln-1

T

n-2

V

n-1

V

0

V

1

V

... l0

V

2 l1 l...

V

n-2

V

n-1 ln-2 ln-1

( )

=

=

2

1

)

(

n

i

i

T

A

P

A

...

...

Figura 4. Método de cálculo del área de un polígono convexo por triangulación. Se muestran el primer y segundo triángulos, un triángulo i-ésimo cualquiera, y el último triángulo (n-2). Finalmente se muestra el área del polígono como agregación del área de los triángulos.

(6)

Ejercicio 5

[3 puntos]

Se pide crear una nueva clase PoligonoL para representar polígonos en el plano, pero esta vez empleando listas para su implementación. La clase PoligonoL contará con los mismos métodos que los realizados para la clase PoligonoA en los ejercicios 1, 2 y 3, pero

reemplazando el uso de arrays por listas en donde sea posible, es decir: • private ArrayList<Punto> vertices

• public PoligonoL( ArrayList<Punto> puntos) • public PoligonoL( Punto[] puntos)

• public ArrayList<Punto> getVertices() • public Punto getVertice(int i)

• public int getNLados()

• public double getLongitud(int i) • public double[] getLongitudes() • public double getPerimetro()

Figure

Actualización...

Referencias

Actualización...

Related subjects :