summaryrefslogtreecommitdiffstats
path: root/vector
diff options
context:
space:
mode:
Diffstat (limited to 'vector')
-rw-r--r--vector/makefile25
-rw-r--r--vector/vector.c114
-rw-r--r--vector/vector.cpp175
-rw-r--r--vector/vector.md32
4 files changed, 0 insertions, 346 deletions
diff --git a/vector/makefile b/vector/makefile
deleted file mode 100644
index 31136ea..0000000
--- a/vector/makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-CC := gcc
-CARGS := -Wall -Werror -I.
-LDARGS := -lm
-
-CPPC := g++-8
-CPPARGS := -Wall -I. -std=c++17
-
-all: vector.pdf c_build/vector cpp_build/vector
-
-%.pdf: %.md
- pandoc \
- --from=markdown+raw_tex \
- --latex-engine=xelatex \
- --number-sections \
- --filter pandoc-include-code \
- --highlight-style tango \
- $< -o $@
-
-c_build/%: %.c
- mkdir -p c_build
- $(CC) $(CARGS) $< -o $@ $(LDARGS)
-
-cpp_build/%: %.cpp
- mkdir -p cpp_build
- $(CPPC) $(CPPARGS) $< -o $@
diff --git a/vector/vector.c b/vector/vector.c
deleted file mode 100644
index 59f48cc..0000000
--- a/vector/vector.c
+++ /dev/null
@@ -1,114 +0,0 @@
-#include <stddef.h>
-#include <stdio.h>
-#include <math.h>
-
-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;
-}
-
-double vec3_mag(struct vec3 * const v) {
- return sqrt((v->x * v->x) + (v->y * v->y) + (v->z * v->z));
-}
-
-void vec3_print(struct vec3 * const v)
-{
- if (v == NULL)
- return;
-
- printf("<%.2f,%.2f,%.2f>\n", v->x, v->y, v->z);
-}
-
-
-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("||a|| = %f\n", vec3_mag(&a));
-
- 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.cpp b/vector/vector.cpp
deleted file mode 100644
index 260f08f..0000000
--- a/vector/vector.cpp
+++ /dev/null
@@ -1,175 +0,0 @@
-#include <iostream>
-
-#include <cassert>
-#include <cmath>
-
-#include <array>
-#include <algorithm>
-#include <numeric>
-#include <initializer_list>
-
-
-template<typename T, std::size_t d>
-struct basic_vec : public std::array<T, d> {
- static constexpr std::size_t dimensions = d;
-
- static constexpr T null_element = static_cast<T>(0);
- static constexpr T unit_element = static_cast<T>(1);
- static constexpr T unit_additive_inverse_element = static_cast<T>(-1);
-
- basic_vec();
- basic_vec(const std::initializer_list<T> l);
- template<std::size_t n> basic_vec(const basic_vec<T, n>& other);
-
- T length() const;
-};
-
-template<typename T, std::size_t d>
-basic_vec<T, d>::basic_vec() : std::array<T, d>() {
- this->fill(basic_vec<T,d>::null_element);
-}
-
-template<typename T, std::size_t d>
-basic_vec<T, d>::basic_vec(const std::initializer_list<T> l) {
- basic_vec();
-
- // why can't this sh*t be a constexpr with static_assert???
- assert(l.size() <= d);
- std::copy(l.begin(), l.end(), this->begin());
-}
-
-template<typename T, std::size_t d>
-template<std::size_t n>
-basic_vec<T, d>::basic_vec(const basic_vec<T, n>& other) {
- basic_vec();
-
- static_assert(d >= n);
- for (std::size_t i = 0; i < n; i++) {
- this->at(i) = other.at(i);
- }
-}
-
-template<typename T, std::size_t d>
-T basic_vec<T, d>::length() const {
- T res = basic_vec<T, d>::null_element;
- for (const T& val : *this) {
- res += val * val;
- }
-
- return res;
-}
-
-template<typename T, std::size_t d>
-basic_vec<T, d> operator+(const basic_vec<T, d>& rhs, const basic_vec<T, d>& lhs) {
- basic_vec<T, d> out;
-
- std::transform(rhs.begin(), rhs.end(), lhs.begin(), out.begin(),
- [](const T& r, const T& l) -> T {
- return r + l;
- }
- );
-
- return out;
-}
-
-template<typename T, std::size_t d>
-basic_vec<T, d> operator*(const T& rhs, const basic_vec<T, d>& lhs) {
- basic_vec<T, d> out;
-
- std::transform(lhs.begin(), lhs.end(), out.begin(),
- [rhs](const T& t) -> T {
- return t * rhs;
- });
-
- return out;
-}
-
-template<typename T, std::size_t d>
-basic_vec<T, d> operator-(const basic_vec<T, d>& rhs, const basic_vec<T, d>& lhs) {
- return rhs + basic_vec<T, d>::unit_additive_inverse_element * lhs;
-}
-
-template<typename T, std::size_t d>
-T operator*(const basic_vec<T, d>& rhs, const basic_vec<T, d>& lhs) {
- return std::inner_product(rhs.begin(), rhs.end(), lhs.begin(), 0);
-}
-
-template<typename T, std::size_t d>
-std::ostream& operator<<(std::ostream& os, const basic_vec<T, d>& v) {
- os << "<";
- for (std::size_t i = 0; i < d -1; i++) {
- os << v[i] << ", ";
- }
- os << v[d-1] << ">";
- return os;
-}
-
-
-template<typename T, std::size_t d>
-class vec: public basic_vec<T, d> {
-public:
- vec(std::initializer_list<T> l) : basic_vec<T, d>(l) {}
-
- template<std::size_t n>
- vec(const basic_vec<T, n>& other) : basic_vec<T, d>(other) {}
-};
-
-template<typename T>
-class vec3 : public basic_vec<T, 3> {
-public:
- vec3(std::initializer_list<T> l) : basic_vec<T, 3>(l) {}
-
- template<std::size_t n>
- vec3(const basic_vec<T, n>& other) : basic_vec<T, 3>(other) {}
-
- static vec3<T> cross(const vec3<T>& rhs, const vec3<T>& lhs);
-};
-
-template<typename T>
-vec3<T> vec3<T>::cross(const vec3<T>& rhs, const vec3<T>& lhs) {
- vec3<T> res;
-
- res[0] = (rhs[1] * lhs[2]) - (rhs[2] * lhs[1]);
- res[1] = (rhs[2] * lhs[0]) - (rhs[0] * lhs[2]);
- res[2] = (rhs[0] * lhs[1]) - (rhs[1] * lhs[0]);
-
- return res;
-}
-
-
-template<typename T>
-class vec2: public basic_vec<T, 2> {
-public:
- vec2(std::initializer_list<T> l) : basic_vec<T, 2>(l) {}
-
- template<std::size_t n>
- vec2(const basic_vec<T, n>& other) : basic_vec<T, 2>(other) {}
-
- T polar();
- static vec3<T> cross(const vec2<T>& rhs, const vec2<T>& lhs);
-};
-
-template<typename T>
-T vec2<T>::polar() {
- return std::atan2(this->at(0), this->at(1));
-}
-
-template<typename T>
-vec3<T> vec2<T>::cross(const vec2<T>& rhs, const vec2<T>& lhs) {
- return vec3<T>::cross(vec3<T>(rhs), vec3<T>(lhs));
-}
-
-
-int main(int argc, char *argv[]) {
- vec3<double> v{1, 2, 3};
- vec3<double> u{3, 4, 5};
-
- std::cout << v << std::endl;
- std::cout << v.length() << std::endl;
- std::cout << v + u << std::endl;
- std::cout << v - u << std::endl;
- std::cout << 2.0 * u << std::endl;
- std::cout << v * u << std::endl;
-
- return 0;
-}
diff --git a/vector/vector.md b/vector/vector.md
deleted file mode 100644
index abbc0f9..0000000
--- a/vector/vector.md
+++ /dev/null
@@ -1,32 +0,0 @@
----
-title: Costruire dei vettori matematici dal C al C++
-date: 9 Dicembre 2018
-author:
- - Naoki Pross
-papersize: a4
----
-
-# Premessa
-Si da per assunto che si ha delle conscenze di C di funzioni, strutture dati e
-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.
-Per il primo esempio i vettori saranno unicamente tridimensionali.
-
-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 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));`