From e89fb7b93fd5f1042f05107e51fea85f51499668 Mon Sep 17 00:00:00 2001 From: Nao Pross Date: Sun, 9 Dec 2018 19:51:20 +0100 Subject: Add vector example documentation --- vector/vector.c | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ vector/vector.md | 16 +++++++-- vector/vectors.c | 107 ------------------------------------------------------- 3 files changed, 120 insertions(+), 110 deletions(-) create mode 100644 vector/vector.c delete mode 100644 vector/vectors.c diff --git a/vector/vector.c b/vector/vector.c new file mode 100644 index 0000000..c8a5906 --- /dev/null +++ b/vector/vector.c @@ -0,0 +1,107 @@ +#include +#include + +struct vec3 { + double x; + double y; + double z; +}; + +struct vec3 vec3_add(struct vec3 * const v, struct vec3 * const u) +{ + struct vec3 result = {0, 0, 0}; + + if (v == NULL || u == NULL) + return result; + + result.x = v->x + u->x; + result.y = v->y + u->y; + result.z = v->z + u->z; + + return result; +} + +struct vec3 vec3_mul(struct vec3 * const v, const double scalar) +{ + struct vec3 result = {0, 0, 0}; + + if (v == NULL) + return result; + + result.x = scalar * v->x; + result.y = scalar * v->y; + result.z = scalar * v->z; + + return result; +} + +struct vec3 vec3_sub(struct vec3 * const v, struct vec3 * const u) +{ + struct vec3 result = {0, 0, 0}; + + result = vec3_mul(u, -1.0); + result = vec3_add(v, &result); + + return result; +} + +double vec3_dot(struct vec3 * const v, struct vec3 * const u) +{ + if (v == NULL || u == NULL) + return 0; + + return (v->x * u->x) + (v->y * u->y) + (v->z * u->y); +} + +struct vec3 vec3_cross(struct vec3 * const v, struct vec3 * const u) +{ + struct vec3 result = {0, 0, 0}; + + result.x = (v->y * u->z) - (v->z * u->y); + result.y = (v->z * u->x) - (v->x * u->z); + result.z = (v->x * u->y) - (v->y * u->x); + + return result; +} + +void vec3_print(struct vec3 * const v) +{ + if (v == NULL) + return; + + printf("<%.2f,%.2f,%.2f>\n", v->x, v->y, v->y); +} + + +int main(int argc, char *argv[]) +{ + struct vec3 a = {1, 2, 3}; + struct vec3 b = {4, 5, 6}; + struct vec3 res; + + printf("a = "); + vec3_print(&a); + printf("b = "); + vec3_print(&b); + + printf("sum a + b : "); + res = vec3_add(&a, &b); + vec3_print(&res); + + printf("sub a - b : "); + res = vec3_sub(&a, &b); + vec3_print(&res); + + printf("product 3*a : "); + res = vec3_mul(&a, 3); + vec3_print(&res); + + printf("dot product : "); + printf("%.2f\n", vec3_dot(&a, &b)); + + printf("cross product : "); + res = vec3_cross(&a, &b); + vec3_print(&res); + + return 0; +} diff --git a/vector/vector.md b/vector/vector.md index c7c1b11..abbc0f9 100644 --- a/vector/vector.md +++ b/vector/vector.md @@ -4,12 +4,11 @@ date: 9 Dicembre 2018 author: - Naoki Pross papersize: a4 -fontfamily: cmbright --- # Premessa Si da per assunto che si ha delle conscenze di C di funzioni, strutture dati e -puntatori e si vuole imparare il C++. +puntatori e si vuole imparare il C++11. L'obiettivo è di ottenere una libreria di vettori matematici con le operazioni vettoriali di somma, sottrazione, prodotto con scalare, scalare e vettoriale. @@ -19,4 +18,15 @@ Sarà inoltre utilizzata la terminologia inglese di *dot product* per il prodotto scalare e *cross product* per il prodotto vettoriale. # Un implementazione in C -Per introd +Per introdurre il concetto, a seguire vi è un esempio di un implementazione +semplice in C. +```{.C include=vector.c startLine=1 endLine=73} +``` +Per alcune applicazioni ciò è assolutamente sufficiente, ma osserviamo alcune +limitazioni: + +- `vec3` contiene solo informazioni di tipo `double` +- Si possono creare dei `vec3` non inzializzati +- La notazione delle operazioni è scomoda. + Per esempio $\vec{v} \cdot 3 \cdot \vec{u}$ diventa + `vec3_dot(&v, &vec3_mul(&u, 3));` diff --git a/vector/vectors.c b/vector/vectors.c deleted file mode 100644 index c8a5906..0000000 --- a/vector/vectors.c +++ /dev/null @@ -1,107 +0,0 @@ -#include -#include - -struct vec3 { - double x; - double y; - double z; -}; - -struct vec3 vec3_add(struct vec3 * const v, struct vec3 * const u) -{ - struct vec3 result = {0, 0, 0}; - - if (v == NULL || u == NULL) - return result; - - result.x = v->x + u->x; - result.y = v->y + u->y; - result.z = v->z + u->z; - - return result; -} - -struct vec3 vec3_mul(struct vec3 * const v, const double scalar) -{ - struct vec3 result = {0, 0, 0}; - - if (v == NULL) - return result; - - result.x = scalar * v->x; - result.y = scalar * v->y; - result.z = scalar * v->z; - - return result; -} - -struct vec3 vec3_sub(struct vec3 * const v, struct vec3 * const u) -{ - struct vec3 result = {0, 0, 0}; - - result = vec3_mul(u, -1.0); - result = vec3_add(v, &result); - - return result; -} - -double vec3_dot(struct vec3 * const v, struct vec3 * const u) -{ - if (v == NULL || u == NULL) - return 0; - - return (v->x * u->x) + (v->y * u->y) + (v->z * u->y); -} - -struct vec3 vec3_cross(struct vec3 * const v, struct vec3 * const u) -{ - struct vec3 result = {0, 0, 0}; - - result.x = (v->y * u->z) - (v->z * u->y); - result.y = (v->z * u->x) - (v->x * u->z); - result.z = (v->x * u->y) - (v->y * u->x); - - return result; -} - -void vec3_print(struct vec3 * const v) -{ - if (v == NULL) - return; - - printf("<%.2f,%.2f,%.2f>\n", v->x, v->y, v->y); -} - - -int main(int argc, char *argv[]) -{ - struct vec3 a = {1, 2, 3}; - struct vec3 b = {4, 5, 6}; - struct vec3 res; - - printf("a = "); - vec3_print(&a); - printf("b = "); - vec3_print(&b); - - printf("sum a + b : "); - res = vec3_add(&a, &b); - vec3_print(&res); - - printf("sub a - b : "); - res = vec3_sub(&a, &b); - vec3_print(&res); - - printf("product 3*a : "); - res = vec3_mul(&a, 3); - vec3_print(&res); - - printf("dot product : "); - printf("%.2f\n", vec3_dot(&a, &b)); - - printf("cross product : "); - res = vec3_cross(&a, &b); - vec3_print(&res); - - return 0; -} -- cgit v1.2.1