Ejercicio obligatorio 1

Fecha de entrega: Martes 15 de septiembre

Introducción

En este ejercicio trabajaremos con vectores de \(\mathbb R^2\), los cuales serán representados como un arreglo float v[2] que representará su par \((x, y)\).

Una sucesión de puntos ordenados define un polígono cerrado según la siguiente figura:

../_images/20262_ej1_poligono.png

Trabajo

Producto vectorial

Implementar una función float producto_vectorial(const float a[2], const float b[2]); que devuelva el resultado del producto entre los dos vectores.

../_images/20262_ej1_vectorial.png

Area de polígono

Implementar una función float area_poligono(float poligono[][2], size_t n); que dado un poligono de n puntos calcule y devuelva su area.

../_images/20262_ej1_area.png

Como notación utilizamos supraíndice para el índice del punto dentro del vector. Notar que el polígono es cerrado, después de poligono[n - 1] el siguiente elemento, el "de índice n" tiene que volver a ser poligono[0] que es el que cierra la figura.

Centro de masa

Implementar una función void centro_de_masa(float poligono[][2], size_t n, float cm[2]); que dado un poligono de n puntos devuelva su centro de masa cm.

../_images/20262_ej1_centro.png

Translación

Implementar una función void transladar(float poligono[][2], size_t n, const float translacion[2]); que mueva el poligono de n puntos la cantidad translacion.

Rotación

Implementar una función void rotar(float poligono[][2], size_t n, double angulo); que rote el polígono de n puntos angulo radianes con respecto al origen.

Nota

Recordar que para rotar un par de coordenadas \((x, y)\) un ángulo \(\theta\) se debe realizar la operación:

\(\begin{bmatrix}x' \\y' \\\end{bmatrix} = \begin{bmatrix}\cos \theta & -\sin \theta \\\sin \theta & \cos \theta \\\end{bmatrix}\begin{bmatrix}x \\y \\\end{bmatrix}\).

La operación puede descomponerse como:

\(x' = x \cos \theta - y \sin \theta\),

\(y' = x \sin \theta + y \cos \theta\).

Leer vector

Implementar una función bool leer_vector(float v[2]); que lea de stdin una línea de formato "x y\n" donde cada valor es un número flotante que representa la coordenada de un vector de \(\mathbb R^2\). La función debe extraer las coordenadas y guardarlas en el vector v. La función debe devolver true si puede efectuar la operación y false en caso contrario.

Nota

Si tenés dudas de cómo manejamos la entrada/salida en este curso, con qué funciones y con qué estrategias, servite mirar las diapositivas de la teórica o el apunte de la cátedra.

Vamos a considerar inválidas implementaciones que no utilicen las funciones y estrategias que utilizamos en el curso.

Nota

Es medio ridículo que haya una nota que te diga que mires las diapositivas y el apunte específicamente para esto... deberías hacerlo para todo el ejercicio.

Programa

Implementar un programa que primero lea de stdin una línea que contendrá un ángulo dado en grados.

Luego leerá coordenadas de vectores en \(\mathbb R^2\) de a una por vez hasta que se termine la entrada las cuales representarán un polígono. El polígono nunca tendrá más de 10.000 elementos.

Habiendo leído el polígono y el ángulo el programa deberá rotar el polígono con respecto a su centro de masa. Luego deberá imprimir los puntos del polígono de a un punto por línea por stdout (mismo formato que la entrada).

Se provee un ejemplo sencillo de entrada y salida:

45
1 1
2 2
1 3

Para este ejemplo el ángulo convertido en radianes es 0.785398, el área es 1.000000, el centro de masa es {1.333333 2.000000} y los puntos rotados 45º con respecto al centro de masa resultan en {{1.804738, 1.057191}, {1.804738 2.471405}, {0.390524 2.471405}}, por lo que la salida del programa será:

1.804738 1.057191
1.804738 2.471405
0.390524 2.471405

Prueba

Se provee el siguiente archivo entrada_20262_ej1.csv.gz que contiene una cantidad de grados y luego un polígono del contorno continental americano de la Argentina (es decir sin sus islas ni tampoco la Antártida) con 1700 coordenadas.

Transformar todas las coordenadas con el programa desarrollado, importar las mismas con cualquier programa que pueda graficar (planilla de cálculos, graficador, etc.)

Se deberá generar una imagen similar a la siguiente:

../_images/20262_ej1_salida.png

Entrega

Deberá entregarse:
  1. El código fuente del programa desarrollado.

  2. El gráfico con los puntos transformados con este programa en formato JPG o PNG.

El programa debe compilar correctamente con los flags:

-Wall -Werror -std=c99 -pedantic

debe ejecutarse correctamente con los flags:

-fsanitize=address -g

y validar el ejemplo dado.

La entrega se realiza a través del sistema de entregas.

El ejercicio es de entrega individual.