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:
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.
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.
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.
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:
Entrega
- Deberá entregarse:
El código fuente del programa desarrollado.
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.