Ejercicio obligatorio 1

Fecha de entrega: Jueves 16 de abril

Trabajo

Inicializar

Implementar una función void inicializar(size_t n, float m[n][n]); que inicialice la matriz M de la siguiente forma:

../_images/20261_ej1_identidad.png

Siendo I la identidad, por ejemplo para \(n = 5\) debe quedar:

../_images/20261_ej1_identidad5.png

Incrementar vector

Implementar una función void incrementar_vector(size_t n, float v[n], const float inc[n]); que compute \(v = v + inc\), es decir sume el vector inc en v.

Multiplicación matriz por vector

Implementar una función void multiplicar(size_t n, size_t m, float r[n], float a[n][m], const float v[m]); que resuelva \(r = A \times v\).

Transformación \(c\)

Implementar una función void transformar_c(float r[3], const float v[3], double ac); que opere \(r = M_c \times v\) siendo \(M_c\):

../_images/20261_ej1_transformarc.png

Transformación \(b\)

Implementar una función void transformar_b(float r[3], const float v[3], double ab); que opere \(r = M_b \times v\) siendo \(M_b\):

../_images/20261_ej1_transformarb.png

Aplicar vector

Implementar una función void aplicar_vector(float r[3], const float p[3]); que aplique sobre p esto:

../_images/20261_ej1_aplicar_vector.png

y devuelva r. \(M^4\) es una matriz como la incializada en el primer ejercicio.

Leer vector

Implementar una función bool leer_vector(float v[3]); que lea de stdin una línea de formato "x y z\n" donde cada valor es un número flotante que representa la coordenada de un vector de \(\mathbb R^3\). 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.

Programa

Implementar un programa que lea de stdin coordenadas de vectores en \(\mathbb R^3\) de a una por vez hasta que se termine la entrada.

Para cada coordenada debe aplicar las siguientes transformaciones, en este orden:

  • Transformar \(b\) con \(a_b = 0.3\).

  • Incrementar con el vector \(inc = (0, 0, -50)^T\).

  • Transformar \(c\) con \(a_c = 0.1\).

  • Aplicar vector.

Luego de hacer estas 4 transformaciones se deben imprimir las coordenadas \(x\), \(y\) por stdout.

Se provee una coordenada de ejemplo para verificar las cuentas intermedias de cada uno de los pasos: Para la entrada "1 2 3\n" las transformaciones intermedias son (1.841897, 2.000000, 2.570489) => (1.841897, 2.000000, -47.429512) => (1.633029, 2.173891, -47.429512) => (0.034431, 0.045834, -1.000000), por lo que la salida será "0.034431 0.045834\n".

Prueba

Se provee el siguiente archivo entrada_20261_ej1.csv.gz que contiene cerca de 8500 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/20261_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.